feat: decorating the backroom #604
@ -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) {
|
||||
|
@ -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 });
|
||||
}
|
||||
}
|
||||
|
@ -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<IPictureFrameInfo>(
|
||||
@ -44,7 +52,7 @@ placedDecosSchema.set("toJSON", {
|
||||
}
|
||||
});
|
||||
|
||||
const roomSchema = new Schema(
|
||||
const roomSchema = new Schema<IRoom>(
|
||||
{
|
||||
Name: String,
|
||||
MaxCapacity: Number,
|
||||
@ -76,11 +84,59 @@ const orbiterSchema = new Schema<IOrbiter>(
|
||||
{ _id: false }
|
||||
);
|
||||
|
||||
const favouriteLoadoutSchema = new Schema<IFavouriteLoadoutDatabase>(
|
||||
{
|
||||
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<ITailorShopDatabase>(
|
||||
{
|
||||
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<IPersonalRooms>({
|
||||
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<IPersonalRooms, PersonalRoomsModelType>("PersonalRooms", personalRoomsSchema);
|
||||
|
@ -37,7 +37,12 @@ export const handleSetShipDecorations = async (
|
||||
): Promise<IShipDecorationsResponse> => {
|
||||
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);
|
||||
|
||||
|
@ -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<IPlacedDecosDatabase> };
|
||||
@ -24,6 +25,9 @@ export type PersonalRoomsDocumentProps = {
|
||||
Apartment: Omit<IApartment, "Rooms"> & {
|
||||
Rooms: RoomsType[];
|
||||
};
|
||||
TailorShop: Omit<ITailorShop, "Rooms"> & {
|
||||
Rooms: RoomsType[];
|
||||
};
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
||||
|
@ -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<ITailorShopDatabase, "FavouriteLoadouts"> {
|
||||
FavouriteLoadouts: IFavouriteLoadout[];
|
||||
Colors: []; // ???
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user
💡 Codebase verification
CustomJson field requires schema validation and type safety improvements
Based on the codebase analysis, the CustomJson field appears to be a string type that's intended to store JSON data, but lacks proper validation and type safety:
CustomJson: String
)Recommendations:
🔗 Analysis chain
Verify the purpose of CustomJson default value.
The default value of
"{}"
for CustomJson seems unusual. Consider:Let me gather more context about the CustomJson field usage in the codebase.
Let me try one more search to understand if this field is used in any API endpoints or data transformations.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 994
Script:
Length of output: 95
Script:
Length of output: 165