SpaceNinjaServer/src/models/personalRoomsModel.ts

159 lines
4.6 KiB
TypeScript
Raw Normal View History

import { toOid } from "@/src/helpers/inventoryHelpers";
2024-12-23 09:15:41 +01:00
import { colorSchema } from "@/src/models/inventoryModels/inventoryModel";
import { IOrbiter, IPersonalRoomsDatabase, PersonalRoomsModelType } from "@/src/types/personalRoomsTypes";
2024-12-22 20:32:19 +01:00
import {
IApartment,
IFavouriteLoadoutDatabase,
IGardening,
IPlacedDecosDatabase,
IPictureFrameInfo,
IRoom,
ITailorShopDatabase
} from "@/src/types/shipTypes";
import { Schema, model } from "mongoose";
const pictureFrameInfoSchema = new Schema<IPictureFrameInfo>(
{
Image: String,
Filter: String,
XOffset: Number,
YOffset: Number,
Scale: Number,
InvertX: Boolean,
InvertY: Boolean,
ColorCorrection: Number,
Text: String,
TextScale: Number,
TextColorA: Number,
TextColorB: Number,
TextOrientation: Number
},
{ id: false, _id: false }
);
const placedDecosSchema = new Schema<IPlacedDecosDatabase>(
{
Type: String,
Pos: [Number],
2024-06-15 17:39:13 +02:00
Rot: [Number],
Scale: Number,
PictureFrameInfo: { type: pictureFrameInfoSchema, default: undefined }
},
{ id: false }
);
placedDecosSchema.virtual("id").get(function (this: IPlacedDecosDatabase) {
return toOid(this._id);
});
placedDecosSchema.set("toJSON", {
virtuals: true,
transform(_document, returnedObject) {
delete returnedObject._id;
}
});
2024-12-22 20:32:19 +01:00
const roomSchema = new Schema<IRoom>(
{
Name: String,
MaxCapacity: Number,
PlacedDecos: { type: [placedDecosSchema], default: undefined }
},
{ _id: false }
);
const gardeningSchema = new Schema<IGardening>({
Planters: [Schema.Types.Mixed] //TODO: add when implementing gardening
});
const apartmentSchema = new Schema<IApartment>(
{
Rooms: [roomSchema],
FavouriteLoadouts: [Schema.Types.Mixed],
2025-01-24 14:13:21 +01:00
Gardening: gardeningSchema // TODO: ensure this is correct
},
{ _id: false }
);
const apartmentDefault: IApartment = {
Rooms: [
{ Name: "ElevatorLanding", MaxCapacity: 1600 },
{ Name: "ApartmentRoomA", MaxCapacity: 1000 },
{ Name: "ApartmentRoomB", MaxCapacity: 1600 },
{ Name: "ApartmentRoomC", MaxCapacity: 1600 },
{ Name: "DuviriHallway", MaxCapacity: 1600 }
],
FavouriteLoadouts: [],
Gardening: {}
};
const orbiterSchema = new Schema<IOrbiter>(
2024-05-06 15:39:27 +02:00
{
Features: [String],
Rooms: [roomSchema],
ContentUrlSignature: { type: String, required: false },
2024-05-06 15:39:27 +02:00
BootLocation: String
},
{ _id: false }
);
const orbiterDefault: IOrbiter = {
2025-01-24 14:13:21 +01:00
Features: ["/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem"], //TODO: potentially remove after missionstarting gear
Rooms: [
{ Name: "AlchemyRoom", MaxCapacity: 1600 },
{ Name: "BridgeRoom", MaxCapacity: 1600 },
{ Name: "LisetRoom", MaxCapacity: 1000 },
{ Name: "OperatorChamberRoom", MaxCapacity: 1600 },
{ Name: "OutsideRoom", MaxCapacity: 1600 },
{ Name: "PersonalQuartersRoom", MaxCapacity: 1600 }
]
};
2024-12-22 20:32:19 +01:00
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],
Colors: { type: colorSchema, required: false },
2024-12-22 20:32:19 +01:00
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 }
2024-12-22 20:32:19 +01:00
]
};
export const personalRoomsSchema = new Schema<IPersonalRoomsDatabase>({
personalRoomsOwnerId: Schema.Types.ObjectId,
activeShipId: Schema.Types.ObjectId,
2024-12-23 09:15:41 +01:00
ShipInteriorColors: colorSchema,
Ship: { type: orbiterSchema, default: orbiterDefault },
Apartment: { type: apartmentSchema, default: apartmentDefault },
TailorShop: { type: tailorShopSchema, default: tailorShopDefault }
});
export const PersonalRooms = model<IPersonalRoomsDatabase, PersonalRoomsModelType>(
"PersonalRooms",
personalRoomsSchema
);