From 65c000249ca047a0f75f918a82ed1a1c5e41d2ec Mon Sep 17 00:00:00 2001 From: Sainan Date: Sun, 22 Dec 2024 20:21:33 +0100 Subject: [PATCH] feat: decorating the backroom --- src/controllers/api/getShipController.ts | 3 +- src/models/personalRoomsModel.ts | 60 ++++++++++++++++++++++- src/services/shipCustomizationsService.ts | 7 ++- src/types/personalRoomsTypes.ts | 6 ++- src/types/shipTypes.ts | 28 ++++++++++- 5 files changed, 97 insertions(+), 7 deletions(-) diff --git a/src/controllers/api/getShipController.ts b/src/controllers/api/getShipController.ts index e3365911..8645e976 100644 --- a/src/controllers/api/getShipController.ts +++ b/src/controllers/api/getShipController.ts @@ -27,7 +27,8 @@ export const getShipController: RequestHandler = async (req, res) => { SkinFlavourItem: ship.SkinFlavourItem } }, - Apartment: personalRooms.Apartment + Apartment: personalRooms.Apartment, + TailorShop: personalRooms.TailorShop }; if (config.unlockAllShipFeatures) { diff --git a/src/models/personalRoomsModel.ts b/src/models/personalRoomsModel.ts index c18df4dd..0db41ee2 100644 --- a/src/models/personalRoomsModel.ts +++ b/src/models/personalRoomsModel.ts @@ -1,6 +1,14 @@ import { toOid } from "@/src/helpers/inventoryHelpers"; import { IOrbiter, IPersonalRooms, PersonalRoomsModelType } from "@/src/types/personalRoomsTypes"; -import { IApartment, IGardening, IPlacedDecosDatabase, IPictureFrameInfo, IRoom } from "@/src/types/shipTypes"; +import { + IApartment, + IFavouriteLoadoutDatabase, + IGardening, + IPlacedDecosDatabase, + IPictureFrameInfo, + IRoom, + ITailorShopDatabase +} from "@/src/types/shipTypes"; import { Schema, model } from "mongoose"; const pictureFrameInfoSchema = new Schema( @@ -76,11 +84,59 @@ const orbiterSchema = 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 tailorShopSchema = new Schema( + { + FavouriteLoadouts: [favouriteLoadoutSchema], + CustomJson: String, + LevelDecosVisible: Boolean, + Rooms: [roomSchema] + }, + { _id: false } +); +const tailorShopDefault: ITailorShopDatabase = { + FavouriteLoadouts: [], + CustomJson: "{}", + LevelDecosVisible: true, + Rooms: [ + { + Name: "LabRoom", + MaxCapacity: 4000 + }, + { + Name: "LivingQuartersRoom", + MaxCapacity: 3000 + }, + { + Name: "HelminthRoom", + MaxCapacity: 2000 + } + ] +}; + export const personalRoomsSchema = new Schema({ personalRoomsOwnerId: Schema.Types.ObjectId, activeShipId: Schema.Types.ObjectId, Ship: orbiterSchema, - Apartment: apartmentSchema + Apartment: apartmentSchema, + TailorShop: { + type: tailorShopSchema, + default: tailorShopDefault as any as undefined // Yeah, this is bad, but mongoose types here are wrong. + } }); export const PersonalRooms = model("PersonalRooms", personalRoomsSchema); diff --git a/src/services/shipCustomizationsService.ts b/src/services/shipCustomizationsService.ts index 170a69f0..8d1f7a76 100644 --- a/src/services/shipCustomizationsService.ts +++ b/src/services/shipCustomizationsService.ts @@ -37,7 +37,12 @@ export const handleSetShipDecorations = async ( ): Promise => { const personalRooms = await getPersonalRooms(accountId); - const rooms = placedDecoration.IsApartment ? personalRooms.Apartment.Rooms : personalRooms.Ship.Rooms; + const rooms = + placedDecoration.BootLocation == "SHOP" + ? personalRooms.TailorShop.Rooms + : placedDecoration.IsApartment + ? personalRooms.Apartment.Rooms + : personalRooms.Ship.Rooms; const roomToPlaceIn = rooms.find(room => room.Name === placedDecoration.Room); diff --git a/src/types/personalRoomsTypes.ts b/src/types/personalRoomsTypes.ts index 02521112..379fdd3f 100644 --- a/src/types/personalRoomsTypes.ts +++ b/src/types/personalRoomsTypes.ts @@ -1,4 +1,4 @@ -import { IApartment, IRoom, IPlacedDecosDatabase, TBootLocation } from "@/src/types/shipTypes"; +import { IApartment, IRoom, IPlacedDecosDatabase, ITailorShop, TBootLocation } from "@/src/types/shipTypes"; import { Model, Types } from "mongoose"; export interface IOrbiter { @@ -13,6 +13,7 @@ export interface IPersonalRooms { activeShipId: Types.ObjectId; Ship: IOrbiter; Apartment: IApartment; + TailorShop: ITailorShop; } export type RoomsType = { Name: string; MaxCapacity: number; PlacedDecos: Types.DocumentArray }; @@ -24,6 +25,9 @@ export type PersonalRoomsDocumentProps = { Apartment: Omit & { Rooms: RoomsType[]; }; + TailorShop: Omit & { + Rooms: RoomsType[]; + }; }; // eslint-disable-next-line @typescript-eslint/ban-types diff --git a/src/types/shipTypes.ts b/src/types/shipTypes.ts index 3e07b53a..eea2b51a 100644 --- a/src/types/shipTypes.ts +++ b/src/types/shipTypes.ts @@ -7,6 +7,7 @@ export interface IGetShipResponse { ShipOwnerId: string; Ship: IShip; Apartment: IApartment; + TailorShop: ITailorShop; LoadOutInventory: { LoadOutPresets: ILoadoutClient }; } @@ -102,7 +103,8 @@ export interface IShipDecorationsRequest { Pos: [number, number, number]; Rot: [number, number, number]; Room: string; - IsApartment: boolean; + BootLocation?: TBootLocation; + IsApartment?: boolean; RemoveId?: string; MoveId?: string; OldRoom?: string; @@ -112,7 +114,7 @@ export interface IShipDecorationsRequest { export interface IShipDecorationsResponse { DecoId?: string; Room?: string; - IsApartment: boolean; + IsApartment?: boolean; MaxCapacityIncrease?: number; OldRoom?: string; NewRoom?: string; @@ -141,3 +143,25 @@ export interface IPictureFrameInfo { TextColorB: number; TextOrientation: number; } + +export interface IFavouriteLoadout { + Tag: string; + LoadoutId: IOid; +} + +export interface IFavouriteLoadoutDatabase { + Tag: string; + LoadoutId: Types.ObjectId; +} + +export interface ITailorShopDatabase { + FavouriteLoadouts: IFavouriteLoadoutDatabase[]; + CustomJson: "{}"; // ??? + LevelDecosVisible: boolean; + Rooms: IRoom[]; +} + +export interface ITailorShop extends Omit { + FavouriteLoadouts: IFavouriteLoadout[]; + Colors: []; // ??? +}