chore: cleanup inventory types #691

Merged
Sainan merged 2 commits from inventory-doc-type into main 2025-01-03 13:17:34 -08:00
7 changed files with 42 additions and 45 deletions

View File

@ -3,15 +3,10 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { getInventory, addMiscItems, updateCurrency, addRecipes } from "@/src/services/inventoryService"; import { getInventory, addMiscItems, updateCurrency, addRecipes } from "@/src/services/inventoryService";
import { IOid } from "@/src/types/commonTypes"; import { IOid } from "@/src/types/commonTypes";
import { import { IConsumedSuit, IInfestedFoundry, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
IConsumedSuit,
IInfestedFoundry,
IInventoryDatabaseDocument,
IMiscItem,
ITypeCount
} from "@/src/types/inventoryTypes/inventoryTypes";
import { ExportMisc, ExportRecipes } from "warframe-public-export-plus"; import { ExportMisc, ExportRecipes } from "warframe-public-export-plus";
import { getRecipe } from "@/src/services/itemDataService"; import { getRecipe } from "@/src/services/itemDataService";
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
export const infestedFoundryController: RequestHandler = async (req, res) => { export const infestedFoundryController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
@ -239,7 +234,7 @@ interface IHelminthSubsumeRequest {
Recipe: string; Recipe: string;
} }
export const handleSubsumeCompletion = (inventory: IInventoryDatabaseDocument): ITypeCount[] => { export const handleSubsumeCompletion = (inventory: TInventoryDatabaseDocument): ITypeCount[] => {
const [recipeType] = Object.entries(ExportRecipes).find( const [recipeType] = Object.entries(ExportRecipes).find(
([_recipeType, recipe]) => ([_recipeType, recipe]) =>
recipe.secretIngredientAction == "SIA_WARFRAME_ABILITY" && recipe.secretIngredientAction == "SIA_WARFRAME_ABILITY" &&

View File

@ -1,11 +1,10 @@
import { RequestHandler } from "express"; import { RequestHandler } from "express";
import { getAccountForRequest } from "@/src/services/loginService"; import { getAccountForRequest } from "@/src/services/loginService";
import { toInventoryResponse } from "@/src/helpers/inventoryHelpers";
import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
import { config } from "@/src/services/configService"; import { config } from "@/src/services/configService";
import allDialogue from "@/static/fixed_responses/allDialogue.json"; import allDialogue from "@/static/fixed_responses/allDialogue.json";
import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes";
import { IInventoryDatabaseDocument, IShipInventory, equipmentKeys } from "@/src/types/inventoryTypes/inventoryTypes"; import { IInventoryResponse, IShipInventory, equipmentKeys } from "@/src/types/inventoryTypes/inventoryTypes";
import { IPolarity, ArtifactPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { IPolarity, ArtifactPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { import {
ExportCustoms, ExportCustoms,
@ -26,9 +25,7 @@ export const inventoryController: RequestHandler = async (request, response) =>
return; return;
} }
const inventory = await Inventory.findOne({ accountOwnerId: account._id.toString() }) const inventory = await Inventory.findOne({ accountOwnerId: account._id.toString() });
.populate<{ LoadOutPresets: ILoadoutDatabase }>("LoadOutPresets")
.populate<{ Ships: IShipInventory }>("Ships");
if (!inventory) { if (!inventory) {
response.status(400).json({ error: "inventory was undefined" }); response.status(400).json({ error: "inventory was undefined" });
@ -63,14 +60,17 @@ export const inventoryController: RequestHandler = async (request, response) =>
inventory.InfestedFoundry.AbilityOverrideUnlockCooldown && inventory.InfestedFoundry.AbilityOverrideUnlockCooldown &&
new Date() >= inventory.InfestedFoundry.AbilityOverrideUnlockCooldown new Date() >= inventory.InfestedFoundry.AbilityOverrideUnlockCooldown
) { ) {
handleSubsumeCompletion(inventory as unknown as IInventoryDatabaseDocument); handleSubsumeCompletion(inventory);
await inventory.save(); await inventory.save();
} }
//TODO: make a function that converts from database representation to client const inventoryWithLoadOutPresets = await inventory.populate<{ LoadOutPresets: ILoadoutDatabase }>(
const inventoryJSON = inventory.toJSON(); "LoadOutPresets"
);
const inventoryResponse = toInventoryResponse(inventoryJSON); const inventoryWithLoadOutPresetsAndShips = await inventoryWithLoadOutPresets.populate<{ Ships: IShipInventory }>(
"Ships"
);
const inventoryResponse = inventoryWithLoadOutPresetsAndShips.toJSON<IInventoryResponse>();
if (config.infiniteCredits) { if (config.infiniteCredits) {
inventoryResponse.RegularCredits = 999999999; inventoryResponse.RegularCredits = 999999999;

View File

@ -1,14 +1,6 @@
import { IMongoDate, IOid } from "@/src/types/commonTypes"; import { IMongoDate, IOid } from "@/src/types/commonTypes";
import { IInventoryResponse } from "@/src/types/inventoryTypes/inventoryTypes";
import { Types } from "mongoose"; import { Types } from "mongoose";
//TODO: this needs to be addressed: a schema's toJSON is responsible for changing Oid and Date to their corresponding Response versions __id to "ItemId":{"$oid":"6450f720bc562ebf030222d4"}, and a Date to "date":{"$date":{"$numberLong":"unix timestamp"})
export const toInventoryResponse = (inventoryDatabase: { accountOwnerId: Types.ObjectId }): IInventoryResponse => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { accountOwnerId, ...inventoryResponse } = inventoryDatabase;
return inventoryResponse as unknown as IInventoryResponse;
};
export const toOid = (objectId: Types.ObjectId): IOid => { export const toOid = (objectId: Types.ObjectId): IOid => {
return { $oid: objectId.toString() } satisfies IOid; return { $oid: objectId.toString() } satisfies IOid;
}; };

View File

@ -1,4 +1,4 @@
import { Model, Schema, Types, model } from "mongoose"; import { Document, Model, Schema, Types, model } from "mongoose";
import { import {
IFlavourItem, IFlavourItem,
IRawUpgrade, IRawUpgrade,
@ -1061,6 +1061,7 @@ inventorySchema.set("toJSON", {
transform(_document, returnedObject) { transform(_document, returnedObject) {
delete returnedObject._id; delete returnedObject._id;
delete returnedObject.__v; delete returnedObject.__v;
delete returnedObject.accountOwnerId;
const inventoryDatabase = returnedObject as IInventoryDatabase; const inventoryDatabase = returnedObject as IInventoryDatabase;
const inventoryResponse = returnedObject as IInventoryResponse; const inventoryResponse = returnedObject as IInventoryResponse;
@ -1114,3 +1115,15 @@ type InventoryDocumentProps = {
type InventoryModelType = Model<IInventoryDatabase, {}, InventoryDocumentProps>; type InventoryModelType = Model<IInventoryDatabase, {}, InventoryDocumentProps>;
export const Inventory = model<IInventoryDatabase, InventoryModelType>("Inventory", inventorySchema); export const Inventory = model<IInventoryDatabase, InventoryModelType>("Inventory", inventorySchema);
// eslint-disable-next-line @typescript-eslint/ban-types
export type TInventoryDatabaseDocument = Document<unknown, {}, IInventoryDatabase> &
Omit<
IInventoryDatabase & {
_id: Types.ObjectId;
} & {
__v: number;
},
keyof InventoryDocumentProps
> &
InventoryDocumentProps;

View File

@ -2,7 +2,7 @@ import { Request } from "express";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { getInventory } from "@/src/services/inventoryService"; import { getInventory } from "@/src/services/inventoryService";
import { Guild } from "@/src/models/guildModel"; import { Guild } from "@/src/models/guildModel";
import { IInventoryDatabaseDocument } from "../types/inventoryTypes/inventoryTypes"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
export const getGuildForRequest = async (req: Request) => { export const getGuildForRequest = async (req: Request) => {
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
@ -10,7 +10,7 @@ export const getGuildForRequest = async (req: Request) => {
return await getGuildForRequestEx(req, inventory); return await getGuildForRequestEx(req, inventory);
}; };
export const getGuildForRequestEx = async (req: Request, inventory: IInventoryDatabaseDocument) => { export const getGuildForRequestEx = async (req: Request, inventory: TInventoryDatabaseDocument) => {
const guildId = req.query.guildId as string; const guildId = req.query.guildId as string;
if (!inventory.GuildId || inventory.GuildId.toString() != guildId) { if (!inventory.GuildId || inventory.GuildId.toString() != guildId) {
throw new Error("Account is not in the guild that it has sent a request for"); throw new Error("Account is not in the guild that it has sent a request for");

View File

@ -1,4 +1,4 @@
import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import { Inventory, TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
import postTutorialInventory from "@/static/fixed_responses/postTutorialInventory.json"; import postTutorialInventory from "@/static/fixed_responses/postTutorialInventory.json";
import { config } from "@/src/services/configService"; import { config } from "@/src/services/configService";
import { Types } from "mongoose"; import { Types } from "mongoose";
@ -7,7 +7,6 @@ import {
IChallengeProgress, IChallengeProgress,
IConsumable, IConsumable,
IFlavourItem, IFlavourItem,
IInventoryDatabaseDocument,
IMiscItem, IMiscItem,
IMission, IMission,
IRawUpgrade, IRawUpgrade,
@ -95,7 +94,7 @@ export const combineInventoryChanges = (InventoryChanges: IInventoryChanges, del
} }
}; };
export const getInventory = async (accountOwnerId: string) => { export const getInventory = async (accountOwnerId: string): Promise<TInventoryDatabaseDocument> => {
const inventory = await Inventory.findOne({ accountOwnerId: accountOwnerId }); const inventory = await Inventory.findOne({ accountOwnerId: accountOwnerId });
if (!inventory) { if (!inventory) {
@ -485,7 +484,7 @@ const isCurrencyTracked = (usePremium: boolean): boolean => {
}; };
export const updateCurrency = ( export const updateCurrency = (
inventory: IInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
price: number, price: number,
usePremium: boolean usePremium: boolean
): ICurrencyChanges => { ): ICurrencyChanges => {
@ -590,7 +589,7 @@ const addCrewShip = async (typeName: string, accountId: string) => {
}; };
const addGearExpByCategory = ( const addGearExpByCategory = (
inventory: IInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
gearArray: IEquipmentClient[] | undefined, gearArray: IEquipmentClient[] | undefined,
categoryName: TEquipmentKey categoryName: TEquipmentKey
): void => { ): void => {
@ -622,7 +621,7 @@ const addGearExpByCategory = (
}); });
}; };
export const addMiscItems = (inventory: IInventoryDatabaseDocument, itemsArray: IMiscItem[] | undefined): void => { export const addMiscItems = (inventory: TInventoryDatabaseDocument, itemsArray: IMiscItem[] | undefined): void => {
const { MiscItems } = inventory; const { MiscItems } = inventory;
itemsArray?.forEach(({ ItemCount, ItemType }) => { itemsArray?.forEach(({ ItemCount, ItemType }) => {
@ -638,7 +637,7 @@ export const addMiscItems = (inventory: IInventoryDatabaseDocument, itemsArray:
}; };
export const addShipDecorations = ( export const addShipDecorations = (
inventory: IInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
itemsArray: IConsumable[] | undefined itemsArray: IConsumable[] | undefined
): void => { ): void => {
const { ShipDecorations } = inventory; const { ShipDecorations } = inventory;
@ -655,7 +654,7 @@ export const addShipDecorations = (
}); });
}; };
export const addConsumables = (inventory: IInventoryDatabaseDocument, itemsArray: IConsumable[] | undefined): void => { export const addConsumables = (inventory: TInventoryDatabaseDocument, itemsArray: IConsumable[] | undefined): void => {
const { Consumables } = inventory; const { Consumables } = inventory;
itemsArray?.forEach(({ ItemCount, ItemType }) => { itemsArray?.forEach(({ ItemCount, ItemType }) => {
@ -670,7 +669,7 @@ export const addConsumables = (inventory: IInventoryDatabaseDocument, itemsArray
}); });
}; };
export const addRecipes = (inventory: IInventoryDatabaseDocument, itemsArray: ITypeCount[] | undefined): void => { export const addRecipes = (inventory: TInventoryDatabaseDocument, itemsArray: ITypeCount[] | undefined): void => {
const { Recipes } = inventory; const { Recipes } = inventory;
itemsArray?.forEach(({ ItemCount, ItemType }) => { itemsArray?.forEach(({ ItemCount, ItemType }) => {
@ -685,7 +684,7 @@ export const addRecipes = (inventory: IInventoryDatabaseDocument, itemsArray: IT
}); });
}; };
export const addMods = (inventory: IInventoryDatabaseDocument, itemsArray: IRawUpgrade[] | undefined): void => { export const addMods = (inventory: TInventoryDatabaseDocument, itemsArray: IRawUpgrade[] | undefined): void => {
const { RawUpgrades } = inventory; const { RawUpgrades } = inventory;
itemsArray?.forEach(({ ItemType, ItemCount }) => { itemsArray?.forEach(({ ItemType, ItemCount }) => {
const itemIndex = RawUpgrades.findIndex(i => i.ItemType === ItemType); const itemIndex = RawUpgrades.findIndex(i => i.ItemType === ItemType);
@ -700,7 +699,7 @@ export const addMods = (inventory: IInventoryDatabaseDocument, itemsArray: IRawU
}; };
export const addFusionTreasures = ( export const addFusionTreasures = (
inventory: IInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
itemsArray: IFusionTreasure[] | undefined itemsArray: IFusionTreasure[] | undefined
): void => { ): void => {
const { FusionTreasures } = inventory; const { FusionTreasures } = inventory;
@ -729,7 +728,7 @@ export const updateChallengeProgress = async (
}; };
export const addSeasonalChallengeHistory = ( export const addSeasonalChallengeHistory = (
inventory: IInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
itemsArray: ISeasonChallenge[] | undefined itemsArray: ISeasonChallenge[] | undefined
): void => { ): void => {
const category = inventory.SeasonChallengeHistory; const category = inventory.SeasonChallengeHistory;
@ -746,7 +745,7 @@ export const addSeasonalChallengeHistory = (
}; };
export const addChallenges = ( export const addChallenges = (
inventory: IInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
itemsArray: IChallengeProgress[] | undefined itemsArray: IChallengeProgress[] | undefined
): void => { ): void => {
const category = inventory.ChallengeProgress; const category = inventory.ChallengeProgress;
@ -763,7 +762,7 @@ export const addChallenges = (
}); });
}; };
const addMissionComplete = (inventory: IInventoryDatabaseDocument, { Tag, Completes }: IMission): void => { const addMissionComplete = (inventory: TInventoryDatabaseDocument, { Tag, Completes }: IMission): void => {
const { Missions } = inventory; const { Missions } = inventory;
const itemIndex = Missions.findIndex(item => item.Tag === Tag); const itemIndex = Missions.findIndex(item => item.Tag === Tag);

View File

@ -10,8 +10,6 @@ import {
IEquipmentDatabase IEquipmentDatabase
} from "@/src/types/inventoryTypes/commonInventoryTypes"; } from "@/src/types/inventoryTypes/commonInventoryTypes";
//Document extends will be deleted soon. TODO: delete and migrate uses to ...
export interface IInventoryDatabaseDocument extends IInventoryDatabase, Document {}
export interface IInventoryDatabase export interface IInventoryDatabase
extends Omit< extends Omit<
IInventoryResponse, IInventoryResponse,