From 6dfeede6d60b45d9a15a93a35058e8d965cc948a Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 18 May 2021 22:04:01 +0800 Subject: [PATCH] =?UTF-8?q?core:=20=E4=BF=9D=E7=95=99=E6=AF=94=E8=B5=9B?= =?UTF-8?q?=E9=A2=98=E7=9B=AE=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/contest.ts | 8 ++++---- packages/hydrooj/src/handler/homework.ts | 10 +++++----- packages/hydrooj/src/model/contest.ts | 12 ++---------- packages/hydrooj/src/model/storage.ts | 19 +++++++++++++------ 5 files changed, 25 insertions(+), 26 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 4f8ab9836..e5ae9917c 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.26.11", + "version": "2.26.12", "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 b2a03f081..dea587291 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -214,10 +214,11 @@ class ContestEditHandler extends Handler { domainId: string, beginAtDate: string, beginAtTime: string, duration: number, title: string, content: string, rule: string, _pids: string, rated = false, ) { - let pids = _pids.replace(/,/g, ',').split(',').map((i) => { + const pids = _pids.replace(/,/g, ',').split(',').map((i) => { if (isSafeInteger(parseInt(i, 10))) return parseInt(i, 10); return i; }); + await problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN), false); const beginAtMoment = moment.tz(`${beginAtDate} ${beginAtTime}`, this.user.timeZone); if (!beginAtMoment.isValid()) { throw new ValidationError('beginAtDate', 'beginAtTime'); @@ -225,7 +226,6 @@ class ContestEditHandler extends Handler { const endAt = beginAtMoment.clone().add(duration, 'hours').toDate(); if (beginAtMoment.isSameOrAfter(endAt)) throw new ValidationError('duration'); const beginAt = beginAtMoment.toDate(); - pids = await contest.verifyProblems(domainId, pids); await contest.edit(domainId, this.tdoc.docId, { title, content, rule, beginAt, endAt, pids, rated, }); @@ -429,7 +429,7 @@ class ContestCreateHandler extends Handler { domainId: string, beginAtDate: string, beginAtTime: string, duration: number, title: string, content: string, rule: string, _pids: string, rated = false, ) { - let pids = _pids.replace(/,/g, ',').split(',').map((i) => { + const pids = _pids.replace(/,/g, ',').split(',').map((i) => { if (isSafeInteger(parseInt(i, 10))) return parseInt(i, 10); return i; }); @@ -438,7 +438,7 @@ class ContestCreateHandler extends Handler { throw new ValidationError('beginAtDate', 'beginAtTime'); } const endAt = beginAt.clone().add(duration, 'hours'); - pids = await contest.verifyProblems(domainId, pids); + await problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN), false); const tid = await contest.add( domainId, title, content, this.user._id, rule, beginAt.toDate(), endAt.toDate(), pids, rated, diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index fa6e233d7..357f488a2 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -257,9 +257,9 @@ class HomeworkCreateHandler 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'); - const verified = await contest.verifyProblems(domainId, pids); + await problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN), false); const tid = await contest.add(domainId, title, content, this.user._id, - 'homework', beginAt.toDate(), endAt.toDate(), verified, rated, + 'homework', beginAt.toDate(), endAt.toDate(), pids, rated, { penaltySince: penaltySince.toDate(), penaltyRules }, document.TYPE_HOMEWORK); this.response.body = { tid }; this.response.redirect = this.url('homework_detail', { tid }); @@ -334,17 +334,17 @@ class HomeworkEditHandler extends Handler { } let endAt = penaltySince.clone().add(extensionDays, 'days'); if (beginAt.isSameOrAfter(penaltySince)) throw new ValidationError('endAtDate', 'endAtTime'); - const verified = await contest.verifyProblems(domainId, pids); + await problem.getList(domainId, pids, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN), false); beginAt = beginAt.toDate(); endAt = endAt.toDate(); penaltySince = penaltySince.toDate(); await contest.edit(domainId, tid, { - title, content, beginAt, endAt, pids: verified, penaltySince, penaltyRules, rated, + title, content, beginAt, endAt, pids, penaltySince, penaltyRules, rated, }, document.TYPE_HOMEWORK); if (tdoc.beginAt !== beginAt || tdoc.endAt !== endAt || tdoc.penaltySince !== penaltySince - || tdoc.pids.sort().join(' ') !== verified.sort().join(' ')) { + || tdoc.pids.sort().join(' ') !== pids.sort().join(' ')) { await contest.recalcStatus(domainId, tdoc.docId, document.TYPE_HOMEWORK); } this.response.body = { tid }; diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index a004f887d..aab0c2c49 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -569,22 +569,15 @@ export async function getScoreboard( const tdoc = await get(domainId, tid, docType); if (!canShowScoreboard.call(this, tdoc)) throw new ContestScoreboardHiddenError(tid); if (!canShowRecord.call(this, tdoc)) throw new ContestScoreboardHiddenError(tid); - const tsdocs = await getMultiStatus(domainId, { docId: tid }, docType).sort(RULES[tdoc.rule].statusSort); + const tsdocsCursor = getMultiStatus(domainId, { docId: tid }, docType).sort(RULES[tdoc.rule].statusSort); const pdict = await problem.getList(domainId, tdoc.pids, true); const [rows, udict, nPages] = await RULES[tdoc.rule].scoreboard( isExport, this.translate.bind(this), - tdoc, pdict, tsdocs, page, + tdoc, pdict, tsdocsCursor, page, ); return [tdoc, rows, udict, pdict, nPages]; } -export async function verifyProblems(domainId: string, pids: Array) { - const pdict = await problem.getList(domainId, pids, true); - const _pids: Set = new Set(); - for (const i in pdict) _pids.add(pdict[i].docId); - return Array.from(_pids); -} - export const statusText = (tdoc: Tdoc) => ( isNew(tdoc) ? 'New' @@ -621,7 +614,6 @@ global.Hydro.model.contest = { canShowScoreboard, canViewHiddenScoreboard, getScoreboard, - verifyProblems, isNew, isUpcoming, isNotStarted, diff --git a/packages/hydrooj/src/model/storage.ts b/packages/hydrooj/src/model/storage.ts index 3e4064bf4..78e393250 100644 --- a/packages/hydrooj/src/model/storage.ts +++ b/packages/hydrooj/src/model/storage.ts @@ -2,6 +2,7 @@ import { escapeRegExp } from 'lodash'; import { ItemBucketMetadata } from 'minio'; import moment from 'moment'; import type { Readable } from 'stream'; +import TaskModel from './task'; import storage from '../service/storage'; import * as bus from '../service/bus'; import db from '../service/db'; @@ -76,19 +77,25 @@ export class StorageModel { } } -async function clean() { +async function cleanFiles() { let res = await StorageModel.coll.findOneAndDelete({ autoDelete: { $lte: new Date() } }); while (res.value) { // eslint-disable-next-line no-await-in-loop - // await storage.del(res.value._id); + await storage.del(res.value._id); // eslint-disable-next-line no-await-in-loop res = await StorageModel.coll.findOneAndDelete({ autoDelete: { $lte: new Date() } }); } - setTimeout(clean, 10000); } -bus.on('app/started', () => { - clean(); - return StorageModel.coll.createIndex({ path: 1 }, { unique: true }); +TaskModel.Worker.addHandler('storage.prune', cleanFiles); +bus.once('app/started', async () => { + if (!await TaskModel.count({ type: 'schedule', subType: 'storage.prune' })) { + await TaskModel.add({ + type: 'schedule', + subType: 'storage.prune', + executeAfter: moment().minute(0).second(0).millisecond(0).toDate(), + interval: [1, 'hour'], + }); + } }); global.Hydro.model.storage = StorageModel;