feat: decorating the backroom (#604)

This commit is contained in:
Sainan 2024-12-22 20:32:19 +01:00 committed by GitHub
parent cbdd1cd0a7
commit 95bd07b50f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 103 additions and 13 deletions

View File

@ -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) {

View File

@ -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 });
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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: []; // ???
}