From 0a6a76c8f555ced8a4f1edc55f6a406700174e47 Mon Sep 17 00:00:00 2001 From: Ordis <134585663+OrdisPrime@users.noreply.github.com> Date: Wed, 29 Nov 2023 15:45:02 +0100 Subject: [PATCH] mongoose is great --- package-lock.json | 110 +++++++----------- package.json | 2 +- src/app.ts | 9 ++ src/controllers/api/inventoryController.ts | 7 +- src/controllers/api/saveLoadout.ts | 31 ++--- .../api/trainingResultController.ts | 2 +- .../{ => inventoryModels}/inventoryModel.ts | 8 +- src/models/inventoryModels/loadoutModel.ts | 105 +++++++++++++++++ src/services/inventoryService.ts | 2 +- src/services/saveLoadoutService.ts | 0 src/types/saveLoadoutTypes.ts | 23 +++- 11 files changed, 204 insertions(+), 95 deletions(-) rename src/models/{ => inventoryModels}/inventoryModel.ts (97%) create mode 100644 src/models/inventoryModels/loadoutModel.ts create mode 100644 src/services/saveLoadoutService.ts diff --git a/package-lock.json b/package-lock.json index b3e60e77..fdd59437 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "dotenv": "^16.1.3", "express": "^5.0.0-beta.1", - "mongoose": "^7.4.1", + "mongoose": "^8.0.2", "warframe-items": "1.1260.121" }, "devDependencies": { @@ -214,6 +214,14 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", + "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -419,9 +427,9 @@ "dev": true }, "node_modules/@types/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" }, "node_modules/@types/whatwg-url": { "version": "8.2.2", @@ -1140,11 +1148,11 @@ } }, "node_modules/bson": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.4.0.tgz", - "integrity": "sha512-WRZ5SQI5GfUuKnPTNmAYPiKIof3ORXAF4IRU5UcgmivNIon01rWQlw5RUH954dpu8yGL8T59YShVddIPaU/gFA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", + "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", "engines": { - "node": ">=14.20.1" + "node": ">=16.20.1" } }, "node_modules/buffer-from": { @@ -2136,11 +2144,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2397,8 +2400,7 @@ "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" }, "node_modules/merge-descriptors": { "version": "1.0.1", @@ -2506,26 +2508,25 @@ } }, "node_modules/mongodb": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.7.0.tgz", - "integrity": "sha512-zm82Bq33QbqtxDf58fLWBwTjARK3NSvKYjyz997KSy6hpat0prjeX/kxjbPVyZY60XYPDNETaHkHJI2UCzSLuw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz", + "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==", "dependencies": { - "bson": "^5.4.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.2.0", + "mongodb-connection-string-url": "^2.6.0" }, "engines": { - "node": ">=14.20.1" - }, - "optionalDependencies": { - "saslprep": "^1.0.3" + "node": ">=16.20.1" }, "peerDependencies": { - "@aws-sdk/credential-providers": "^3.201.0", + "@aws-sdk/credential-providers": "^3.188.0", "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=2.3.0 <3", - "snappy": "^7.2.2" + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" }, "peerDependenciesMeta": { "@aws-sdk/credential-providers": { @@ -2534,6 +2535,9 @@ "@mongodb-js/zstd": { "optional": true }, + "gcp-metadata": { + "optional": true + }, "kerberos": { "optional": true }, @@ -2542,6 +2546,9 @@ }, "snappy": { "optional": true + }, + "socks": { + "optional": true } } }, @@ -2555,20 +2562,20 @@ } }, "node_modules/mongoose": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.4.1.tgz", - "integrity": "sha512-o3E5KHHiHdaiwCJG3+9r70sncRKki71Ktf/TfXdW6myu+53rtZ56uLl5ylkQiCf60V3COJuOeekcxXVsjQ7cBA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.2.tgz", + "integrity": "sha512-Vsi9GzTXjdBVzheT1HZOZ2jHNzzR9Xwb5OyLz/FvDEAhlwrRnXnuqJf0QHINUOQSm7aoyvnPks0q85HJkd6yDw==", "dependencies": { - "bson": "^5.4.0", + "bson": "^6.2.0", "kareem": "2.5.1", - "mongodb": "5.7.0", + "mongodb": "6.2.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", "sift": "16.0.1" }, "engines": { - "node": ">=14.20.1" + "node": ">=16.20.1" }, "funding": { "type": "opencollective", @@ -3223,18 +3230,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -3350,28 +3345,6 @@ "node": ">=8" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3395,7 +3368,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, "dependencies": { "memory-pager": "^1.0.2" } diff --git a/package.json b/package.json index 7c971d7a..7416d812 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "dotenv": "^16.1.3", "express": "^5.0.0-beta.1", - "mongoose": "^7.4.1", + "mongoose": "^8.0.2", "warframe-items": "1.1260.121" }, "devDependencies": { diff --git a/src/app.ts b/src/app.ts index 3ca8bfc8..025453f4 100644 --- a/src/app.ts +++ b/src/app.ts @@ -14,6 +14,7 @@ import { customRouter } from "@/src/routes/custom"; import { dynamicController } from "@/src/routes/dynamic"; import { statsRouter } from "@/src/routes/stats"; import { connectDatabase } from "@/src/services/mongoService"; +import { LoadoutModel as Loadout } from "@/src/models/inventoryModels/loadoutModel"; void connectDatabase(); @@ -34,6 +35,14 @@ app.use("/:id/dynamic", dynamicController); app.post("/pay/steamPacks.php", steamPacksController); app.use("/stats", statsRouter); +// eslint-disable-next-line @typescript-eslint/no-misused-promises +app.post("/test", async (req, _res) => { + console.log("test hit", req.body); + const newLoadout = new Loadout({}); + await newLoadout.save(); + _res.end(); +}); + app.use(unknownEndpointHandler); //app.use(errorHandler) diff --git a/src/controllers/api/inventoryController.ts b/src/controllers/api/inventoryController.ts index bada9ab7..21099e1e 100644 --- a/src/controllers/api/inventoryController.ts +++ b/src/controllers/api/inventoryController.ts @@ -1,10 +1,11 @@ /* eslint-disable @typescript-eslint/no-misused-promises */ import { toInventoryResponse } from "@/src/helpers/inventoryHelpers"; -import { Inventory } from "@/src/models/inventoryModel"; +import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import { Request, RequestHandler, Response } from "express"; import config from "@/config.json"; import testMissions from "@/static/fixed_responses/testMissions.json"; import testQuestKeys from "@/static/fixed_responses/testQuestKeys.json"; +import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; const inventoryController: RequestHandler = async (request: Request, response: Response) => { const accountId = request.query.accountId; @@ -14,7 +15,9 @@ const inventoryController: RequestHandler = async (request: Request, response: R return; } - const inventory = await Inventory.findOne({ accountOwnerId: accountId }); + const inventory = await Inventory.findOne({ accountOwnerId: accountId }).populate<{ + LoadOutPresets: ILoadoutDatabase; + }>("LoadOutPresets"); if (!inventory) { response.status(400).json({ error: "inventory was undefined" }); diff --git a/src/controllers/api/saveLoadout.ts b/src/controllers/api/saveLoadout.ts index 6d21715e..842f2c77 100644 --- a/src/controllers/api/saveLoadout.ts +++ b/src/controllers/api/saveLoadout.ts @@ -1,26 +1,25 @@ -import { Inventory } from "@/src/models/inventoryModel"; +import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import { RequestHandler } from "express"; import util from "util"; import { EquipmentCategories, IConfigEntry, ILoadout, + ILoadoutKey, ISaveLoadoutRequest, ISaveLoadoutRequestNoUpgradeVer } from "@/src/types/saveLoadoutTypes"; -export const isObjectEmpty = (obj: Record) => { - return obj && Object.keys(obj).length === 0 && obj.constructor === Object; +export const isEmptyObject = (obj: unknown): boolean => { + return Boolean(obj && Object.keys(obj).length === 0 && obj.constructor === Object); }; -type EquipmentChangeEntry = IConfigEntry | ILoadout; - export const handleInventoryItemConfigChange = (equipmentChanges: ISaveLoadoutRequestNoUpgradeVer) => { for (const [_equipmentName, _equipment] of Object.entries(equipmentChanges)) { const equipment = _equipment as ISaveLoadoutRequestNoUpgradeVer[keyof ISaveLoadoutRequestNoUpgradeVer]; const equipmentName = _equipmentName as keyof ISaveLoadoutRequestNoUpgradeVer; - if (isObjectEmpty(equipment)) { + if (isEmptyObject(equipment)) { continue; } // non-empty is a change in loadout(or suit...) @@ -28,16 +27,20 @@ export const handleInventoryItemConfigChange = (equipmentChanges: ISaveLoadoutRe switch (equipmentName) { case "LoadOuts": { console.log("loadout received"); - const _loadout = equipment as unknown as ILoadout; - for (const [loadoutName, loadout] of Object.entries(_loadout)) { - console.log(loadoutName, loadout); - //const loadout = _loadout as ILoadoutEntry; + for (const [_loadoutName, _loadout] of Object.entries(equipment)) { + const loadout = _loadout as ILoadoutKey; + const loadoutName = _loadoutName as keyof ILoadout; - // console.log(loadoutName, loadout); - // if (isObjectEmpty(loadout)) { - // continue; - // } + console.log(_loadoutName, 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); + } } break; } diff --git a/src/controllers/api/trainingResultController.ts b/src/controllers/api/trainingResultController.ts index 9feffe38..db2965bf 100644 --- a/src/controllers/api/trainingResultController.ts +++ b/src/controllers/api/trainingResultController.ts @@ -1,6 +1,6 @@ import { parseString } from "@/src/helpers/general"; import { getJSONfromString } from "@/src/helpers/stringHelpers"; -import { Inventory } from "@/src/models/inventoryModel"; +import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import { getInventory } from "@/src/services/inventoryService"; import { IMongoDate } from "@/src/types/commonTypes"; import { RequestHandler } from "express"; diff --git a/src/models/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts similarity index 97% rename from src/models/inventoryModel.ts rename to src/models/inventoryModels/inventoryModel.ts index 5c753b86..b1ae88bd 100644 --- a/src/models/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -8,8 +8,8 @@ import { IInventoryResponse, IInventoryDatabaseDocument, IInventoryResponseDocument -} from "../types/inventoryTypes/inventoryTypes"; -import { IMongoDate, IOid } from "../types/commonTypes"; +} from "../../types/inventoryTypes/inventoryTypes"; +import { IMongoDate, IOid } from "../../types/commonTypes"; import { ISuitDatabase, ISuitDocument } from "@/src/types/inventoryTypes/SuitTypes"; import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes"; @@ -191,7 +191,7 @@ FlavourItemSchema.set("toJSON", { } }); -const inventorySchema = new Schema({ +const inventorySchema = new Schema({ accountOwnerId: Schema.Types.ObjectId, SubscribedToEmails: Number, Created: Schema.Types.Mixed, @@ -229,7 +229,7 @@ const inventorySchema = new Schema({ + $oid: String +}); + +//create a mongoose schema based on interface M +const modSchema = new Schema({ + ItemId: { + type: oidSchema, + default: { $oid: "000000000000000000000000" } + }, + mod: Number, + cus: Number +}); + +//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.set("toJSON", { + virtuals: true, + transform(_doc, ret, _options) { + delete ret._id; + delete ret.__v; + } +}); + +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] +}); + +//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; +}; + +type loadoutModelType = Model; + +export const LoadoutModel = model("Loadout", loadoutSchema); diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 035881bd..1edb4acf 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -1,4 +1,4 @@ -import { Inventory } from "@/src/models/inventoryModel"; +import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import new_inventory from "@/static/fixed_responses/postTutorialInventory.json"; import config from "@/config.json"; import { Types } from "mongoose"; diff --git a/src/services/saveLoadoutService.ts b/src/services/saveLoadoutService.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/types/saveLoadoutTypes.ts b/src/types/saveLoadoutTypes.ts index 4dba7f50..b834f0a1 100644 --- a/src/types/saveLoadoutTypes.ts +++ b/src/types/saveLoadoutTypes.ts @@ -1,4 +1,5 @@ import { IOid } from "@/src/types/commonTypes"; +import { Document, Mongoose } from "mongoose"; export interface ISaveLoadoutRequest { LoadOuts: ILoadout; @@ -49,11 +50,27 @@ export interface ILoadout { DRIFTER: ILoadoutKey; } -export interface ILoadoutKey { - [key: string]: ItemConfig; +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; } -export interface ItemConfig { +export interface ILoadoutKey { + [key: string]: ILoadoutConfig; +} + +export type ILoadoutConfigDocument = ILoadoutConfig & Document; + +export interface ILoadoutConfig { ItemId: IOid; PresetIcon: string; Favorite: boolean;