From b41ce3751c9d47c3faaa19ab8d13a5349b3563c5 Mon Sep 17 00:00:00 2001 From: Sainan Date: Sun, 19 Jan 2025 12:33:04 +0100 Subject: [PATCH] initial importService for Suits array --- src/controllers/custom/importController.ts | 19 +++++++ src/routes/custom.ts | 2 + src/services/importService.ts | 50 +++++++++++++++++++ .../inventoryTypes/commonInventoryTypes.ts | 9 ++-- src/types/inventoryTypes/inventoryTypes.ts | 7 ++- 5 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 src/controllers/custom/importController.ts create mode 100644 src/services/importService.ts diff --git a/src/controllers/custom/importController.ts b/src/controllers/custom/importController.ts new file mode 100644 index 00000000..3730472b --- /dev/null +++ b/src/controllers/custom/importController.ts @@ -0,0 +1,19 @@ +import { importInventory } from "@/src/services/importService"; +import { getInventory } from "@/src/services/inventoryService"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { IInventoryResponse } from "@/src/types/inventoryTypes/inventoryTypes"; +import { RequestHandler } from "express"; + +export const importController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const inventory = await getInventory(accountId); + const request = JSON.parse(String(req.body)) as IImportRequest; + importInventory(inventory, request.inventory, request.replace, request.update); + res.json(await inventory.save()); +}; + +interface IImportRequest { + inventory: IInventoryResponse; + replace: boolean; + update: boolean; +} diff --git a/src/routes/custom.ts b/src/routes/custom.ts index e4299412..3772362c 100644 --- a/src/routes/custom.ts +++ b/src/routes/custom.ts @@ -9,6 +9,7 @@ import { renameAccountController } from "@/src/controllers/custom/renameAccountC import { createAccountController } from "@/src/controllers/custom/createAccountController"; import { addItemsController } from "@/src/controllers/custom/addItemsController"; +import { importController } from "@/src/controllers/custom/importController"; import { getConfigDataController } from "@/src/controllers/custom/getConfigDataController"; import { updateConfigDataController } from "@/src/controllers/custom/updateConfigDataController"; @@ -24,6 +25,7 @@ customRouter.get("/renameAccount", renameAccountController); customRouter.post("/createAccount", createAccountController); customRouter.post("/addItems", addItemsController); +customRouter.post("/import", importController); customRouter.get("/config", getConfigDataController); customRouter.post("/config", updateConfigDataController); diff --git a/src/services/importService.ts b/src/services/importService.ts new file mode 100644 index 00000000..d2f5f1ac --- /dev/null +++ b/src/services/importService.ts @@ -0,0 +1,50 @@ +import { Types } from "mongoose"; +import { IEquipmentClient, IEquipmentDatabase } from "../types/inventoryTypes/commonInventoryTypes"; +import { IMongoDate } from "../types/commonTypes"; +import { IInventoryResponse } from "../types/inventoryTypes/inventoryTypes"; +import { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel"; + +const importDate = (value: IMongoDate): Date => { + return new Date(parseInt(value.$date.$numberLong)); +}; + +const importOptionalDate = (value: IMongoDate | undefined): Date | undefined => { + return value ? importDate(value) : undefined; +}; + +const importEquipment = (client: IEquipmentClient): IEquipmentDatabase => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { ItemId, ...rest } = client; + return { + ...rest, + _id: new Types.ObjectId(client.ItemId.$oid), + InfestationDate: importOptionalDate(client.InfestationDate), + Expiry: importOptionalDate(client.Expiry), + UpgradesExpiry: importOptionalDate(client.UpgradesExpiry) + }; +}; + +export const importInventory = ( + db: TInventoryDatabaseDocument, + client: IInventoryResponse, + replace: boolean = false, + update: boolean = true +): void => { + const clientSuitsInDbFormat = client.Suits.map(x => importEquipment(x)); + if (replace) { + db.Suits.splice(0, db.Suits.length); + } + clientSuitsInDbFormat.forEach(suitToImport => { + if (update) { + const index = db.Suits.findIndex(x => x._id == suitToImport._id); + if (index != -1) { + db.Suits.splice(index, 1); + } + } else { + if (db.Suits.id(suitToImport._id)) { + return; + } + } + db.Suits.push(suitToImport); + }); +}; diff --git a/src/types/inventoryTypes/commonInventoryTypes.ts b/src/types/inventoryTypes/commonInventoryTypes.ts index ccc5851e..e1603816 100644 --- a/src/types/inventoryTypes/commonInventoryTypes.ts +++ b/src/types/inventoryTypes/commonInventoryTypes.ts @@ -78,8 +78,11 @@ export interface IEquipmentSelection { hide?: boolean; } -export interface IEquipmentClient extends Omit { +export interface IEquipmentClient + extends Omit { ItemId: IOid; + InfestationDate?: IMongoDate; + Expiry?: IMongoDate; UpgradesExpiry?: IMongoDate; } @@ -106,12 +109,12 @@ export interface IEquipmentDatabase { CustomizationSlotPurchases?: number; UpgradeType?: string; UpgradeFingerprint?: string; - InfestationDate?: IMongoDate; + InfestationDate?: Date; InfestationDays?: number; InfestationType?: string; ModularParts?: string[]; UnlockLevel?: number; - Expiry?: IMongoDate; + Expiry?: Date; SkillTree?: string; OffensiveUpgrade?: string; DefensiveUpgrade?: string; diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 3710ca2b..8fcc8b27 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -7,7 +7,8 @@ import { IItemConfig, IOperatorConfigClient, IEquipmentSelection, - IEquipmentDatabase + IEquipmentDatabase, + IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes"; export interface IInventoryDatabase @@ -23,6 +24,7 @@ export interface IInventoryDatabase | "BlessingCooldown" | "Ships" | "WeaponSkins" + | "Suits" > { accountOwnerId: Types.ObjectId; Created: Date; @@ -35,6 +37,7 @@ export interface IInventoryDatabase BlessingCooldown: Date; Ships: Types.ObjectId[]; WeaponSkins: IWeaponSkinDatabase[]; + Suits: IEquipmentDatabase[]; } export interface IQuestKeyDatabase { @@ -163,7 +166,7 @@ export interface IInventoryResponse extends IDailyAffiliations { ChallengeProgress: IChallengeProgress[]; RawUpgrades: IRawUpgrade[]; ReceivedStartingGear: boolean; - Suits: IEquipmentDatabase[]; + Suits: IEquipmentClient[]; LongGuns: IEquipmentDatabase[]; Pistols: IEquipmentDatabase[]; Melee: IEquipmentDatabase[];