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/controllers/api/shipDecorationsController.ts b/src/controllers/api/shipDecorationsController.ts index 4966ab8b..be09fe9f 100644 --- a/src/controllers/api/shipDecorationsController.ts +++ b/src/controllers/api/shipDecorationsController.ts @@ -13,7 +13,7 @@ export const shipDecorationsController: RequestHandler = async (req, res) => { res.send(placedDecoration); } catch (error: unknown) { if (error instanceof Error) { - logger.error(`error in saveLoadoutController: ${error.message}`); + logger.error(`error in shipDecorationsController: ${error.message}`); res.status(400).json({ error: error.message }); } } diff --git a/src/models/personalRoomsModel.ts b/src/models/personalRoomsModel.ts index cab7ad41..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 } 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( @@ -44,7 +52,7 @@ placedDecosSchema.set("toJSON", { } }); -const roomSchema = new Schema( +const roomSchema = new Schema( { Name: String, MaxCapacity: Number, @@ -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 dda71362..379fdd3f 100644 --- a/src/types/personalRoomsTypes.ts +++ b/src/types/personalRoomsTypes.ts @@ -1,9 +1,9 @@ -import { IApartment, IRooms, IPlacedDecosDatabase, TBootLocation } from "@/src/types/shipTypes"; +import { IApartment, IRoom, IPlacedDecosDatabase, ITailorShop, TBootLocation } from "@/src/types/shipTypes"; import { Model, Types } from "mongoose"; export interface IOrbiter { Features: string[]; - Rooms: IRooms[]; + Rooms: IRoom[]; ContentUrlSignature: string; BootLocation?: TBootLocation; } @@ -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 fe5e3608..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 }; } @@ -26,7 +27,7 @@ export interface IShip { Features: string[]; ShipId: IOid; ShipInterior: IShipInterior; - Rooms: IRooms[]; + Rooms: IRoom[]; ContentUrlSignature: string; BootLocation?: TBootLocation; } @@ -41,7 +42,7 @@ export interface IShipDatabase { SkinFlavourItem?: string; } -export interface IRooms { +export interface IRoom { Name: string; MaxCapacity: number; PlacedDecos?: IPlacedDecosDatabase[]; @@ -62,7 +63,7 @@ export interface IGardening { } export interface IApartment { Gardening: IGardening; - Rooms: IRooms[]; + Rooms: IRoom[]; FavouriteLoadouts: string[]; } @@ -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: []; // ??? +}