From 791877098b92ddb85b767a0a15d065b05bb3c172 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 29 Jun 2021 19:38:18 +0800 Subject: [PATCH] core: record_list: getHidden by uid --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/contest.ts | 2 +- packages/hydrooj/src/handler/homework.ts | 2 +- packages/hydrooj/src/handler/record.ts | 2 +- packages/hydrooj/src/handler/training.ts | 2 +- packages/hydrooj/src/handler/user.ts | 2 +- packages/hydrooj/src/model/problem.ts | 6 +++--- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index e50baed70..a362b2016 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.29.3", + "version": "2.29.4", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 60043ff6b..cd35eb08d 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -229,7 +229,7 @@ export class ContestEditHandler extends Handler { const endAt = beginAtMoment.clone().add(duration, 'hours').toDate(); if (beginAtMoment.isSameOrAfter(endAt)) throw new ValidationError('duration'); const beginAt = beginAtMoment.toDate(); - await problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN), true); + await problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN) || this.user._id, true); if (tid) { await contest.edit(domainId, tid, { title, content, rule, beginAt, endAt, pids, rated, diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index e13b18dc2..9203d415b 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -326,7 +326,7 @@ class HomeworkEditHandler extends Handler { const endAt = penaltySince.clone().add(extensionDays, 'days'); if (beginAt.isSameOrAfter(penaltySince)) throw new ValidationError('endAtDate', 'endAtTime'); if (penaltySince.isAfter(endAt)) throw new ValidationError('extensionDays'); - await problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN), true); + await problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN) || this.user._id, true); if (!tid) { tid = await contest.add(domainId, title, content, this.user._id, 'homework', beginAt.toDate(), endAt.toDate(), pids, rated, diff --git a/packages/hydrooj/src/handler/record.ts b/packages/hydrooj/src/handler/record.ts index 406a030ae..ccf67c68d 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -65,7 +65,7 @@ class RecordListHandler extends Handler { canViewProblem ? problem.getList(domainId, rdocs.map( (rdoc) => (rdoc.domainId === domainId ? rdoc.pid : `${rdoc.pdomain}:${rdoc.pid}`), - ), canViewProblemHidden, false) + ), canViewProblemHidden || this.user._id, false) : Object.fromEntries([rdocs.map((rdoc) => [rdoc.pid, { ...problem.default, pid: rdoc.pid }])]), ]); this.response.body = { diff --git a/packages/hydrooj/src/handler/training.ts b/packages/hydrooj/src/handler/training.ts index 8cf202b1e..aedf6ce95 100644 --- a/packages/hydrooj/src/handler/training.ts +++ b/packages/hydrooj/src/handler/training.ts @@ -104,7 +104,7 @@ class TrainingDetailHandler extends Handler { const pids = training.getPids(tdoc.dag); const [owner, pdict] = await Promise.all([ user.getById(domainId, tdoc.owner), - problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN)), + problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN) || this.user._id), ]); const psdict = await problem.getListStatus(domainId, this.user._id, pids); const donePids = new Set(); diff --git a/packages/hydrooj/src/handler/user.ts b/packages/hydrooj/src/handler/user.ts index 289a2c8f9..cb254c776 100644 --- a/packages/hydrooj/src/handler/user.ts +++ b/packages/hydrooj/src/handler/user.ts @@ -203,7 +203,7 @@ class UserDetailHandler extends Handler { const pdict = this.user.hasPerm(PERM.PERM_VIEW_PROBLEM) ? await problem.getList( domainId, rdocs.map((rdoc) => rdoc.pid), - this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN), false, + this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN) || this.user._id, false, ) : Object.fromEntries(rdocs.map( (rdoc) => [rdoc.pid, { ...problem.default, pid: rdoc.pid }], diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index 77f145d5b..b9046f2cf 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -234,7 +234,7 @@ export class ProblemModel { static async getList( domainId: string, pids: ProblemId[], - getHidden = false, doThrow = true, projection = ProblemModel.PROJECTION_PUBLIC, + getHidden: number | boolean = false, doThrow = true, projection = ProblemModel.PROJECTION_PUBLIC, ): Promise { const parsed = groupBy( Array.from(new Set(pids)).map((i) => ({ @@ -266,10 +266,10 @@ export class ProblemModel { for (const task in parsed) { const range = { $in: parsed[task].map((i) => i.pid) }; const q: any = { $or: [{ docId: range }, { pid: range }] }; - if (!getHidden) q.hidden = false; tasks.push(document.getMulti(task, document.TYPE_PROBLEM, q).project(buildProjection(projection)).toArray()); } - const pdocs = flatten(await Promise.all(tasks)); + let pdocs = flatten(await Promise.all(tasks)); + if (getHidden !== true) pdocs = pdocs.filter((i) => !i.hidden || i.owner === getHidden); for (const pdoc of pdocs) { try { // eslint-disable-next-line no-await-in-loop