import { IOid } from "@/src/types/commonTypes"; import { IEquipmentSelection } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { ILoadoutConfigDatabase, ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; import { Document, Model, Schema, Types, model } from "mongoose"; const oidSchema = new Schema( { $oid: String }, { _id: false } ); //create a mongoose schema based on interface M export const EquipmentSelectionSchema = new Schema( { ItemId: oidSchema, mod: Number, cus: Number, hide: Boolean }, { _id: false } ); const loadoutConfigSchema = new Schema( { FocusSchool: String, PresetIcon: String, Favorite: Boolean, n: String, // Loadout name s: EquipmentSelectionSchema, // Suit l: EquipmentSelectionSchema, // Primary weapon p: EquipmentSelectionSchema, // Secondary weapon m: EquipmentSelectionSchema, // Melee weapon h: EquipmentSelectionSchema, // Gravimag weapon a: EquipmentSelectionSchema // Necromech exalted weapon }, { id: false } ); loadoutConfigSchema.virtual("ItemId").get(function () { return { $oid: this._id.toString() } satisfies IOid; }); loadoutConfigSchema.set("toJSON", { virtuals: true, transform(_doc, ret, _options) { delete ret._id; delete ret.__v; } }); export const loadoutSchema = new Schema({ NORMAL: [loadoutConfigSchema], SENTINEL: [loadoutConfigSchema], ARCHWING: [loadoutConfigSchema], NORMAL_PVP: [loadoutConfigSchema], LUNARO: [loadoutConfigSchema], OPERATOR: [loadoutConfigSchema], KDRIVE: [loadoutConfigSchema], DATAKNIFE: [loadoutConfigSchema], MECH: [loadoutConfigSchema], OPERATOR_ADULT: [loadoutConfigSchema], DRIFTER: [loadoutConfigSchema], loadoutOwnerId: Schema.Types.ObjectId }); loadoutSchema.set("toJSON", { transform(_doc, ret, _options) { delete ret._id; delete ret.__v; delete ret.loadoutOwnerId; } }); loadoutSchema.index({ loadoutOwnerId: 1 }, { unique: true }); //create database typefor ILoadoutConfig type loadoutDocumentProps = { NORMAL: Types.DocumentArray; SENTINEL: Types.DocumentArray; ARCHWING: Types.DocumentArray; NORMAL_PVP: Types.DocumentArray; LUNARO: Types.DocumentArray; OPERATOR: Types.DocumentArray; KDRIVE: Types.DocumentArray; DATAKNIFE: Types.DocumentArray; MECH: Types.DocumentArray; OPERATOR_ADULT: Types.DocumentArray; DRIFTER: Types.DocumentArray; }; // eslint-disable-next-line @typescript-eslint/no-empty-object-type type loadoutModelType = Model; export const Loadout = model("Loadout", loadoutSchema); // eslint-disable-next-line @typescript-eslint/no-empty-object-type export type TLoadoutDatabaseDocument = Document & Omit< ILoadoutDatabase & { _id: Types.ObjectId; } & { __v: number; }, keyof loadoutDocumentProps > & loadoutDocumentProps;