From 22f380b311ad537695a02eccb2721575c619e092 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Mon, 14 Apr 2025 04:52:55 +0200 Subject: [PATCH] feat: change loadout display in apartment --- .../api/setShipFavouriteLoadoutController.ts | 27 ++++++++----- src/models/personalRoomsModel.ts | 40 +++++++++---------- src/types/personalRoomsTypes.ts | 7 ++-- src/types/shipTypes.ts | 9 ++++- 4 files changed, 49 insertions(+), 34 deletions(-) diff --git a/src/controllers/api/setShipFavouriteLoadoutController.ts b/src/controllers/api/setShipFavouriteLoadoutController.ts index d6f209b7..ef1df222 100644 --- a/src/controllers/api/setShipFavouriteLoadoutController.ts +++ b/src/controllers/api/setShipFavouriteLoadoutController.ts @@ -3,7 +3,7 @@ import { RequestHandler } from "express"; import { getPersonalRooms } from "@/src/services/personalRoomsService"; import { IOid } from "@/src/types/commonTypes"; import { Types } from "mongoose"; -import { TBootLocation } from "@/src/types/shipTypes"; +import { IFavouriteLoadoutDatabase, TBootLocation } from "@/src/types/shipTypes"; export const setShipFavouriteLoadoutController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); @@ -11,17 +11,12 @@ export const setShipFavouriteLoadoutController: RequestHandler = async (req, res const body = JSON.parse(String(req.body)) as ISetShipFavouriteLoadoutRequest; if (body.BootLocation == "LISET") { personalRooms.Ship.FavouriteLoadoutId = new Types.ObjectId(body.FavouriteLoadoutId.$oid); + } else if (body.BootLocation == "APARTMENT") { + updateTaggedDisplay(personalRooms.Apartment.FavouriteLoadouts, body); } else if (body.BootLocation == "SHOP") { - const display = personalRooms.TailorShop.FavouriteLoadouts.find(x => x.Tag == body.TagName!); - if (display) { - display.LoadoutId = new Types.ObjectId(body.FavouriteLoadoutId.$oid); - } else { - personalRooms.TailorShop.FavouriteLoadouts.push({ - Tag: body.TagName!, - LoadoutId: new Types.ObjectId(body.FavouriteLoadoutId.$oid) - }); - } + updateTaggedDisplay(personalRooms.TailorShop.FavouriteLoadouts, body); } else { + console.log(body); throw new Error(`unexpected BootLocation: ${body.BootLocation}`); } await personalRooms.save(); @@ -33,3 +28,15 @@ interface ISetShipFavouriteLoadoutRequest { FavouriteLoadoutId: IOid; TagName?: string; // given request for SHOP, but not for LISET } + +const updateTaggedDisplay = (arr: IFavouriteLoadoutDatabase[], body: ISetShipFavouriteLoadoutRequest): void => { + const display = arr.find(x => x.Tag == body.TagName!); + if (display) { + display.LoadoutId = new Types.ObjectId(body.FavouriteLoadoutId.$oid); + } else { + arr.push({ + Tag: body.TagName!, + LoadoutId: new Types.ObjectId(body.FavouriteLoadoutId.$oid) + }); + } +}; diff --git a/src/models/personalRoomsModel.ts b/src/models/personalRoomsModel.ts index 073b32bc..0fcdda72 100644 --- a/src/models/personalRoomsModel.ts +++ b/src/models/personalRoomsModel.ts @@ -2,13 +2,13 @@ import { toOid } from "@/src/helpers/inventoryHelpers"; import { colorSchema } from "@/src/models/inventoryModels/inventoryModel"; import { IOrbiter, IPersonalRoomsDatabase, PersonalRoomsModelType } from "@/src/types/personalRoomsTypes"; import { - IApartment, IFavouriteLoadoutDatabase, IGardening, IPlacedDecosDatabase, IPictureFrameInfo, IRoom, - ITailorShopDatabase + ITailorShopDatabase, + IApartmentDatabase } from "@/src/types/shipTypes"; import { Schema, model } from "mongoose"; @@ -62,19 +62,34 @@ const roomSchema = new Schema( { _id: false } ); +const favouriteLoadoutSchema = new Schema( + { + Tag: String, + LoadoutId: Schema.Types.ObjectId + }, + { _id: false } +); +favouriteLoadoutSchema.set("toJSON", { + virtuals: true, + transform(_document, returnedObject) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + returnedObject.LoadoutId = toOid(returnedObject.LoadoutId); + } +}); + const gardeningSchema = new Schema({ Planters: [Schema.Types.Mixed] //TODO: add when implementing gardening }); -const apartmentSchema = new Schema( +const apartmentSchema = new Schema( { Rooms: [roomSchema], - FavouriteLoadouts: [Schema.Types.Mixed], + FavouriteLoadouts: [favouriteLoadoutSchema], Gardening: gardeningSchema // TODO: ensure this is correct }, { _id: false } ); -const apartmentDefault: IApartment = { +const apartmentDefault: IApartmentDatabase = { Rooms: [ { Name: "ElevatorLanding", MaxCapacity: 1600 }, { Name: "ApartmentRoomA", MaxCapacity: 1000 }, @@ -111,21 +126,6 @@ const orbiterDefault: IOrbiter = { ] }; -const favouriteLoadoutSchema = new Schema( - { - Tag: String, - LoadoutId: Schema.Types.ObjectId - }, - { _id: false } -); -favouriteLoadoutSchema.set("toJSON", { - virtuals: true, - transform(_document, returnedObject) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - returnedObject.LoadoutId = toOid(returnedObject.LoadoutId); - } -}); - const tailorShopSchema = new Schema( { FavouriteLoadouts: [favouriteLoadoutSchema], diff --git a/src/types/personalRoomsTypes.ts b/src/types/personalRoomsTypes.ts index 64225862..68239bb4 100644 --- a/src/types/personalRoomsTypes.ts +++ b/src/types/personalRoomsTypes.ts @@ -5,7 +5,8 @@ import { IPlacedDecosDatabase, ITailorShop, ITailorShopDatabase, - TBootLocation + TBootLocation, + IApartmentDatabase } from "@/src/types/shipTypes"; import { Document, Model, Types } from "mongoose"; @@ -32,7 +33,7 @@ export interface IPersonalRoomsDatabase { personalRoomsOwnerId: Types.ObjectId; activeShipId: Types.ObjectId; Ship: IOrbiter; - Apartment: IApartment; + Apartment: IApartmentDatabase; TailorShop: ITailorShopDatabase; } @@ -42,7 +43,7 @@ export type PersonalRoomsDocumentProps = { Ship: Omit & { Rooms: RoomsType[]; }; - Apartment: Omit & { + Apartment: Omit & { Rooms: RoomsType[]; }; TailorShop: Omit & { diff --git a/src/types/shipTypes.ts b/src/types/shipTypes.ts index 7cc07259..a097f3ca 100644 --- a/src/types/shipTypes.ts +++ b/src/types/shipTypes.ts @@ -64,10 +64,17 @@ export interface IPlanters { export interface IGardening { Planters?: IPlanters[]; } + export interface IApartment { Gardening: IGardening; Rooms: IRoom[]; - FavouriteLoadouts: string[]; + FavouriteLoadouts: IFavouriteLoadout[]; +} + +export interface IApartmentDatabase { + Gardening: IGardening; + Rooms: IRoom[]; + FavouriteLoadouts: IFavouriteLoadoutDatabase[]; } export interface IPlacedDecosDatabase {