diff --git a/src/controllers/api/contributeToVaultController.ts b/src/controllers/api/contributeToVaultController.ts new file mode 100644 index 00000000..dd8b18fa --- /dev/null +++ b/src/controllers/api/contributeToVaultController.ts @@ -0,0 +1,49 @@ +import { getGuildForRequestEx } from "@/src/services/guildService"; +import { addFusionTreasures, addMiscItems, addShipDecorations, getInventory } from "@/src/services/inventoryService"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes"; +import { RequestHandler } from "express"; + +export const contributeToVaultController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const inventory = await getInventory(accountId); + const guild = await getGuildForRequestEx(req, inventory); + const request = JSON.parse(String(req.body)) as IContributeToVaultRequest; + + if (request.RegularCredits) { + guild.VaultRegularCredits ??= 0; + guild.VaultRegularCredits += request.RegularCredits; + } + if (request.MiscItems.length) { + guild.VaultMiscItems ??= []; + for (const item of request.MiscItems) { + guild.VaultMiscItems.push(item); + addMiscItems(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]); + } + } + if (request.ShipDecorations.length) { + guild.VaultShipDecorations ??= []; + for (const item of request.ShipDecorations) { + guild.VaultShipDecorations.push(item); + addShipDecorations(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]); + } + } + if (request.FusionTreasures.length) { + guild.VaultFusionTreasures ??= []; + for (const item of request.FusionTreasures) { + guild.VaultFusionTreasures.push(item); + addFusionTreasures(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]); + } + } + + await guild.save(); + await inventory.save(); + res.end(); +}; + +interface IContributeToVaultRequest { + RegularCredits: number; + MiscItems: IMiscItem[]; + ShipDecorations: ITypeCount[]; + FusionTreasures: IFusionTreasure[]; +} diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index 748d95eb..4fdbc223 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -6,7 +6,7 @@ import { IDojoDecoDatabase } from "@/src/types/guildTypes"; import { Document, Model, model, Schema, Types } from "mongoose"; -import { typeCountSchema } from "./inventoryModels/inventoryModel"; +import { fusionTreasuresSchema, typeCountSchema } from "./inventoryModels/inventoryModel"; import { toMongoDate } from "../helpers/inventoryHelpers"; const dojoDecoSchema = new Schema({ @@ -68,6 +68,8 @@ const guildSchema = new Schema( VaultRegularCredits: Number, VaultPremiumCredits: Number, VaultMiscItems: { type: [typeCountSchema], default: undefined }, + VaultShipDecorations: { type: [typeCountSchema], default: undefined }, + VaultFusionTreasures: { type: [fusionTreasuresSchema], default: undefined }, TechProjects: { type: [techProjectSchema], default: undefined } }, { id: false } diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 2aa16bb9..04c2aced 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -552,7 +552,7 @@ questKeysSchema.set("toJSON", { } }); -const fusionTreasuresSchema = new Schema().add(typeCountSchema).add({ Sockets: Number }); +export const fusionTreasuresSchema = new Schema().add(typeCountSchema).add({ Sockets: Number }); const spectreLoadoutsSchema = new Schema( { diff --git a/src/routes/api.ts b/src/routes/api.ts index dcc9fddc..2ad923d6 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -14,6 +14,7 @@ import { claimLibraryDailyTaskRewardController } from "@/src/controllers/api/cla import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController"; import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController"; import { contributeToDojoComponentController } from "@/src/controllers/api/contributeToDojoComponentController"; +import { contributeToVaultController } from "@/src/controllers/api/contributeToVaultController"; import { createGuildController } from "@/src/controllers/api/createGuildController"; import { creditsController } from "@/src/controllers/api/creditsController"; import { deleteSessionController } from "@/src/controllers/api/deleteSessionController"; @@ -153,6 +154,7 @@ apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController); apiRouter.post("/clearDialogueHistory.php", clearDialogueHistoryController); apiRouter.post("/completeRandomModChallenge.php", completeRandomModChallengeController); apiRouter.post("/contributeToDojoComponent.php", contributeToDojoComponentController); +apiRouter.post("/contributeToVault.php", contributeToVaultController); apiRouter.post("/createGuild.php", createGuildController); apiRouter.post("/destroyDojoDeco.php", destroyDojoDecoController); apiRouter.post("/dojoComponentRush.php", dojoComponentRushController); diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 70abac99..cd877835 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -40,7 +40,9 @@ export const getGuildVault = (guild: TGuildDatabaseDocument): IGuildVault => { return { DojoRefundRegularCredits: guild.VaultRegularCredits, DojoRefundMiscItems: guild.VaultMiscItems, - DojoRefundPremiumCredits: guild.VaultPremiumCredits + DojoRefundPremiumCredits: guild.VaultPremiumCredits, + ShipDecorations: guild.VaultShipDecorations, + FusionTreasures: guild.VaultFusionTreasures }; }; diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index b3081b94..4802070f 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -14,6 +14,8 @@ export interface IGuildDatabase extends IGuild { VaultRegularCredits?: number; VaultPremiumCredits?: number; VaultMiscItems?: IMiscItem[]; + VaultShipDecorations?: ITypeCount[]; + VaultFusionTreasures?: IFusionTreasure[]; TechProjects?: ITechProjectDatabase[]; }