From 8b76eaffe8031c68461cffbf2f9d27f62d431940 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 00:22:18 +0100 Subject: [PATCH 1/5] feat: setDojoComponentMessage --- src/controllers/api/getGuildDojoController.ts | 2 ++ .../api/setDojoComponentMessageController.ts | 20 +++++++++++++++++++ src/models/guildModel.ts | 2 ++ src/routes/api.ts | 2 ++ src/types/guildTypes.ts | 2 ++ 5 files changed, 28 insertions(+) create mode 100644 src/controllers/api/setDojoComponentMessageController.ts diff --git a/src/controllers/api/getGuildDojoController.ts b/src/controllers/api/getGuildDojoController.ts index e16040aa..f632cf9a 100644 --- a/src/controllers/api/getGuildDojoController.ts +++ b/src/controllers/api/getGuildDojoController.ts @@ -43,6 +43,8 @@ export const getGuildDojoController: RequestHandler = async (req, res) => { id: toOid(dojoComponent._id), pf: dojoComponent.pf, ppf: dojoComponent.ppf, + Name: dojoComponent.Name, + Message: dojoComponent.Message, DecoCapacity: 600 }; if (dojoComponent.pi) { diff --git a/src/controllers/api/setDojoComponentMessageController.ts b/src/controllers/api/setDojoComponentMessageController.ts new file mode 100644 index 00000000..8e05d058 --- /dev/null +++ b/src/controllers/api/setDojoComponentMessageController.ts @@ -0,0 +1,20 @@ +import { RequestHandler } from "express"; +import { getGuildForRequest } from "@/src/services/guildService"; + +export const setDojoComponentMessageController: RequestHandler = async (req, res) => { + const guild = await getGuildForRequest(req); + // At this point, we know that a member of the guild is making this request. Assuming they are allowed to change the message. + const component = guild.DojoComponents!.find(x => x._id.equals(req.query.componentId as string))!; + const payload = JSON.parse(String(req.body)) as SetDojoComponentMessageRequest; + if ("Name" in payload) { + component.Name = payload.Name; + } else { + component.Message = payload.Message; + } + await guild.save(); + res.json({ + DojoRequestStatus: 1 + }); +}; + +type SetDojoComponentMessageRequest = { Name: string } | { Message: string }; diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index ab87e719..0582dc64 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -14,6 +14,8 @@ const dojoComponentSchema = new Schema({ pi: Schema.Types.ObjectId, op: String, pp: String, + Name: String, + Message: String, CompletionTime: Date }); diff --git a/src/routes/api.ts b/src/routes/api.ts index 4d2571c0..a0eeba20 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -62,6 +62,7 @@ import { sellController } from "@/src/controllers/api/sellController"; import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestController"; import { setActiveShipController } from "@/src/controllers/api/setActiveShipController"; import { setBootLocationController } from "@/src/controllers/api/setBootLocationController"; +import { setDojoComponentMessageController } from "@/src/controllers/api/setDojoComponentMessageController"; import { setEquippedInstrumentController } from "@/src/controllers/api/setEquippedInstrumentController"; import { setPlacedDecoInfoController } from "@/src/controllers/api/setPlacedDecoInfoController"; import { setShipCustomizationsController } from "@/src/controllers/api/setShipCustomizationsController"; @@ -158,6 +159,7 @@ apiRouter.post("/rerollRandomMod.php", rerollRandomModController); apiRouter.post("/saveDialogue.php", saveDialogueController); apiRouter.post("/saveLoadout.php", saveLoadoutController); apiRouter.post("/sell.php", sellController); +apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController); apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController); apiRouter.post("/setPlacedDecoInfo.php", setPlacedDecoInfoController); apiRouter.post("/setShipCustomizations.php", setShipCustomizationsController); diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index 1778582f..827e5d9a 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -34,6 +34,8 @@ export interface IDojoComponentClient { pi?: IOid; // Parent ID. N/A to root. op?: string; // "Open Portal"? N/A to root. pp?: string; // "Parent Portal"? N/A to root. + Name?: string; + Message?: string; RegularCredits?: number; // "Collecting Materials" state: Number of credits that were donated. MiscItems?: IMiscItem[]; // "Collecting Materials" state: Resources that were donated. CompletionTime?: IMongoDate; -- 2.47.2 From e1e363b340ce6f37271917c17de2794a035fb323 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 01:49:14 +0100 Subject: [PATCH 2/5] add TGuildDatabaseDocument --- src/services/guildService.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 1fcddad4..07d06b81 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -3,14 +3,19 @@ import { getAccountIdForRequest } from "@/src/services/loginService"; import { getInventory } from "@/src/services/inventoryService"; import { Guild } from "@/src/models/guildModel"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; +import { IGuildDatabase } from "@/src/types/guildTypes"; +import { Document, Types } from "mongoose"; -export const getGuildForRequest = async (req: Request) => { +export const getGuildForRequest = async (req: Request): Promise => { const accountId = await getAccountIdForRequest(req); const inventory = await getInventory(accountId); return await getGuildForRequestEx(req, inventory); }; -export const getGuildForRequestEx = async (req: Request, inventory: TInventoryDatabaseDocument) => { +export const getGuildForRequestEx = async ( + req: Request, + inventory: TInventoryDatabaseDocument +): Promise => { const guildId = req.query.guildId as string; if (!inventory.GuildId || inventory.GuildId.toString() != guildId) { throw new Error("Account is not in the guild that it has sent a request for"); @@ -21,3 +26,12 @@ export const getGuildForRequestEx = async (req: Request, inventory: TInventoryDa } return guild; }; + +// eslint-disable-next-line @typescript-eslint/ban-types +type TGuildDatabaseDocument = Document & + IGuildDatabase & + Required<{ + _id: Types.ObjectId; + }> & { + __v: number; + }; -- 2.47.2 From d8c92d1d9ff23b5614f31bfae01538d4a0298924 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 01:52:02 +0100 Subject: [PATCH 3/5] add getDojoClient --- src/controllers/api/getGuildDojoController.ts | 36 +---------------- src/services/guildService.ts | 40 ++++++++++++++++++- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/src/controllers/api/getGuildDojoController.ts b/src/controllers/api/getGuildDojoController.ts index f632cf9a..c3a19056 100644 --- a/src/controllers/api/getGuildDojoController.ts +++ b/src/controllers/api/getGuildDojoController.ts @@ -1,8 +1,7 @@ import { RequestHandler } from "express"; import { Types } from "mongoose"; import { Guild } from "@/src/models/guildModel"; -import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes"; -import { toOid, toMongoDate } from "@/src/helpers/inventoryHelpers"; +import { getDojoClient } from "@/src/services/guildService"; export const getGuildDojoController: RequestHandler = async (req, res) => { const guildId = req.query.guildId as string; @@ -26,36 +25,5 @@ export const getGuildDojoController: RequestHandler = async (req, res) => { await guild.save(); } - const dojo: IDojoClient = { - _id: { $oid: guildId }, - Name: guild.Name, - Tier: 1, - FixedContributions: true, - DojoRevision: 1, - RevisionTime: Math.round(Date.now() / 1000), - Energy: guild.DojoEnergy, - Capacity: guild.DojoCapacity, - DojoRequestStatus: 0, - DojoComponents: [] - }; - guild.DojoComponents.forEach(dojoComponent => { - const clientComponent: IDojoComponentClient = { - id: toOid(dojoComponent._id), - pf: dojoComponent.pf, - ppf: dojoComponent.ppf, - Name: dojoComponent.Name, - Message: dojoComponent.Message, - 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); + res.json(getDojoClient(guild)); }; diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 07d06b81..0f2c6dce 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -3,8 +3,9 @@ import { getAccountIdForRequest } from "@/src/services/loginService"; import { getInventory } from "@/src/services/inventoryService"; import { Guild } from "@/src/models/guildModel"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; -import { IGuildDatabase } from "@/src/types/guildTypes"; +import { IDojoClient, IDojoComponentClient, IGuildDatabase } from "@/src/types/guildTypes"; import { Document, Types } from "mongoose"; +import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; export const getGuildForRequest = async (req: Request): Promise => { const accountId = await getAccountIdForRequest(req); @@ -27,8 +28,43 @@ export const getGuildForRequestEx = async ( return guild; }; +export const getDojoClient = (guild: TGuildDatabaseDocument): IDojoClient => { + const dojo: IDojoClient = { + _id: { $oid: guild._id.toString() }, + Name: guild.Name, + Tier: 1, + FixedContributions: true, + DojoRevision: 1, + RevisionTime: Math.round(Date.now() / 1000), + Energy: guild.DojoEnergy, + Capacity: guild.DojoCapacity, + DojoRequestStatus: 0, + DojoComponents: [] + }; + guild.DojoComponents!.forEach(dojoComponent => { + const clientComponent: IDojoComponentClient = { + id: toOid(dojoComponent._id), + pf: dojoComponent.pf, + ppf: dojoComponent.ppf, + Name: dojoComponent.Name, + Message: dojoComponent.Message, + 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); + }); + return dojo; +}; + // eslint-disable-next-line @typescript-eslint/ban-types -type TGuildDatabaseDocument = Document & +export type TGuildDatabaseDocument = Document & IGuildDatabase & Required<{ _id: Types.ObjectId; -- 2.47.2 From b024f19b753444486acd9eeb4ad7c345127fe6b2 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 01:53:30 +0100 Subject: [PATCH 4/5] don't reload dojo after changing a component message --- src/controllers/api/setDojoComponentMessageController.ts | 6 ++---- src/services/guildService.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/controllers/api/setDojoComponentMessageController.ts b/src/controllers/api/setDojoComponentMessageController.ts index 8e05d058..179cddf4 100644 --- a/src/controllers/api/setDojoComponentMessageController.ts +++ b/src/controllers/api/setDojoComponentMessageController.ts @@ -1,5 +1,5 @@ import { RequestHandler } from "express"; -import { getGuildForRequest } from "@/src/services/guildService"; +import { getDojoClient, getGuildForRequest } from "@/src/services/guildService"; export const setDojoComponentMessageController: RequestHandler = async (req, res) => { const guild = await getGuildForRequest(req); @@ -12,9 +12,7 @@ export const setDojoComponentMessageController: RequestHandler = async (req, res component.Message = payload.Message; } await guild.save(); - res.json({ - DojoRequestStatus: 1 - }); + res.json(getDojoClient(guild)); }; type SetDojoComponentMessageRequest = { Name: string } | { Message: string }; diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 0f2c6dce..723c6348 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -38,7 +38,7 @@ export const getDojoClient = (guild: TGuildDatabaseDocument): IDojoClient => { RevisionTime: Math.round(Date.now() / 1000), Energy: guild.DojoEnergy, Capacity: guild.DojoCapacity, - DojoRequestStatus: 0, + DojoRequestStatus: 1, DojoComponents: [] }; guild.DojoComponents!.forEach(dojoComponent => { -- 2.47.2 From ba9b8cc736b966206e7095c9cce43a6c9957373d Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 04:57:43 +0100 Subject: [PATCH 5/5] use getDojoClient for all responses to avoid double-reloading --- src/controllers/api/getGuildDojoController.ts | 2 +- .../api/queueDojoComponentDestructionController.ts | 6 ++---- src/controllers/api/setDojoComponentMessageController.ts | 2 +- src/controllers/api/startDojoRecipeController.ts | 6 ++---- src/services/guildService.ts | 4 ++-- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/controllers/api/getGuildDojoController.ts b/src/controllers/api/getGuildDojoController.ts index c3a19056..9d7ed93f 100644 --- a/src/controllers/api/getGuildDojoController.ts +++ b/src/controllers/api/getGuildDojoController.ts @@ -25,5 +25,5 @@ export const getGuildDojoController: RequestHandler = async (req, res) => { await guild.save(); } - res.json(getDojoClient(guild)); + res.json(getDojoClient(guild, 0)); }; diff --git a/src/controllers/api/queueDojoComponentDestructionController.ts b/src/controllers/api/queueDojoComponentDestructionController.ts index da84c40f..7f612896 100644 --- a/src/controllers/api/queueDojoComponentDestructionController.ts +++ b/src/controllers/api/queueDojoComponentDestructionController.ts @@ -1,4 +1,4 @@ -import { getGuildForRequest } from "@/src/services/guildService"; +import { getDojoClient, getGuildForRequest } from "@/src/services/guildService"; import { RequestHandler } from "express"; import { ExportDojoRecipes } from "warframe-public-export-plus"; @@ -15,7 +15,5 @@ export const queueDojoComponentDestructionController: RequestHandler = async (re guild.DojoEnergy -= room.energy; } await guild.save(); - res.json({ - DojoRequestStatus: 1 - }); + res.json(getDojoClient(guild, 1)); }; diff --git a/src/controllers/api/setDojoComponentMessageController.ts b/src/controllers/api/setDojoComponentMessageController.ts index 179cddf4..714dd7a5 100644 --- a/src/controllers/api/setDojoComponentMessageController.ts +++ b/src/controllers/api/setDojoComponentMessageController.ts @@ -12,7 +12,7 @@ export const setDojoComponentMessageController: RequestHandler = async (req, res component.Message = payload.Message; } await guild.save(); - res.json(getDojoClient(guild)); + res.json(getDojoClient(guild, 1)); }; type SetDojoComponentMessageRequest = { Name: string } | { Message: string }; diff --git a/src/controllers/api/startDojoRecipeController.ts b/src/controllers/api/startDojoRecipeController.ts index 625912d5..6fd2b5a9 100644 --- a/src/controllers/api/startDojoRecipeController.ts +++ b/src/controllers/api/startDojoRecipeController.ts @@ -1,6 +1,6 @@ import { RequestHandler } from "express"; import { IDojoComponentClient } from "@/src/types/guildTypes"; -import { getGuildForRequest } from "@/src/services/guildService"; +import { getDojoClient, getGuildForRequest } from "@/src/services/guildService"; import { Types } from "mongoose"; import { ExportDojoRecipes } from "warframe-public-export-plus"; @@ -30,7 +30,5 @@ export const startDojoRecipeController: RequestHandler = async (req, res) => { CompletionTime: new Date(Date.now()) // TOOD: Omit this field & handle the "Collecting Materials" state. }); await guild.save(); - res.json({ - DojoRequestStatus: 0 - }); + res.json(getDojoClient(guild, 0)); }; diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 723c6348..210bc1a6 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -28,7 +28,7 @@ export const getGuildForRequestEx = async ( return guild; }; -export const getDojoClient = (guild: TGuildDatabaseDocument): IDojoClient => { +export const getDojoClient = (guild: TGuildDatabaseDocument, status: number): IDojoClient => { const dojo: IDojoClient = { _id: { $oid: guild._id.toString() }, Name: guild.Name, @@ -38,7 +38,7 @@ export const getDojoClient = (guild: TGuildDatabaseDocument): IDojoClient => { RevisionTime: Math.round(Date.now() / 1000), Energy: guild.DojoEnergy, Capacity: guild.DojoCapacity, - DojoRequestStatus: 1, + DojoRequestStatus: status, DojoComponents: [] }; guild.DojoComponents!.forEach(dojoComponent => { -- 2.47.2