diff --git a/backend/src/data/GuildCases.ts b/backend/src/data/GuildCases.ts index b13b7c4a..a5d6e20b 100644 --- a/backend/src/data/GuildCases.ts +++ b/backend/src/data/GuildCases.ts @@ -5,6 +5,7 @@ import { connection } from "./db"; import { Case } from "./entities/Case"; import { CaseNote } from "./entities/CaseNote"; import moment = require("moment-timezone"); +import { Queue } from "../Queue"; const CASE_SUMMARY_REASON_MAX_LENGTH = 300; @@ -12,10 +13,13 @@ export class GuildCases extends BaseGuildRepository { private cases: Repository<Case>; private caseNotes: Repository<CaseNote>; + protected createQueue: Queue; + constructor(guildId) { super(guildId); this.cases = getRepository(Case); this.caseNotes = getRepository(CaseNote); + this.createQueue = new Queue(); } async get(ids: number[]): Promise<Case[]> { @@ -117,25 +121,34 @@ export class GuildCases extends BaseGuildRepository { } async createInternal(data): Promise<InsertResult> { - return this.cases - .insert({ - ...data, - guild_id: this.guildId, - case_number: () => `(SELECT IFNULL(MAX(case_number)+1, 1) FROM cases AS ma2 WHERE guild_id = ${this.guildId})`, - }) - .catch((err) => { - if (err?.code === "ER_DUP_ENTRY") { - if (data.audit_log_id) { - console.trace(`Tried to insert case with duplicate audit_log_id`); - return this.createInternal({ - ...data, - audit_log_id: undefined, - }); - } - } + return this.createQueue.add(async () => { + const lastCaseNumberRow = await this.cases + .createQueryBuilder() + .select(["MAX(case_number) AS last_case_number"]) + .where("guild_id = :guildId", { guildId: this.guildId }) + .getRawOne(); + const lastCaseNumber = lastCaseNumberRow?.last_case_number || 0; - throw err; - }); + return this.cases + .insert({ + case_number: lastCaseNumber + 1, + ...data, + guild_id: this.guildId, + }) + .catch((err) => { + if (err?.code === "ER_DUP_ENTRY") { + if (data.audit_log_id) { + console.trace(`Tried to insert case with duplicate audit_log_id`); + return this.createInternal({ + ...data, + audit_log_id: undefined, + }); + } + } + + throw err; + }); + }); } async create(data): Promise<Case> {