From 78f93bd5a71d825f4e0b4011b73d4636df5777c0 Mon Sep 17 00:00:00 2001 From: Master Date: Mon, 5 Jun 2023 01:22:52 +0800 Subject: [PATCH] Add Ship --- .gitignore | 1 + src/controllers/api/getShipController.ts | 20 +++++++++-- src/controllers/api/loginController.ts | 1 + src/models/inventoryModel.ts | 9 ++--- src/models/shipModel.ts | 46 ++++++++++++++++++++++++ src/services/loginService.ts | 2 ++ src/services/shipService.ts | 17 +++++++++ src/types/commonTypes.ts | 3 ++ src/types/inventoryTypes.ts | 5 +-- src/types/shipTypes.ts | 29 +++++++++++++++ static/fixed_responses/postShip.json | 33 +++++++++++++++++ 11 files changed, 155 insertions(+), 11 deletions(-) create mode 100644 src/models/shipModel.ts create mode 100644 src/services/shipService.ts create mode 100644 src/types/commonTypes.ts create mode 100644 src/types/shipTypes.ts create mode 100644 static/fixed_responses/postShip.json diff --git a/.gitignore b/.gitignore index 7d679bbc..05465bae 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /.env /static/data/* +yarn.lock diff --git a/src/controllers/api/getShipController.ts b/src/controllers/api/getShipController.ts index 82f598fe..2da6f8b2 100644 --- a/src/controllers/api/getShipController.ts +++ b/src/controllers/api/getShipController.ts @@ -1,8 +1,22 @@ +import { Account } from "@/src/models/loginModel"; +import { Ship } from "@/src/models/shipModel"; +import { createShip } from "@/src/services/shipService"; import { RequestHandler } from "express"; -import getShip from "@/static/fixed_responses/getShip.json"; -const getShipController: RequestHandler = (_req, res) => { - res.json(getShip); +// eslint-disable-next-line @typescript-eslint/no-misused-promises +const getShipController: RequestHandler = async (_req, res) => { + const accountId = _req.query.accountId; + const ship = await Ship.findOne({ ShipOwnerId: accountId }); + if (!ship) { + const account = await Account.findOne({ _id: accountId }); + if (account) { + await createShip(account._id); + const new_ship = await Ship.findOne({ ShipOwnerId: accountId }); + res.json(new_ship); + return; + } + } + res.json(ship); }; export { getShipController }; diff --git a/src/controllers/api/loginController.ts b/src/controllers/api/loginController.ts index 7819df06..e48e6df0 100644 --- a/src/controllers/api/loginController.ts +++ b/src/controllers/api/loginController.ts @@ -9,6 +9,7 @@ import { createAccount, isCorrectPassword } from "@/src/services/loginService"; import { ILoginResponse } from "@/src/types/loginTypes"; import { DTLS, groups, HUB, IRC, Nonce, NRS, platformCDNs } from "@/static/fixed_responses/login_static"; +// eslint-disable-next-line @typescript-eslint/no-misused-promises const loginController: RequestHandler = async (request, response) => { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument const body = JSON.parse(request.body); // parse octet stream of json data to json object diff --git a/src/models/inventoryModel.ts b/src/models/inventoryModel.ts index bdc2065d..bed6c50c 100644 --- a/src/models/inventoryModel.ts +++ b/src/models/inventoryModel.ts @@ -1,5 +1,6 @@ -import { Document, Schema, model } from "mongoose"; -import { IInventoryDatabase, IInventoryResponse, ISuitDatabase, ISuitDocument, Oid } from "../types/inventoryTypes"; +import { Schema, model } from "mongoose"; +import { IInventoryDatabase, ISuitDatabase } from "../types/inventoryTypes"; +import { Oid } from "../types/commonTypes"; const polaritySchema = new Schema({ Slot: Number, @@ -65,7 +66,7 @@ const suitSchema = new Schema({ }); suitSchema.set("toJSON", { - transform(_document, returnedObject: ISuitDocument) { + transform(_document, returnedObject) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call returnedObject.ItemId = { $oid: returnedObject._id.toString() } satisfies Oid; delete returnedObject._id; @@ -246,7 +247,7 @@ const inventorySchema = new Schema({ }); inventorySchema.set("toJSON", { - transform(_document, returnedObject: ISuitDocument) { + transform(_document, returnedObject) { delete returnedObject._id; delete returnedObject.__v; } diff --git a/src/models/shipModel.ts b/src/models/shipModel.ts new file mode 100644 index 00000000..d782d917 --- /dev/null +++ b/src/models/shipModel.ts @@ -0,0 +1,46 @@ +import { Schema, model } from "mongoose"; +import { IShipDatabase } from "../types/shipTypes"; +import { Oid } from "../types/commonTypes"; + +const roomSchema = new Schema({ + Name: String, + MaxCapacity: Number +}); + +roomSchema.set("toJSON", { + transform(_document, returnedObject) { + delete returnedObject._id; + } +}); + +const shipSchema = new Schema({ + Rooms: [roomSchema], + Features: [Schema.Types.Mixed], + ContentUrlSignature: String +}); + +const apartmentSchema = new Schema({ + Rooms: [roomSchema], + FavouriteLoadouts: [Schema.Types.Mixed] +}); + +const shipDatabaseSchema = new Schema({ + ShipOwnerId: String, + Ship: shipSchema, + Apartment: apartmentSchema +}); + +shipDatabaseSchema.set("toJSON", { + transform(_document, returnedObject) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + returnedObject.Ship.ShipId = { $oid: returnedObject._id.toString() } satisfies Oid; + delete returnedObject._id; + delete returnedObject.Ship._id; + delete returnedObject.Apartment._id; + delete returnedObject.__v; + } +}); + +const Ship = model("Ship", shipDatabaseSchema); + +export { Ship }; diff --git a/src/services/loginService.ts b/src/services/loginService.ts index c110d491..9e7959f0 100644 --- a/src/services/loginService.ts +++ b/src/services/loginService.ts @@ -1,6 +1,7 @@ import { Account } from "@/src/models/loginModel"; import { createInventory } from "@/src/services/inventoryService"; import { IDatabaseAccount } from "@/src/types/loginTypes"; +import { createShip } from "./shipService"; const isCorrectPassword = (requestPassword: string, databasePassword: string): boolean => { return requestPassword === databasePassword; @@ -11,6 +12,7 @@ const createAccount = async (accountData: IDatabaseAccount) => { try { await account.save(); await createInventory(account._id); + await createShip(account._id); return account.toJSON(); } catch (error) { if (error instanceof Error) { diff --git a/src/services/shipService.ts b/src/services/shipService.ts new file mode 100644 index 00000000..8d131f1a --- /dev/null +++ b/src/services/shipService.ts @@ -0,0 +1,17 @@ +import { Ship } from "@/src/models/shipModel"; +import new_ship from "@/static/fixed_responses/postShip.json"; +import { Types } from "mongoose"; + +const createShip = async (accountOwnerId: Types.ObjectId) => { + try { + const ship = new Ship({ ...new_ship, ShipOwnerId: accountOwnerId }); + await ship.save(); + } catch (error) { + if (error instanceof Error) { + throw new Error(`error creating inventory" ${error.message}`); + } + throw new Error("error creating inventory that is not of instance Error"); + } +}; + +export { createShip }; diff --git a/src/types/commonTypes.ts b/src/types/commonTypes.ts new file mode 100644 index 00000000..4c1a7bf7 --- /dev/null +++ b/src/types/commonTypes.ts @@ -0,0 +1,3 @@ +export interface Oid { + $oid: string; +} diff --git a/src/types/inventoryTypes.ts b/src/types/inventoryTypes.ts index 70bac7ce..025dfcf3 100644 --- a/src/types/inventoryTypes.ts +++ b/src/types/inventoryTypes.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Document, Types } from "mongoose"; +import { Oid } from "./commonTypes"; export interface IInventoryDatabase extends IInventoryResponse { accountOwnerId: Types.ObjectId; @@ -187,10 +188,6 @@ export interface AdultOperatorLoadOut { ItemId: Oid; } -export interface Oid { - $oid: string; -} - export interface Color { t0?: number; t1?: number; diff --git a/src/types/shipTypes.ts b/src/types/shipTypes.ts new file mode 100644 index 00000000..7a180521 --- /dev/null +++ b/src/types/shipTypes.ts @@ -0,0 +1,29 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { Types } from "mongoose"; +import { Oid } from "./inventoryTypes"; + +export type IShipDatabase = IShipResponse; + +export interface IShipResponse { + ShipOwnerId: Types.ObjectId; + Ship: IShipClass; + Apartment: IApartmentClass; +} + +export interface IShipClass { + Rooms: IRoomsClass[]; + ShipId: Oid; + Features: string[]; + ContentUrlSignature: string; +} + +export interface IRoomsClass { + Name: string; + MaxCapacity: number; +} + +export interface IApartmentClass { + Rooms: IRoomsClass[]; + FavouriteLoadouts: string[]; +} diff --git a/static/fixed_responses/postShip.json b/static/fixed_responses/postShip.json new file mode 100644 index 00000000..aeb53b93 --- /dev/null +++ b/static/fixed_responses/postShip.json @@ -0,0 +1,33 @@ +{ + "ShipOwnerId": "removed", + "Ship": { + "Features": [ + "/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SocialMenuFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem" + ], + "ShipId": { "$oid": "removed" }, + "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 } + ], + "ContentUrlSignature": "removed" + }, + "Apartment": { + "Rooms": [ + { "Name": "ElevatorLanding", "MaxCapacity": 1600 }, + { "Name": "ApartmentRoomA", "MaxCapacity": 1000 }, + { "Name": "ApartmentRoomB", "MaxCapacity": 1600 }, + { "Name": "ApartmentRoomC", "MaxCapacity": 1600 }, + { "Name": "DuviriHallway", "MaxCapacity": 1600 } + ], + "FavouriteLoadouts": [] + } +}