feat: favoriting equipment & skins (#1555)
Some checks failed
Build Docker image / docker (push) Successful in 43s
Build / build (push) Has been cancelled

Reviewed-on: #1555
Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com>
Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
Sainan 2025-04-11 06:56:45 -07:00 committed by Sainan
parent 2ca79ef898
commit dde95c2b61
8 changed files with 46 additions and 35 deletions

View File

@ -1,32 +0,0 @@
import { RequestHandler } from "express";
import { ISaveLoadoutRequest } from "@/src/types/saveLoadoutTypes";
import { handleInventoryItemConfigChange } from "@/src/services/saveLoadoutService";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { logger } from "@/src/utils/logger";
export const saveLoadoutController: RequestHandler = async (req, res) => {
//validate here
const accountId = await getAccountIdForRequest(req);
try {
const body: ISaveLoadoutRequest = JSON.parse(req.body as string) as ISaveLoadoutRequest;
// console.log(util.inspect(body, { showHidden: false, depth: null, colors: true }));
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { UpgradeVer, ...equipmentChanges } = body;
const newLoadoutId = await handleInventoryItemConfigChange(equipmentChanges, accountId);
//send back new loadout id, if new loadout was added
if (newLoadoutId) {
res.send(newLoadoutId);
}
res.status(200).end();
} catch (error: unknown) {
if (error instanceof Error) {
logger.error(`error in saveLoadoutController: ${error.message}`);
res.status(400).json({ error: error.message });
} else {
res.status(400).json({ error: "unknown error" });
}
}
};

View File

@ -0,0 +1,21 @@
import { RequestHandler } from "express";
import { ISaveLoadoutRequest } from "@/src/types/saveLoadoutTypes";
import { handleInventoryItemConfigChange } from "@/src/services/saveLoadoutService";
import { getAccountIdForRequest } from "@/src/services/loginService";
export const saveLoadoutController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
const body: ISaveLoadoutRequest = JSON.parse(req.body as string) as ISaveLoadoutRequest;
// console.log(util.inspect(body, { showHidden: false, depth: null, colors: true }));
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { UpgradeVer, ...equipmentChanges } = body;
const newLoadoutId = await handleInventoryItemConfigChange(equipmentChanges, accountId);
//send back new loadout id, if new loadout was added
if (newLoadoutId) {
res.send(newLoadoutId);
}
res.end();
};

View File

