diff --git a/src/controllers/api/missionInventoryUpdateController.ts b/src/controllers/api/missionInventoryUpdateController.ts index 200f581a..3c4d4a3f 100644 --- a/src/controllers/api/missionInventoryUpdateController.ts +++ b/src/controllers/api/missionInventoryUpdateController.ts @@ -64,7 +64,6 @@ const missionInventoryUpdateController: RequestHandler = async (req, res) => { const parsedData = JSON.parse(data) as MissionInventoryUpdate; if (typeof parsedData !== "object" || parsedData === null) throw new Error("Invalid data format"); // eslint-disable-next-line @typescript-eslint/no-unused-vars - const InventoryJson = JSON.stringify(await missionInventoryUpdate(parsedData, id)); const missionCredits = parsedData.RegularCredits || 0; const creditsBonus = 0; @@ -76,6 +75,8 @@ const missionInventoryUpdateController: RequestHandler = async (req, res) => { console.log(getRewards(parsedData.RewardInfo)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const InventoryJson = JSON.stringify(await missionInventoryUpdate(parsedData, id)); res.json({ // InventoryJson, // this part will reset game data and missions will be locked TotalCredits, diff --git a/src/models/inventoryModel.ts b/src/models/inventoryModel.ts index d96f22bc..f7cfa54e 100644 --- a/src/models/inventoryModel.ts +++ b/src/models/inventoryModel.ts @@ -1,4 +1,4 @@ -import mongoose, { Model, Schema, Types, model } from "mongoose"; +import { Model, Schema, Types, model } from "mongoose"; import { FlavourItem, RawUpgrade, MiscItem, IInventoryDatabase, Booster } from "../types/inventoryTypes/inventoryTypes"; import { Oid } from "../types/commonTypes"; import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes"; @@ -73,21 +73,11 @@ const BoosterSchema = new Schema({ const RawUpgrades = new Schema({ ItemType: String, - UpgradeFingerprint: String, - PendingRerollFingerprint: String, - ItemCount: Number, - ItemId: { - $oid: mongoose.Schema.Types.ObjectId - }, - LastAdded: { - $oid: mongoose.Schema.Types.ObjectId - } + ItemCount: Number }); RawUpgrades.set("toJSON", { transform(_document, returnedObject) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call - returnedObject.ItemId = { $oid: returnedObject._id.toString() } satisfies Oid; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call returnedObject.LastAdded = { $oid: returnedObject._id.toString() } satisfies Oid; delete returnedObject._id; @@ -95,6 +85,20 @@ RawUpgrades.set("toJSON", { } }); +const Upgrade = new Schema({ + UpgradeFingerprint: String, + ItemType: String +}); + +Upgrade.set("toJSON", { + transform(_document, returnedObject) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + returnedObject.ItemId = { $oid: returnedObject._id.toString() } satisfies Oid; + delete returnedObject._id; + delete returnedObject.__v; + } +}); + WeaponSchema.set("toJSON", { transform(_document, returnedObject) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call @@ -227,7 +231,7 @@ const inventorySchema = new Schema({ PendingRecipes: [Schema.Types.Mixed], TrainingDate: Schema.Types.Mixed, PlayerLevel: Number, - Upgrades: [Schema.Types.Mixed], + Upgrades: [Upgrade], EquippedGear: [String], DeathMarks: [String], FusionTreasures: [Schema.Types.Mixed], diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 30d14555..b36bfcfe 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -7,6 +7,7 @@ import { SlotType } from "@/src/types/purchaseTypes"; import { IWeaponResponse } from "@/src/types/inventoryTypes/weaponTypes"; import { ChallengeProgress, + CrewShipSalvagedWeaponSkin, FlavourItem, IInventoryDatabaseDocument, MiscItem, @@ -148,18 +149,14 @@ const addMiscItems = (inventory: IInventoryDatabaseDocument, itemsArray: MiscIte const addMods = (inventory: IInventoryDatabaseDocument, itemsArray: RawUpgrade[] | undefined) => { const { RawUpgrades } = inventory; - itemsArray?.forEach(({ ItemType, ItemCount, UpgradeFingerprint }) => { - const itemIndex = RawUpgrades.findIndex( - i => - i.ItemType === ItemType && - (i.UpgradeFingerprint === UpgradeFingerprint || (!i.UpgradeFingerprint && !UpgradeFingerprint)) - ); + itemsArray?.forEach(({ ItemType, ItemCount }) => { + const itemIndex = RawUpgrades.findIndex(i => i.ItemType === ItemType); if (itemIndex !== -1) { RawUpgrades[itemIndex].ItemCount += ItemCount; inventory.markModified(`RawUpgrades.${itemIndex}.ItemCount`); } else { - RawUpgrades.push({ ItemCount, ItemType, UpgradeFingerprint }); + RawUpgrades.push({ ItemCount, ItemType }); } }); }; @@ -228,66 +225,56 @@ export const upgradeMod = async ( LevelDiff, Cost, FusionPointCost - }: { Upgrade: RawUpgrade; LevelDiff: number; Cost: number; FusionPointCost: number }, + }: { Upgrade: CrewShipSalvagedWeaponSkin; LevelDiff: number; Cost: number; FusionPointCost: number }, accountId: string ): Promise => { - const inventory = await getInventory(accountId); - const { RawUpgrades } = inventory; - const { ItemCount, ItemType, UpgradeFingerprint } = Upgrade; - const itemIndex = RawUpgrades.findIndex( - i => - i.ItemType === ItemType && - (i.UpgradeFingerprint === UpgradeFingerprint || (!i.UpgradeFingerprint && !UpgradeFingerprint)) - ); + try { + const inventory = await getInventory(accountId); + const { Upgrades, RawUpgrades } = inventory; + const { ItemType, UpgradeFingerprint, ItemId } = Upgrade; - console.log(itemIndex, ItemType, UpgradeFingerprint); + const safeUpgradeFingerprint = UpgradeFingerprint || '{"lvl":0}'; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const parsedUpgradeFingerprint = JSON.parse(safeUpgradeFingerprint); + parsedUpgradeFingerprint.lvl += LevelDiff; + const stringifiedUpgradeFingerprint = JSON.stringify(parsedUpgradeFingerprint); - const safeUpgradeFingerprint = UpgradeFingerprint || '{"lvl":0}'; - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const parsedUpgradeFingerprint = JSON.parse(safeUpgradeFingerprint); - parsedUpgradeFingerprint.lvl += LevelDiff; + let itemIndex = Upgrades.findIndex(i => i._id?.equals(ItemId!.$oid)); - if (!ItemCount || itemIndex === -1) return; + if (itemIndex !== -1) { + Upgrades[itemIndex].UpgradeFingerprint = stringifiedUpgradeFingerprint; + inventory.markModified(`Upgrades.${itemIndex}.UpgradeFingerprint`); + } else { + itemIndex = + Upgrades.push({ + UpgradeFingerprint: stringifiedUpgradeFingerprint, + ItemType + }) - 1; - RawUpgrades[itemIndex].UpgradeFingerprint = JSON.stringify(parsedUpgradeFingerprint); + const rawItemIndex = RawUpgrades.findIndex(i => i.ItemType === ItemType); + RawUpgrades[rawItemIndex].ItemCount--; + if (RawUpgrades[rawItemIndex].ItemCount > 0) { + inventory.markModified(`RawUpgrades.${rawItemIndex}.UpgradeFingerprint`); + } else { + RawUpgrades.splice(rawItemIndex, 1); + } + } - // RawUpgrades[itemIndex].ItemCount--; + inventory.RegularCredits -= Cost; + inventory.FusionPoints -= FusionPointCost; - // if (RawUpgrades[itemIndex].ItemCount > 0) { - // inventory.markModified(`RawUpgrades.${itemIndex}.ItemCount`); - // } else { - // RawUpgrades.splice(itemIndex, 1); - // inventory.markModified(`RawUpgrades`); - // } + const changedInventory = await inventory.save(); + const itemId = changedInventory.toJSON().Upgrades[itemIndex]?.ItemId?.$oid; - // addMods(inventory, [{ ItemType, ItemCount: 1, UpgradeFingerprint: JSON.stringify(parsedUpgradeFingerprint) }]); + if (!itemId) { + throw new Error("Item Id not found in upgradeMod"); + } - inventory.RegularCredits -= Cost; - inventory.FusionPoints -= FusionPointCost; - - const changedInventory = await inventory.save(); - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return changedInventory.RawUpgrades[itemIndex]?.toJSON().ItemId.$oid; - - // await inventory.save(); - // { - // "Upgrade": { - // ItemType: "/Lotus/Upgrades/Mods/Warframe/Beginner/AvatarShieldMaxModBeginner", - // ItemId: { - // $oid: "" - // }, - // UpgradeFingerprint: '{"lvl":1}', - // PendingRerollFingerprint: "", - // ItemCount: 2, - // LastAdded: { - // $oid: "64f01ab0c4dfa3a8ef090043" - // } - // } - // "LevelDiff": 1, - // "Consumed": [], - // "Cost": 483, - // "FusionPointCost": 10 - // } + return itemId; + } catch (error) { + console.error("Error in upgradeMod:", error); + throw error; + } }; export { createInventory, addPowerSuit }; diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 6991e7d9..c7d8e129 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -321,7 +321,8 @@ export interface CrewShipSalvageBinClass { export interface CrewShipSalvagedWeaponSkin { ItemType: string; UpgradeFingerprint?: string; - ItemId: Oid; + ItemId?: Oid; + _id?: Types.ObjectId; } export interface CrewShipWeapon { @@ -925,10 +926,7 @@ export interface Progress { export interface RawUpgrade { ItemType: string; ItemCount: number; - ItemId?: Oid; LastAdded?: Oid; - UpgradeFingerprint?: string; - PendingRerollFingerprint?: string; } export interface Scoop {