From 6dbfa27c14ed7af7a67a8bdad56fb6342d139b0a Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 3 Jun 2024 14:35:54 +0200 Subject: [PATCH] feat: implement startDojoRecipeController to place new rooms in Dojo --- src/controllers/api/getGuildDojoController.ts | 16 ++++++-- .../api/startDojoRecipeController.ts | 41 +++++++++++++++++++ src/models/guildModel.ts | 3 ++ src/routes/api.ts | 2 + src/types/guildTypes.ts | 17 +++++--- 5 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 src/controllers/api/startDojoRecipeController.ts diff --git a/src/controllers/api/getGuildDojoController.ts b/src/controllers/api/getGuildDojoController.ts index cf60ed13..93ccafad 100644 --- a/src/controllers/api/getGuildDojoController.ts +++ b/src/controllers/api/getGuildDojoController.ts @@ -1,7 +1,7 @@ import { RequestHandler } from "express"; import { Types } from "mongoose"; import { Guild } from "@/src/models/guildModel"; -import { IDojoClient } from "@/src/types/guildTypes"; +import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes"; import { toOid, toMongoDate } from "@/src/helpers/inventoryHelpers"; export const getGuildDojoController: RequestHandler = async (req, res) => { @@ -39,13 +39,21 @@ export const getGuildDojoController: RequestHandler = async (req, res) => { DojoComponents: [] }; guild.DojoComponents.forEach(dojoComponent => { - dojo.DojoComponents.push({ + let clientComponent: IDojoComponentClient = { id: toOid(dojoComponent._id), pf: dojoComponent.pf, ppf: dojoComponent.ppf, - CompletionTime: toMongoDate(dojoComponent.CompletionTime), DecoCapacity: 600 - }); + }; + if (dojoComponent.pi) { + clientComponent.pi = toOid(dojoComponent.pi); + clientComponent.op = dojoComponent.op!; + clientComponent.pp = dojoComponent.pp!; + } + if (dojoComponent.CompletionTime) { + clientComponent.CompletionTime = toMongoDate(dojoComponent.CompletionTime); + } + dojo.DojoComponents.push(clientComponent); }); res.json(dojo); }; diff --git a/src/controllers/api/startDojoRecipeController.ts b/src/controllers/api/startDojoRecipeController.ts new file mode 100644 index 00000000..bc61e276 --- /dev/null +++ b/src/controllers/api/startDojoRecipeController.ts @@ -0,0 +1,41 @@ +import { RequestHandler } from "express"; +import { IDojoComponentClient } from "@/src/types/guildTypes"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; +import { Guild } from "@/src/models/guildModel"; +import { Types } from "mongoose"; + +interface IStartDojoRecipeRequest { + PlacedComponent: IDojoComponentClient; + Revision: number; +} + +export const startDojoRecipeController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const inventory = await Inventory.findOne({ accountOwnerId: accountId }); + if (!inventory) { + res.status(400).end(); + return; + } + const guildId = req.query.guildId as string; + if (!inventory.GuildId || inventory.GuildId.toString() != guildId) { + res.status(400).end(); + return; + } + // Verified that a member of the guild is making this request. Assuming they are allowed to start a build. + const guild = (await Guild.findOne({ _id: guildId }))!; + const request = JSON.parse(req.body.toString()) as IStartDojoRecipeRequest; + guild.DojoComponents!.push({ + _id: new Types.ObjectId(), + pf: request.PlacedComponent.pf, + ppf: request.PlacedComponent.ppf, + pi: new Types.ObjectId(request.PlacedComponent.pi!.$oid), + op: request.PlacedComponent.op, + pp: request.PlacedComponent.pp, + CompletionTime: new Date(Date.now()) // TOOD: Omit this field & handle the "Collecting Materials" state. + }); + await guild.save(); + res.json({ + DojoRequestStatus: 0 + }); +}; diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index 157007a0..b83a7d42 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -4,6 +4,9 @@ import { model, Schema } from "mongoose"; const dojoComponentSchema = new Schema({ pf: { type: String, required: true }, ppf: String, + pi: Schema.Types.ObjectId, + op: String, + pp: String, CompletionTime: Date }); diff --git a/src/routes/api.ts b/src/routes/api.ts index fc1a1ee2..bc8066be 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -53,6 +53,7 @@ import { guildTechController } from "../controllers/api/guildTechController"; import { dojoController } from "@/src/controllers/api/dojoController"; import { getGuildDojoController } from "@/src/controllers/api/getGuildDojoController"; import { syndicateSacrificeController } from "../controllers/api/syndicateSacrificeController"; +import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController"; const apiRouter = express.Router(); @@ -116,5 +117,6 @@ apiRouter.post("/sell.php", sellController); apiRouter.post("/upgrades.php", upgradesController); apiRouter.post("/guildTech.php", guildTechController); apiRouter.post("/syndicateSacrifice.php", syndicateSacrificeController); +apiRouter.post("/startDojoRecipe.php", startDojoRecipeController); export { apiRouter }; diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index c969db6a..f23fa4c0 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -1,5 +1,6 @@ import { Types } from "mongoose"; import { IOid, IMongoDate } from "@/src/types/commonTypes"; +import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; export interface IGuild { Name: string; @@ -31,13 +32,17 @@ export interface IDojoComponentClient { id: IOid; pf: string; ppf: string; - CompletionTime: IMongoDate; - DecoCapacity: number; + pi?: IOid; // Parent ID. N/A to root. + op?: string; // "Open Portal"? N/A to root. + pp?: string; // "Parent Portal"? N/A to root. + RegularCredits?: number; // "Collecting Materials" state: Number of credits that were donated. + MiscItems?: IMiscItem[]; // "Collecting Materials" state: Resources that were donated. + CompletionTime?: IMongoDate; + DecoCapacity?: number; } -export interface IDojoComponentDatabase { +export interface IDojoComponentDatabase extends Omit { _id: Types.ObjectId; - pf: string; - ppf: string; - CompletionTime: Date; + pi?: Types.ObjectId; + CompletionTime?: Date; }