feat: implement startDojoRecipeController to place new rooms in Dojo

This commit is contained in:
Sainan 2024-06-03 14:35:54 +02:00
parent fd79450957
commit 6dbfa27c14
5 changed files with 69 additions and 10 deletions

View File

@ -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);
};

View File

@ -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
});
};

View File

@ -4,6 +4,9 @@ import { model, Schema } from "mongoose";
const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
pf: { type: String, required: true },
ppf: String,
pi: Schema.Types.ObjectId,
op: String,
pp: String,
CompletionTime: Date
});

View File

@ -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 };

View File

@ -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<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "DecoCapacity"> {
_id: Types.ObjectId;
pf: string;
ppf: string;
CompletionTime: Date;
pi?: Types.ObjectId;
CompletionTime?: Date;
}