diff --git a/src/controllers/api/setPlacedDecoInfoController.ts b/src/controllers/api/setPlacedDecoInfoController.ts index 83b44009..25073023 100644 --- a/src/controllers/api/setPlacedDecoInfoController.ts +++ b/src/controllers/api/setPlacedDecoInfoController.ts @@ -1,23 +1,19 @@ import { getAccountIdForRequest } from "@/src/services/loginService"; -import { IPictureFrameInfo, ISetPlacedDecoInfoRequest } from "@/src/types/personalRoomsTypes"; +import { ISetPlacedDecoInfoRequest } from "@/src/types/personalRoomsTypes"; import { RequestHandler } from "express"; import { handleSetPlacedDecoInfo } from "@/src/services/shipCustomizationsService"; export const setPlacedDecoInfoController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); const payload = JSON.parse(req.body as string) as ISetPlacedDecoInfoRequest; + //console.log(JSON.stringify(payload, null, 2)); await handleSetPlacedDecoInfo(accountId, payload); res.json({ - DecoId: payload.DecoId, - IsPicture: true, - PictureFrameInfo: payload.PictureFrameInfo, - BootLocation: payload.BootLocation + ...payload, + IsPicture: !!payload.PictureFrameInfo } satisfies ISetPlacedDecoInfoResponse); }; -interface ISetPlacedDecoInfoResponse { - DecoId: string; +interface ISetPlacedDecoInfoResponse extends ISetPlacedDecoInfoRequest { IsPicture: boolean; - PictureFrameInfo?: IPictureFrameInfo; - BootLocation?: string; } diff --git a/src/models/inventoryModels/loadoutModel.ts b/src/models/inventoryModels/loadoutModel.ts index b67a64c9..c98a8025 100644 --- a/src/models/inventoryModels/loadoutModel.ts +++ b/src/models/inventoryModels/loadoutModel.ts @@ -25,7 +25,7 @@ export const EquipmentSelectionSchema = new Schema( } ); -const loadoutConfigSchema = new Schema( +export const loadoutConfigSchema = new Schema( { FocusSchool: String, PresetIcon: String, diff --git a/src/models/personalRoomsModel.ts b/src/models/personalRoomsModel.ts index a33effb5..f812a8e6 100644 --- a/src/models/personalRoomsModel.ts +++ b/src/models/personalRoomsModel.ts @@ -1,6 +1,7 @@ import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; import { IApartmentDatabase, + ICustomizationInfoDatabase, IFavouriteLoadoutDatabase, IGardeningDatabase, IOrbiterClient, @@ -11,12 +12,13 @@ import { IPlantClient, IPlantDatabase, IPlanterDatabase, - IRoom, + IRoomDatabase, ITailorShopDatabase, PersonalRoomsModelType } from "@/src/types/personalRoomsTypes"; import { Schema, Types, model } from "mongoose"; import { colorSchema, shipCustomizationSchema } from "@/src/models/commonModel"; +import { loadoutConfigSchema } from "@/src/models/inventoryModels/loadoutModel"; export const pictureFrameInfoSchema = new Schema( { @@ -34,7 +36,20 @@ export const pictureFrameInfoSchema = new Schema( TextColorB: Number, TextOrientation: Number }, - { id: false, _id: false } + { _id: false } +); + +export const customizationInfoSchema = new Schema( + { + Anim: String, + AnimPose: Number, + LoadOutPreset: loadoutConfigSchema, + VehiclePreset: loadoutConfigSchema, + EquippedWeapon: String, + AvatarType: String, + LoadOutType: String + }, + { _id: false } ); const placedDecosSchema = new Schema( @@ -44,7 +59,9 @@ const placedDecosSchema = new Schema( Rot: [Number], Scale: Number, Sockets: Number, - PictureFrameInfo: { type: pictureFrameInfoSchema, default: undefined } + PictureFrameInfo: { type: pictureFrameInfoSchema, default: undefined }, + CustomizationInfo: { type: customizationInfoSchema, default: undefined }, + AnimPoseItem: String }, { id: false } ); @@ -60,7 +77,7 @@ placedDecosSchema.set("toJSON", { } }); -const roomSchema = new Schema( +const roomSchema = new Schema( { Name: String, MaxCapacity: Number, diff --git a/src/services/importService.ts b/src/services/importService.ts index 3cfdaffc..3337a243 100644 --- a/src/services/importService.ts +++ b/src/services/importService.ts @@ -47,16 +47,22 @@ import { import { IApartmentClient, IApartmentDatabase, + ICustomizationInfoClient, + ICustomizationInfoDatabase, IFavouriteLoadout, IFavouriteLoadoutDatabase, IGetShipResponse, IOrbiterClient, IOrbiterDatabase, IPersonalRoomsDatabase, + IPlacedDecosClient, + IPlacedDecosDatabase, IPlantClient, IPlantDatabase, IPlanterClient, IPlanterDatabase, + IRoomClient, + IRoomDatabase, ITailorShop, ITailorShopDatabase } from "@/src/types/personalRoomsTypes"; @@ -446,6 +452,30 @@ export const importLoadOutPresets = (db: ILoadoutDatabase, client: ILoadOutPrese db.DRIFTER = client.DRIFTER.map(convertLoadOutConfig); }; +export const convertCustomizationInfo = (client: ICustomizationInfoClient): ICustomizationInfoDatabase => { + return { + ...client, + LoadOutPreset: client.LoadOutPreset ? convertLoadOutConfig(client.LoadOutPreset) : undefined, + VehiclePreset: client.VehiclePreset ? convertLoadOutConfig(client.VehiclePreset) : undefined + }; +}; + +const convertDeco = (client: IPlacedDecosClient): IPlacedDecosDatabase => { + const { id, ...rest } = client; + return { + ...rest, + CustomizationInfo: client.CustomizationInfo ? convertCustomizationInfo(client.CustomizationInfo) : undefined, + _id: new Types.ObjectId(id.$oid) + }; +}; + +const convertRoom = (client: IRoomClient): IRoomDatabase => { + return { + ...client, + PlacedDecos: client.PlacedDecos ? client.PlacedDecos.map(convertDeco) : [] + }; +}; + const convertShip = (client: IOrbiterClient): IOrbiterDatabase => { return { ...client, @@ -453,6 +483,7 @@ const convertShip = (client: IOrbiterClient): IOrbiterDatabase => { ...client.ShipInterior, Colors: Array.isArray(client.ShipInterior.Colors) ? {} : client.ShipInterior.Colors }, + Rooms: client.Rooms.map(convertRoom), FavouriteLoadoutId: client.FavouriteLoadoutId ? new Types.ObjectId(client.FavouriteLoadoutId.$oid) : undefined }; }; @@ -481,6 +512,7 @@ const convertFavouriteLoadout = (client: IFavouriteLoadout): IFavouriteLoadoutDa const convertApartment = (client: IApartmentClient): IApartmentDatabase => { return { ...client, + Rooms: client.Rooms.map(convertRoom), Gardening: { Planters: client.Gardening.Planters.map(convertPlanter) }, FavouriteLoadouts: client.FavouriteLoadouts ? client.FavouriteLoadouts.map(convertFavouriteLoadout) : [] }; @@ -489,6 +521,7 @@ const convertApartment = (client: IApartmentClient): IApartmentDatabase => { const convertTailorShop = (client: ITailorShop): ITailorShopDatabase => { return { ...client, + Rooms: client.Rooms.map(convertRoom), Colors: Array.isArray(client.Colors) ? {} : client.Colors, FavouriteLoadouts: client.FavouriteLoadouts ? client.FavouriteLoadouts.map(convertFavouriteLoadout) : [] }; diff --git a/src/services/shipCustomizationsService.ts b/src/services/shipCustomizationsService.ts index ef5d7e8c..1fdcf7d5 100644 --- a/src/services/shipCustomizationsService.ts +++ b/src/services/shipCustomizationsService.ts @@ -19,6 +19,7 @@ import { Guild } from "@/src/models/guildModel"; import { hasGuildPermission } from "@/src/services/guildService"; import { GuildPermission } from "@/src/types/guildTypes"; import { ExportResources } from "warframe-public-export-plus"; +import { convertCustomizationInfo } from "@/src/services/importService"; export const setShipCustomizations = async ( accountId: string, @@ -269,6 +270,8 @@ export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlaced } placedDeco.PictureFrameInfo = req.PictureFrameInfo; + placedDeco.CustomizationInfo = req.CustomizationInfo ? convertCustomizationInfo(req.CustomizationInfo) : undefined; + placedDeco.AnimPoseItem = req.AnimPoseItem; await personalRooms.save(); }; diff --git a/src/types/personalRoomsTypes.ts b/src/types/personalRoomsTypes.ts index 6a7723a2..45479e2e 100644 --- a/src/types/personalRoomsTypes.ts +++ b/src/types/personalRoomsTypes.ts @@ -1,6 +1,6 @@ import { IColor, IShipAttachments, IShipCustomization } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { Document, Model, Types } from "mongoose"; -import { ILoadoutClient } from "@/src/types/saveLoadoutTypes"; +import { ILoadoutClient, ILoadoutConfigClient, ILoadoutConfigDatabase } from "@/src/types/saveLoadoutTypes"; import { IMongoDate, IOid } from "@/src/types/commonTypes"; export interface IGetShipResponse { @@ -17,7 +17,7 @@ export interface IOrbiterClient { Features: string[]; ShipId: IOid; ShipInterior: IShipCustomization; - Rooms: IRoom[]; + Rooms: IRoomClient[]; VignetteFish?: string[]; FavouriteLoadoutId?: IOid; Wallpaper?: string; @@ -28,7 +28,7 @@ export interface IOrbiterClient { export interface IOrbiterDatabase { Features: string[]; - Rooms: IRoom[]; + Rooms: IRoomDatabase[]; ShipInterior?: IShipCustomization; VignetteFish?: string[]; FavouriteLoadoutId?: Types.ObjectId; @@ -53,12 +53,18 @@ export interface IPersonalRoomsDatabase { TailorShop: ITailorShopDatabase; } -export interface IRoom { +export interface IRoomDatabase { Name: string; MaxCapacity: number; PlacedDecos?: IPlacedDecosDatabase[]; } +export interface IRoomClient { + Name: string; + MaxCapacity: number; + PlacedDecos?: IPlacedDecosClient[]; +} + export interface IPlantClient { PlantType: string; EndTime: IMongoDate; @@ -89,7 +95,7 @@ export interface IGardeningDatabase { export interface IApartmentClient { Gardening: IGardeningClient; - Rooms: IRoom[]; + Rooms: IRoomClient[]; FavouriteLoadouts?: IFavouriteLoadout[]; VideoWallBackdrop?: string; Soundscape?: string; @@ -97,7 +103,7 @@ export interface IApartmentClient { export interface IApartmentDatabase { Gardening: IGardeningDatabase; - Rooms: IRoom[]; + Rooms: IRoomDatabase[]; FavouriteLoadouts: IFavouriteLoadoutDatabase[]; VideoWallBackdrop?: string; Soundscape?: string; @@ -110,11 +116,14 @@ export interface IPlacedDecosDatabase { Scale?: number; Sockets?: number; PictureFrameInfo?: IPictureFrameInfo; + CustomizationInfo?: ICustomizationInfoDatabase; + AnimPoseItem?: string; _id: Types.ObjectId; } -export interface IPlacedDecosClient extends Omit { +export interface IPlacedDecosClient extends Omit { id: IOid; + CustomizationInfo?: ICustomizationInfoClient; } export interface ISetShipCustomizationsRequest { @@ -166,11 +175,13 @@ export interface IResetShipDecorationsResponse { } export interface ISetPlacedDecoInfoRequest { - DecoType: string; + DecoType?: string; DecoId: string; Room: string; - PictureFrameInfo: IPictureFrameInfo; + PictureFrameInfo: IPictureFrameInfo; // IsPicture + CustomizationInfo?: ICustomizationInfoClient; // !IsPicture BootLocation?: TBootLocation; + AnimPoseItem?: string; // !IsPicture ComponentId?: string; GuildId?: string; } @@ -191,6 +202,21 @@ export interface IPictureFrameInfo { TextOrientation: number; } +export interface ICustomizationInfoClient { + Anim?: string; + AnimPose?: number; + LoadOutPreset?: ILoadoutConfigClient; + VehiclePreset?: ILoadoutConfigClient; + EquippedWeapon?: "SUIT_SLOT" | "LONG_GUN_SLOT" | "PISTOL_SLOT"; + AvatarType?: string; + LoadOutType?: string; // "LOT_NORMAL" +} + +export interface ICustomizationInfoDatabase extends Omit { + LoadOutPreset?: ILoadoutConfigDatabase; + VehiclePreset?: ILoadoutConfigDatabase; +} + export interface IFavouriteLoadout { Tag: string; LoadoutId: IOid; @@ -206,10 +232,11 @@ export interface ITailorShopDatabase { Colors?: IColor; CustomJson?: string; LevelDecosVisible?: boolean; - Rooms: IRoom[]; + Rooms: IRoomDatabase[]; } -export interface ITailorShop extends Omit { +export interface ITailorShop extends Omit { + Rooms: IRoomClient[]; FavouriteLoadouts?: IFavouriteLoadout[]; }