From 205475b85913c055a632cc9a51f6ef27ec887c03 Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 8 Apr 2023 02:32:10 +0800 Subject: [PATCH] core: fix #554 --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/contest.ts | 18 +++++++++++++----- packages/hydrooj/src/upgrade.ts | 12 ++++++++++-- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 62a88a6cd..84e75239a 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "4.9.10", + "version": "4.9.11", "bin": "bin/hydrooj.js", "main": "src/plugin-api", "module": "src/plugin-api", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 52c1b3cfc..646769477 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -15,6 +15,8 @@ import { ScoreboardConfig, Tdoc } from '../interface'; import paginate from '../lib/paginate'; import { PERM, PRIV, STATUS } from '../model/builtin'; import * as contest from '../model/contest'; +import * as discussion from '../model/discussion'; +import document from '../model/document'; import message from '../model/message'; import * as oplog from '../model/oplog'; import problem from '../model/problem'; @@ -460,11 +462,17 @@ export class ContestEditHandler extends Handler { @param('tid', Types.ObjectId) async postDelete(domainId: string, tid: ObjectId) { if (!this.user.own(this.tdoc)) this.checkPerm(PERM.PERM_EDIT_CONTEST); - await contest.del(domainId, tid); - await record.updateMulti(domainId, { domainId, contest: tid }, undefined, undefined, { contest: '' }); - await ScheduleModel.deleteMany({ - type: 'schedule', subType: 'contest', domainId, tid, - }); + const [ddocs] = await Promise.all([ + discussion.getMulti(domainId, { parentType: document.TYPE_CONTEST, parentId: tid }).project({ _id: 1 }).toArray(), + contest.del(domainId, tid), + ]); + const tasks: any[] = ddocs.map((i) => discussion.del(domainId, i._id)); + await Promise.all(tasks.concat([ + record.updateMulti(domainId, { domainId, contest: tid }, undefined, undefined, { contest: '' }), + ScheduleModel.deleteMany({ + type: 'schedule', subType: 'contest', domainId, tid, + }), + ])); this.response.redirect = this.url('contest_main'); } } diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index df0b04f37..ad5bc5a46 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -563,13 +563,21 @@ const scripts: UpgradeScript[] = [ r.journal = r.journal.filter((i) => i.rid !== null); await document.collStatus.updateOne({ _id: r._id }, { $set: { journal: r.journal } }); } - await iterateAllContest(async (tdoc) => { + return await iterateAllContest(async (tdoc) => { if (tdoc.rule !== 'acm') return; logger.info(tdoc.domainId, tdoc.title); await contest.recalcStatus(tdoc.domainId, tdoc.docId); if (contest.isDone(tdoc)) await contest.unlockScoreboard(tdoc.domainId, tdoc.docId); }); - return true; + }, + async function _79_80() { + return await iterateAllDomain(async ({ _id }) => { + const cursor = discussion.getMulti(_id, { parentType: document.TYPE_CONTEST }); + for await (const ddoc of cursor) { + const tdoc = await contest.get(_id, ddoc.parentId as ObjectId); + if (!tdoc) await discussion.del(_id, ddoc.docId); + } + }); }, ];