From dc8a9a21d9739572956f19c476157457b16fd548 Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 3 Mar 2025 12:45:58 +0100 Subject: [PATCH] chore: turn guild DojoComponents into a DocumentArray and use .id for setDojoComponentMessage --- .../api/changeDojoRootController.ts | 6 ++--- src/controllers/api/getGuildDojoController.ts | 6 ++--- ...queueDojoComponentDestructionController.ts | 4 +-- .../api/setDojoComponentMessageController.ts | 2 +- .../api/startDojoRecipeController.ts | 2 +- src/models/guildModel.ts | 25 ++++++++++++++++--- src/services/guildService.ts | 16 +++--------- src/types/guildTypes.ts | 2 +- 8 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/controllers/api/changeDojoRootController.ts b/src/controllers/api/changeDojoRootController.ts index 568bf688..d54e564a 100644 --- a/src/controllers/api/changeDojoRootController.ts +++ b/src/controllers/api/changeDojoRootController.ts @@ -9,7 +9,7 @@ export const changeDojoRootController: RequestHandler = async (req, res) => { // At this point, we know that a member of the guild is making this request. Assuming they are allowed to change the root. const idToNode: Record = {}; - guild.DojoComponents!.forEach(x => { + guild.DojoComponents.forEach(x => { idToNode[x._id.toString()] = { component: x, parent: undefined, @@ -18,7 +18,7 @@ export const changeDojoRootController: RequestHandler = async (req, res) => { }); let oldRoot: INode | undefined; - guild.DojoComponents!.forEach(x => { + guild.DojoComponents.forEach(x => { const node = idToNode[x._id.toString()]; if (x.pi) { idToNode[x.pi.toString()].children.push(node); @@ -47,7 +47,7 @@ export const changeDojoRootController: RequestHandler = async (req, res) => { ); top.children.forEach(x => stack.push(x)); } - guild.DojoComponents!.forEach(x => { + guild.DojoComponents.forEach(x => { x._id = idMap[x._id.toString()]; if (x.pi) { x.pi = idMap[x.pi.toString()]; diff --git a/src/controllers/api/getGuildDojoController.ts b/src/controllers/api/getGuildDojoController.ts index 9d7ed93f..1340902e 100644 --- a/src/controllers/api/getGuildDojoController.ts +++ b/src/controllers/api/getGuildDojoController.ts @@ -13,15 +13,15 @@ export const getGuildDojoController: RequestHandler = async (req, res) => { } // Populate dojo info if not present - if (!guild.DojoComponents || guild.DojoComponents.length == 0) { - guild.DojoComponents = [ + if (guild.DojoComponents.length == 0) { + guild.DojoComponents.push([ { _id: new Types.ObjectId(), pf: "/Lotus/Levels/ClanDojo/DojoHall.level", ppf: "", CompletionTime: new Date(Date.now()) } - ]; + ]); await guild.save(); } diff --git a/src/controllers/api/queueDojoComponentDestructionController.ts b/src/controllers/api/queueDojoComponentDestructionController.ts index 7f612896..750f8392 100644 --- a/src/controllers/api/queueDojoComponentDestructionController.ts +++ b/src/controllers/api/queueDojoComponentDestructionController.ts @@ -5,8 +5,8 @@ import { ExportDojoRecipes } from "warframe-public-export-plus"; export const queueDojoComponentDestructionController: RequestHandler = async (req, res) => { const guild = await getGuildForRequest(req); const componentId = req.query.componentId as string; - const component = guild.DojoComponents!.splice( - guild.DojoComponents!.findIndex(x => x._id.toString() === componentId), + const component = guild.DojoComponents.splice( + guild.DojoComponents.findIndex(x => x._id.toString() === componentId), 1 )[0]; const room = Object.values(ExportDojoRecipes.rooms).find(x => x.resultType == component.pf); diff --git a/src/controllers/api/setDojoComponentMessageController.ts b/src/controllers/api/setDojoComponentMessageController.ts index 714dd7a5..0b75838b 100644 --- a/src/controllers/api/setDojoComponentMessageController.ts +++ b/src/controllers/api/setDojoComponentMessageController.ts @@ -4,7 +4,7 @@ import { getDojoClient, 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 component = guild.DojoComponents.id(req.query.componentId as string)!; const payload = JSON.parse(String(req.body)) as SetDojoComponentMessageRequest; if ("Name" in payload) { component.Name = payload.Name; diff --git a/src/controllers/api/startDojoRecipeController.ts b/src/controllers/api/startDojoRecipeController.ts index 6fd2b5a9..b449b2ed 100644 --- a/src/controllers/api/startDojoRecipeController.ts +++ b/src/controllers/api/startDojoRecipeController.ts @@ -20,7 +20,7 @@ export const startDojoRecipeController: RequestHandler = async (req, res) => { guild.DojoEnergy += room.energy; } - guild.DojoComponents!.push({ + guild.DojoComponents.push({ _id: new Types.ObjectId(), pf: request.PlacedComponent.pf, ppf: request.PlacedComponent.ppf, diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index 0582dc64..781fcd24 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -4,7 +4,7 @@ import { ITechProjectDatabase, ITechProjectClient } from "@/src/types/guildTypes"; -import { model, Schema } from "mongoose"; +import { Document, Model, model, Schema, Types } from "mongoose"; import { typeCountSchema } from "./inventoryModels/inventoryModel"; import { toMongoDate } from "../helpers/inventoryHelpers"; @@ -44,7 +44,7 @@ techProjectSchema.set("toJSON", { const guildSchema = new Schema( { Name: { type: String, required: true }, - DojoComponents: [dojoComponentSchema], + DojoComponents: { type: [dojoComponentSchema], default: [] }, DojoCapacity: { type: Number, default: 100 }, DojoEnergy: { type: Number, default: 5 }, TechProjects: { type: [techProjectSchema], default: undefined } @@ -52,4 +52,23 @@ const guildSchema = new Schema( { id: false } ); -export const Guild = model("Guild", guildSchema); +type GuildDocumentProps = { + DojoComponents: Types.DocumentArray; +}; + +// eslint-disable-next-line @typescript-eslint/ban-types +type GuildModel = Model; + +export const Guild = model("Guild", guildSchema); + +// eslint-disable-next-line @typescript-eslint/ban-types +export type TGuildDatabaseDocument = Document & + Omit< + IGuildDatabase & { + _id: Types.ObjectId; + } & { + __v: number; + }, + keyof GuildDocumentProps + > & + GuildDocumentProps; diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 210bc1a6..6c556ff4 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -1,10 +1,9 @@ import { Request } from "express"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { getInventory } from "@/src/services/inventoryService"; -import { Guild } from "@/src/models/guildModel"; +import { Guild, TGuildDatabaseDocument } from "@/src/models/guildModel"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; -import { IDojoClient, IDojoComponentClient, IGuildDatabase } from "@/src/types/guildTypes"; -import { Document, Types } from "mongoose"; +import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes"; import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; export const getGuildForRequest = async (req: Request): Promise => { @@ -41,7 +40,7 @@ export const getDojoClient = (guild: TGuildDatabaseDocument, status: number): ID DojoRequestStatus: status, DojoComponents: [] }; - guild.DojoComponents!.forEach(dojoComponent => { + guild.DojoComponents.forEach(dojoComponent => { const clientComponent: IDojoComponentClient = { id: toOid(dojoComponent._id), pf: dojoComponent.pf, @@ -62,12 +61,3 @@ export const getDojoClient = (guild: TGuildDatabaseDocument, status: number): ID }); return dojo; }; - -// eslint-disable-next-line @typescript-eslint/ban-types -export type TGuildDatabaseDocument = Document & - IGuildDatabase & - Required<{ - _id: Types.ObjectId; - }> & { - __v: number; - }; diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index 28a51c71..05c60aee 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -8,7 +8,7 @@ export interface IGuild { export interface IGuildDatabase extends IGuild { _id: Types.ObjectId; - DojoComponents?: IDojoComponentDatabase[]; + DojoComponents: IDojoComponentDatabase[]; DojoCapacity: number; DojoEnergy: number; TechProjects?: ITechProjectDatabase[];