@ -612,6 +612,7 @@ const spectreLoadoutsSchema = new Schema<ISpectreLoadout>(
const weaponSkinsSchema = new Schema<IWeaponSkinDatabase>( const weaponSkinsSchema = new Schema<IWeaponSkinDatabase>(
{ {
ItemType: String, ItemType: String,
Favorite: Boolean,
IsNew: Boolean IsNew: Boolean
}, },
{ id: false } { id: false }
@ -880,6 +881,7 @@ const EquipmentSchema = new Schema<IEquipmentDatabase>(
RailjackImage: FlavourItemSchema, RailjackImage: FlavourItemSchema,
CrewMembers: crewShipMembersSchema, CrewMembers: crewShipMembersSchema,
Details: detailsSchema, Details: detailsSchema,
Favorite: Boolean,
IsNew: Boolean IsNew: Boolean
}, },
{ id: false } { id: false }

View File

@ -97,7 +97,7 @@ import { removeFromGuildController } from "@/src/controllers/api/removeFromGuild
import { rerollRandomModController } from "@/src/controllers/api/rerollRandomModController"; import { rerollRandomModController } from "@/src/controllers/api/rerollRandomModController";
import { retrievePetFromStasisController } from "@/src/controllers/api/retrievePetFromStasisController"; import { retrievePetFromStasisController } from "@/src/controllers/api/retrievePetFromStasisController";
import { saveDialogueController } from "@/src/controllers/api/saveDialogueController"; import { saveDialogueController } from "@/src/controllers/api/saveDialogueController";
import { saveLoadoutController } from "@/src/controllers/api/saveLoadout"; import { saveLoadoutController } from "@/src/controllers/api/saveLoadoutController";
import { saveSettingsController } from "@/src/controllers/api/saveSettingsController"; import { saveSettingsController } from "@/src/controllers/api/saveSettingsController";
import { saveVaultAutoContributeController } from "@/src/controllers/api/saveVaultAutoContributeController"; import { saveVaultAutoContributeController } from "@/src/controllers/api/saveVaultAutoContributeController";
import { sellController } from "@/src/controllers/api/sellController"; import { sellController } from "@/src/controllers/api/sellController";

View File

@ -140,7 +140,22 @@ export const handleInventoryItemConfigChange = async (
case "WeaponSkins": { case "WeaponSkins": {
const itemEntries = equipment as IItemEntry; const itemEntries = equipment as IItemEntry;
for (const [itemId, itemConfigEntries] of Object.entries(itemEntries)) { for (const [itemId, itemConfigEntries] of Object.entries(itemEntries)) {
inventory.WeaponSkins.id(itemId)!.IsNew = itemConfigEntries.IsNew; if (itemId.startsWith("ca70ca70ca70ca70")) {
logger.warn(
`unlockAllSkins does not work with favoriting items because you don't actually own it`
);
} else {
const inventoryItem = inventory.WeaponSkins.id(itemId);
if (!inventoryItem) {
throw new Error(`inventory item WeaponSkins not found with id ${itemId}`);
}
if ("Favorite" in itemConfigEntries) {
inventoryItem.Favorite = itemConfigEntries.Favorite;
}
if ("IsNew" in itemConfigEntries) {
inventoryItem.IsNew = itemConfigEntries.IsNew;
}
}
} }
break; break;
} }
@ -163,6 +178,9 @@ export const handleInventoryItemConfigChange = async (
inventoryItem.Configs[parseInt(configId)] = config; inventoryItem.Configs[parseInt(configId)] = config;
} }
} }
if ("Favorite" in itemConfigEntries) {
inventoryItem.Favorite = itemConfigEntries.Favorite;
}
if ("IsNew" in itemConfigEntries) { if ("IsNew" in itemConfigEntries) {
inventoryItem.IsNew = itemConfigEntries.IsNew; inventoryItem.IsNew = itemConfigEntries.IsNew;
} }

View File

@ -142,6 +142,7 @@ export interface IEquipmentDatabase {
RailjackImage?: IFlavourItem; RailjackImage?: IFlavourItem;
CrewMembers?: ICrewShipMembersDatabase; CrewMembers?: ICrewShipMembersDatabase;
Details?: IKubrowPetDetailsDatabase; Details?: IKubrowPetDetailsDatabase;
Favorite?: boolean;
IsNew?: boolean; IsNew?: boolean;
_id: Types.ObjectId; _id: Types.ObjectId;
} }

View File

@ -1034,6 +1034,7 @@ export interface ITaunt {
export interface IWeaponSkinDatabase { export interface IWeaponSkinDatabase {
ItemType: string; ItemType: string;
Favorite?: boolean;
IsNew?: boolean; IsNew?: boolean;
_id: Types.ObjectId; _id: Types.ObjectId;
} }

View File

@ -51,7 +51,7 @@ export interface IItemEntry {
export type IConfigEntry = { export type IConfigEntry = {
[configId in "0" | "1" | "2" | "3" | "4" | "5"]: IItemConfig; [configId in "0" | "1" | "2" | "3" | "4" | "5"]: IItemConfig;
} & { IsNew?: boolean }; } & { Favorite?: boolean; IsNew?: boolean };
export type ILoadoutClient = Omit<ILoadoutDatabase, "_id" | "loadoutOwnerId">; export type ILoadoutClient = Omit<ILoadoutDatabase, "_id" | "loadoutOwnerId">;