From 6bb74b026a774bff4f232193b588764b79220c66 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sat, 5 Apr 2025 06:51:23 -0700 Subject: [PATCH] feat: contribute to allied clan vault (#1462) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1462 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- .../api/contributeToVaultController.ts | 48 ++++++++++++++----- src/models/guildModel.ts | 7 +++ 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/controllers/api/contributeToVaultController.ts b/src/controllers/api/contributeToVaultController.ts index 507d1aa7..77a93097 100644 --- a/src/controllers/api/contributeToVaultController.ts +++ b/src/controllers/api/contributeToVaultController.ts @@ -1,4 +1,10 @@ -import { Alliance, GuildMember } from "@/src/models/guildModel"; +import { + Alliance, + Guild, + GuildMember, + TGuildDatabaseDocument, + TGuildMemberDatabaseDocument +} from "@/src/models/guildModel"; import { addGuildMemberMiscItemContribution, addGuildMemberShipDecoContribution, @@ -21,10 +27,10 @@ import { RequestHandler } from "express"; export const contributeToVaultController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); const inventory = await getInventory(accountId, "GuildId RegularCredits MiscItems ShipDecorations FusionTreasures"); - const guild = await getGuildForRequestEx(req, inventory); const request = JSON.parse(String(req.body)) as IContributeToVaultRequest; if (request.Alliance) { + const guild = await getGuildForRequestEx(req, inventory); const alliance = (await Alliance.findById(guild.AllianceId!))!; alliance.VaultRegularCredits ??= 0; alliance.VaultRegularCredits += request.RegularCredits; @@ -39,30 +45,44 @@ export const contributeToVaultController: RequestHandler = async (req, res) => { return; } - const guildMember = (await GuildMember.findOne( - { accountId, guildId: guild._id }, - "RegularCreditsContributed MiscItemsContributed ShipDecorationsContributed" - ))!; + let guild: TGuildDatabaseDocument; + let guildMember: TGuildMemberDatabaseDocument | undefined; + if (request.GuildVault) { + guild = (await Guild.findById(request.GuildVault))!; + } else { + guild = await getGuildForRequestEx(req, inventory); + guildMember = (await GuildMember.findOne( + { accountId, guildId: guild._id }, + "RegularCreditsContributed MiscItemsContributed ShipDecorationsContributed" + ))!; + } + if (request.RegularCredits) { updateCurrency(inventory, request.RegularCredits, false); guild.VaultRegularCredits ??= 0; guild.VaultRegularCredits += request.RegularCredits; - guildMember.RegularCreditsContributed ??= 0; - guildMember.RegularCreditsContributed += request.RegularCredits; + if (guildMember) { + guildMember.RegularCreditsContributed ??= 0; + guildMember.RegularCreditsContributed += request.RegularCredits; + } } if (request.MiscItems.length) { addVaultMiscItems(guild, request.MiscItems); for (const item of request.MiscItems) { - addGuildMemberMiscItemContribution(guildMember, item); + if (guildMember) { + addGuildMemberMiscItemContribution(guildMember, item); + } addMiscItems(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]); } } if (request.ShipDecorations.length) { addVaultShipDecos(guild, request.ShipDecorations); for (const item of request.ShipDecorations) { - addGuildMemberShipDecoContribution(guildMember, item); + if (guildMember) { + addGuildMemberShipDecoContribution(guildMember, item); + } addShipDecorations(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]); } } @@ -73,7 +93,12 @@ export const contributeToVaultController: RequestHandler = async (req, res) => { } } - await Promise.all([guild.save(), inventory.save(), guildMember.save()]); + const promises: Promise[] = [guild.save(), inventory.save()]; + if (guildMember) { + promises.push(guildMember.save()); + } + await Promise.all(promises); + res.end(); }; @@ -84,4 +109,5 @@ interface IContributeToVaultRequest { FusionTreasures: IFusionTreasure[]; Alliance?: boolean; FromVault?: boolean; + GuildVault?: string; } diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index fad1e0e8..563cb7d2 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -239,6 +239,13 @@ guildMemberSchema.index({ RequestExpiry: 1 }, { expireAfterSeconds: 0 }); export const GuildMember = model("GuildMember", guildMemberSchema); +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export type TGuildMemberDatabaseDocument = Document & + IGuildMemberDatabase & { + _id: Types.ObjectId; + __v: number; + }; + const guildAdSchema = new Schema({ GuildId: { type: Schema.Types.ObjectId, required: true }, Emblem: Boolean,