diff --git a/src/app.ts b/src/app.ts index 025453f4..03fa5bd2 100644 --- a/src/app.ts +++ b/src/app.ts @@ -39,6 +39,15 @@ app.use("/stats", statsRouter); app.post("/test", async (req, _res) => { console.log("test hit", req.body); const newLoadout = new Loadout({}); + newLoadout.NORMAL.push({ + _id: "000000000000000000000000", + Favorite: false, + PresetIcon: "", + s: { ItemId: { $oid: "000000000000000000000000" }, mod: 0, cus: 0 }, + p: { ItemId: { $oid: "000000000000000000000000" }, mod: 0, cus: 0 }, + l: { ItemId: { $oid: "000000000000000000000000" }, mod: 0, cus: 0 }, + m: { ItemId: { $oid: "000000000000000000000000" }, mod: 0, cus: 0 } + }); await newLoadout.save(); _res.end(); }); diff --git a/src/controllers/api/saveLoadout.ts b/src/controllers/api/saveLoadout.ts index 842f2c77..0f029472 100644 --- a/src/controllers/api/saveLoadout.ts +++ b/src/controllers/api/saveLoadout.ts @@ -4,17 +4,24 @@ import util from "util"; import { EquipmentCategories, IConfigEntry, - ILoadout, + ILoadoutRequest, ILoadoutKey, ISaveLoadoutRequest, - ISaveLoadoutRequestNoUpgradeVer + ISaveLoadoutRequestNoUpgradeVer, + ILoadoutConfigDatabase } from "@/src/types/saveLoadoutTypes"; +import { LoadoutModel } from "@/src/models/inventoryModels/loadoutModel"; +import { Types } from "mongoose"; export const isEmptyObject = (obj: unknown): boolean => { return Boolean(obj && Object.keys(obj).length === 0 && obj.constructor === Object); }; -export const handleInventoryItemConfigChange = (equipmentChanges: ISaveLoadoutRequestNoUpgradeVer) => { +//setup default items on account creation or like originally in giveStartingItems.php + +//export const updateLoadout = (loadout: ISaveLoadoutRequest, accountId: string) => {}; + +export const handleInventoryItemConfigChange = async (equipmentChanges: ISaveLoadoutRequestNoUpgradeVer) => { for (const [_equipmentName, _equipment] of Object.entries(equipmentChanges)) { const equipment = _equipment as ISaveLoadoutRequestNoUpgradeVer[keyof ISaveLoadoutRequestNoUpgradeVer]; const equipmentName = _equipmentName as keyof ISaveLoadoutRequestNoUpgradeVer; @@ -28,23 +35,59 @@ export const handleInventoryItemConfigChange = (equipmentChanges: ISaveLoadoutRe case "LoadOuts": { console.log("loadout received"); - for (const [_loadoutName, _loadout] of Object.entries(equipment)) { + for (const [_loadoutSlot, _loadout] of Object.entries(equipment)) { + const loadoutSlot = _loadoutSlot as keyof ILoadoutRequest; const loadout = _loadout as ILoadoutKey; - const loadoutName = _loadoutName as keyof ILoadout; - console.log(_loadoutName, loadout); + //console.log("key", loadoutSlot, "value", loadout); if (isEmptyObject(loadout)) { continue; } // all non-empty entries are one loadout slot - for (const [_loadoutId, _loadoutConfig] of Object.entries(loadout)) { - console.log(loadout[_loadoutId].s); + for (const [loadoutId, loadoutConfig] of Object.entries(loadout)) { + // console.log("loadoutId", loadoutId, "loadoutconfig", loadoutConfig); + const loadout = await LoadoutModel.findById("656a184a9cefa0e5627689af"); + if (!loadout) { + throw new Error("loadout not found"); + } + + const oldLoadoutConfig = loadout[loadoutSlot].find( + loadout => loadout._id.toString() === loadoutId + ); + + // if no config with this id exists, create a new one + if (!oldLoadoutConfig) { + const { ItemId, ...loadoutConfigItemIdRemoved } = loadoutConfig; + loadout[loadoutSlot].push({ + _id: ItemId.$oid, + ...loadoutConfigItemIdRemoved + }); + await loadout.save(); + continue; + } + + const loadoutIndex = loadout[loadoutSlot].indexOf(oldLoadoutConfig); + + if (loadoutIndex === undefined || loadoutIndex === -1) { + throw new Error("loadout index not found"); + } + + //console.log("parent id", oldLoadoutConfig.ownerDocument()._id); + loadout[loadoutSlot][loadoutIndex].set(loadoutConfig); + //loadout.NORMAL[loadoutIndex].overwrite(loadoutConfig); + //console.log("db", loadout[loadoutSlot][loadoutIndex].schema); + + await loadout.save(); + //({ _id: loadoutId }, loadoutConfig); } } break; } case "LongGuns": { + console.log("longgun received"); + console.log(equipmentName, equipment); + const longGun = equipment as IConfigEntry; // longGun["key"].PvpUpgrades; break; diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index b1ae88bd..f39eb97f 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -152,7 +152,10 @@ suitConfigSchema.set("toJSON", { const suitSchema = new Schema({ ItemType: String, - Configs: [suitConfigSchema], + Configs: { + type: [suitConfigSchema], + default: [{}, {}, {}] + }, UpgradeVer: Number, XP: Number, InfestationDate: Date, diff --git a/src/models/inventoryModels/loadoutModel.ts b/src/models/inventoryModels/loadoutModel.ts index 31c6eb3d..3cf647bd 100644 --- a/src/models/inventoryModels/loadoutModel.ts +++ b/src/models/inventoryModels/loadoutModel.ts @@ -1,67 +1,43 @@ import { IOid } from "@/src/types/commonTypes"; -import { ILoadout, ILoadoutConfig, ILoadoutConfigDocument, ILoadoutDatabase, M } from "@/src/types/saveLoadoutTypes"; +import { ILoadoutConfigDatabase, ILoadoutDatabase, IEquipmentSelection } from "@/src/types/saveLoadoutTypes"; import { Model, Schema, Types, model } from "mongoose"; -//create a schema for the $oid type -const oidSchema = new Schema({ - $oid: String -}); +const oidSchema = new Schema( + { + $oid: String + }, + { + _id: false + } +); //create a mongoose schema based on interface M -const modSchema = new Schema({ - ItemId: { - type: oidSchema, - default: { $oid: "000000000000000000000000" } +const EquipmentSelectionSchema = new Schema( + { + ItemId: { + type: oidSchema, + default: { $oid: "000000000000000000000000" } + }, + mod: Number, + cus: Number }, - mod: Number, - cus: Number + { + _id: false + } +); + +const loadoutConfigSchema = new Schema({ + PresetIcon: String, + Favorite: Boolean, + s: EquipmentSelectionSchema, + p: EquipmentSelectionSchema, + l: EquipmentSelectionSchema, + m: EquipmentSelectionSchema }); -//default initialization for -const loadoutConfigSchema = new Schema( - { - PresetIcon: String, - Favorite: Boolean, - s: {}, - p: {}, - l: {}, - m: {} - }, - { - virtuals: { - ItemId: { - get() { - return this._id.toString(); - } - } - } - } -); - -interface User { - firstName: string; - lastName: string; -} - -const UserSchema = new Schema( - { - firstName: String, - lastName: String - }, - { - virtuals: { - fullname: { - get() { - return `${this.firstName} ${this.lastName}`; - } - } - } - } -); - -// loadoutConfigSchema.virtual("ItemId").get(function (): string { -// return this._id -// }); +loadoutConfigSchema.virtual("ItemId").get(function (): string { + return this._id.toString(); +}); loadoutConfigSchema.set("toJSON", { virtuals: true, @@ -85,19 +61,31 @@ const loadoutSchema = new Schema({ DRIFTER: [loadoutConfigSchema] }); +loadoutSchema.virtual("ItemId").get(function (): string { + return this._id.toString(); +}); + +loadoutSchema.set("toJSON", { + virtuals: true, + transform(_doc, ret, _options) { + delete ret._id; + delete ret.__v; + } +}); + //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; + 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; }; type loadoutModelType = Model; diff --git a/src/types/saveLoadoutTypes.ts b/src/types/saveLoadoutTypes.ts index b834f0a1..38a9b8e3 100644 --- a/src/types/saveLoadoutTypes.ts +++ b/src/types/saveLoadoutTypes.ts @@ -1,8 +1,8 @@ import { IOid } from "@/src/types/commonTypes"; -import { Document, Mongoose } from "mongoose"; +import { Document, Mongoose, Types } from "mongoose"; export interface ISaveLoadoutRequest { - LoadOuts: ILoadout; + LoadOuts: ILoadoutRequest; LongGuns: IConfigEntry; OperatorAmps: IConfigEntry; Pistols: IConfigEntry; @@ -36,51 +36,46 @@ export interface IConfigEntry { [key: string]: Config; } -export interface ILoadout { - NORMAL: ILoadoutKey; - SENTINEL: ILoadoutKey; - ARCHWING: ILoadoutKey; - NORMAL_PVP: ILoadoutKey; - LUNARO: ILoadoutKey; - OPERATOR: ILoadoutKey; - KDRIVE: ILoadoutKey; - DATAKNIFE: ILoadoutKey; - MECH: ILoadoutKey; - OPERATOR_ADULT: ILoadoutKey; - DRIFTER: ILoadoutKey; +export interface ILoadoutRequest extends Omit {} + +export interface ILoadoutResponse extends ILoadoutDatabase { + ItemId: IOid; } export interface ILoadoutDatabase { - NORMAL: ILoadoutConfig; - SENTINEL: ILoadoutConfig; - ARCHWING: ILoadoutConfig; - NORMAL_PVP: ILoadoutConfig; - LUNARO: ILoadoutConfig; - OPERATOR: ILoadoutConfig; - KDRIVE: ILoadoutConfig; - DATAKNIFE: ILoadoutConfig; - MECH: ILoadoutConfig; - OPERATOR_ADULT: ILoadoutConfig; - DRIFTER: ILoadoutConfig; + NORMAL: ILoadoutConfigDatabase; + SENTINEL: ILoadoutConfigDatabase; + ARCHWING: ILoadoutConfigDatabase; + NORMAL_PVP: ILoadoutConfigDatabase; + LUNARO: ILoadoutConfigDatabase; + OPERATOR: ILoadoutConfigDatabase; + KDRIVE: ILoadoutConfigDatabase; + DATAKNIFE: ILoadoutConfigDatabase; + MECH: ILoadoutConfigDatabase; + OPERATOR_ADULT: ILoadoutConfigDatabase; + DRIFTER: ILoadoutConfigDatabase; } export interface ILoadoutKey { - [key: string]: ILoadoutConfig; + [key: string]: ILoadoutConfigClient; } -export type ILoadoutConfigDocument = ILoadoutConfig & Document; - -export interface ILoadoutConfig { +// for request and response from and to client +export interface ILoadoutConfigClient { ItemId: IOid; PresetIcon: string; Favorite: boolean; - s: M; - p: M; - l: M; - m: M; + s: IEquipmentSelection; + p: IEquipmentSelection; + l: IEquipmentSelection; + m: IEquipmentSelection; } -export interface M { +export interface ILoadoutConfigDatabase extends Omit { + _id: Types.ObjectId; +} + +export interface IEquipmentSelection { ItemId: IOid; mod: number; cus: number; @@ -129,7 +124,7 @@ export interface Col { } export type EquipmentCategories = - | { LoadOuts: { [key in keyof ILoadout]: LoadOut } } + | { LoadOuts: { [key in keyof ILoadoutRequest]: LoadOut } } | { LongGuns: Config } | { OperatorAmps: Config } // Replace 'any' with the actual type | { Pistols: Config } // Replace 'any' with the actual type