diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 2d5498967..039bf37e3 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.32.16", + "version": "2.32.17", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 95f8734c9..780df36b8 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -310,17 +310,13 @@ export class ContestProblemHandler extends Handler { } export class ContestProblemFileDownloadHandler extends ContestProblemHandler { - @query('type', Types.Range(['additional_file', 'testdata']), true) @param('filename', Types.Name) @param('noDisposition', Types.Boolean) - async get(domainId: string, type = 'additional_file', filename: string, noDisposition = false) { - if (type === 'testdata' && !this.user.own(this.pdoc)) { - if (!this.user.hasPriv(PRIV.PRIV_READ_PROBLEM_DATA)) this.checkPerm(PERM.PERM_READ_PROBLEM_DATA); - } + async get(domainId: string, filename: string, noDisposition = false) { // @ts-ignore if (typeof this.pdoc.docId === 'string') this.pdoc.docId = this.pdoc.docId.split(':')[1]; this.response.redirect = await storage.signDownloadLink( - `problem/${this.pdoc.domainId}/${this.pdoc.docId}/${type}/${filename}`, + `problem/${this.pdoc.domainId}/${this.pdoc.docId}/additional_file/${filename}`, noDisposition ? undefined : filename, false, 'user', ); } diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index 9cfbf0d87..e5eb96b58 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -175,18 +175,14 @@ class HomeworkDetailProblemHandler extends Handler { } export class HomeworkProblemFileDownloadHandler extends HomeworkDetailProblemHandler { - @query('type', Types.Range(['additional_file', 'testdata']), true) @param('filename', Types.Name) @param('noDisposition', Types.Boolean) // @ts-ignore - async get(domainId: string, type = 'additional_file', filename: string, noDisposition = false) { - if (type === 'testdata' && !this.user.own(this.pdoc)) { - if (!this.user.hasPriv(PRIV.PRIV_READ_PROBLEM_DATA)) this.checkPerm(PERM.PERM_READ_PROBLEM_DATA); - } + async get(domainId: string, filename: string, noDisposition = false) { // @ts-ignore if (typeof this.pdoc.docId === 'string') this.pdoc.docId = this.pdoc.docId.split(':')[1]; this.response.redirect = await storage.signDownloadLink( - `problem/${this.pdoc.domainId}/${this.pdoc.docId}/${type}/${filename}`, + `problem/${this.pdoc.domainId}/${this.pdoc.docId}/additional_file/${filename}`, noDisposition ? undefined : filename, false, 'user', ); } diff --git a/packages/hydrooj/src/model/task.ts b/packages/hydrooj/src/model/task.ts index bb874c4f4..ef49d7523 100644 --- a/packages/hydrooj/src/model/task.ts +++ b/packages/hydrooj/src/model/task.ts @@ -60,25 +60,19 @@ class Consumer { class WorkerService implements BaseService { private handlers: Record = {}; - public consumer: Consumer; - public started = false; - - public start() { - this.consumer = new Consumer( - { type: 'schedule', subType: { $in: Object.keys(this.handlers) } }, - async (doc) => { - try { - logger.debug('Worker task: %o', doc); - await this.handlers[doc.subType](doc); - } catch (e) { - logger.error('Worker task fail: ', e); - logger.error('%o', doc); - } - }, - false, - ); - this.started = true; - } + public consumer = new Consumer( + { type: 'schedule', subType: { $in: Object.keys(this.handlers) } }, + async (doc) => { + try { + logger.debug('Worker task: %o', doc); + await this.handlers[doc.subType](doc); + } catch (e) { + logger.error('Worker task fail: ', e); + logger.error('%o', doc); + } + }, + false, + ); public addHandler(type: string, handler: Function) { this.handlers[type] = handler; @@ -87,7 +81,6 @@ class WorkerService implements BaseService { } const Worker = new WorkerService(); -Worker.start(); class TaskModel { static async add(task: Partial & { type: string }) { @@ -122,7 +115,7 @@ class TaskModel { static async getDelay(query?: FilterQuery): Promise<[number, Date]> { const now = new Date(); - const res = await coll.findOne(query, { sort: { executeAfter: 1 } }); + const [res] = await coll.find(query).sort({ executeAfter: 1 }).limit(1).toArray(); if (res) return [Math.max(0, now.getTime() - res.executeAfter.getTime()), res.executeAfter]; return [0, now]; } @@ -136,7 +129,21 @@ class TaskModel { static Worker = Worker; } +Worker.addHandler('task.daily', async () => { + await global.Hydro.script.rp?.run({}, new Logger('task/rp').debug); + await global.Hydro.script.problemStat?.run({}, new Logger('task/problem').debug); +}); bus.on('domain/delete', (domainId) => coll.deleteMany({ domainId })); +bus.once('app/started', async () => { + if (!await TaskModel.count({ type: 'schedule', subType: 'task.daily' })) { + await TaskModel.add({ + type: 'schedule', + subType: 'task.daily', + executeAfter: moment().hour(3).minute(0).second(0).millisecond(0).toDate(), + interval: [1, 'day'], + }); + } +}); export default TaskModel; global.Hydro.model.task = TaskModel;