From b10c67f5cfb15921d0af46b41e7f2e905b0bf3a7 Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 25 Oct 2021 16:48:50 +0800 Subject: [PATCH] core: fix problem copy pid --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/problem.ts | 5 ++--- packages/hydrooj/src/model/problem.ts | 2 +- packages/hydrooj/src/upgrade.ts | 18 +++++++++++++++++- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index d9ce75298..1fb4cdbd4 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.1.1", + "version": "3.1.2", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index d9b649947..ff63c5fc5 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -292,13 +292,12 @@ export class ProblemDetailHandler extends ProblemHandler { } @param('target', Types.String) - @param('pid', Types.String, true) - async postCopy(domainId: string, target: string, pid: string) { + async postCopy(domainId: string, target: string) { const ddoc = await domain.get(target); if (!ddoc) throw new NotFoundError(target); const dudoc = await user.getById(target, this.user._id); if (!dudoc.hasPerm(PERM.PERM_CREATE_PROBLEM)) throw new PermissionError(PERM.PERM_CREATE_PROBLEM); - const docId = await problem.copy(domainId, this.user.docId, target, pid); + const docId = await problem.copy(domainId, this.user.docId, target, this.pdoc.pid); this.response.redirect = this.url('problem_detail', { domainId: target, pid: docId }); } diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index f496fa4cd..103664b9a 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -147,7 +147,7 @@ export class ProblemModel { static async copy(domainId: string, _id: number, target: string, pid?: string) { const original = await ProblemModel.get(domainId, _id); if (!original) throw new ProblemNotFoundError(domainId, _id); - if (pid && await ProblemModel.get(target, pid)) pid = ''; + if (pid && (/^[0-9]+$/.test(pid) || await ProblemModel.get(target, pid))) pid = ''; if (!pid && original.pid && !await ProblemModel.get(target, original.pid)) pid = original.pid; const docId = await ProblemModel.add( target, pid, original.title, original.content, diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 4fed9a76a..abb4d5aee 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -588,7 +588,7 @@ const scripts: UpgradeScript[] = [ pids.push(pdoc.docId); await RecordModel.updateMulti( doc.domainId, - { contest: doc.docId }, + { contest: doc.docId, pid }, { pid: pdoc.docId }, {}, { pdomain: '' }, @@ -627,6 +627,22 @@ const scripts: UpgradeScript[] = [ await db.collection('record').updateMany({}, { $unset: { pdomain: '' } }); return true; }, + async function _52_53() { + const _FRESH_INSTALL_IGNORE = 1; + const cursor = db.collection('document').find({ docType: document.TYPE_CONTEST }); + while (await cursor.hasNext()) { + const tdoc = await cursor.next(); + const pdocs = await problem.getMulti(tdoc.domainId, { docId: { $in: tdoc.pids } }).toArray(); + if (!pdocs.filter((i) => i.reference).length) continue; + const tsdocs = await contest.getMultiStatus(tdoc.domainId, { docId: tdoc.docId }).toArray(); + for (const tsdoc of tsdocs) { + for (const tsrdoc of tsdoc.journal) { + await RecordModel.coll.updateOne({ _id: tsrdoc.rid }, { pid: tsrdoc.pid }); + } + } + } + return true; + }, ]; export default scripts;