From a7f364e6515bd8f11fda3eac498d9c8e566bfbd2 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 18 Jun 2021 19:04:48 +0800 Subject: [PATCH] core: allow pin training --- packages/hydrooj/bin/hydrooj.js | 25 +++++++++++++------ packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/training.ts | 13 +++++++--- packages/hydrooj/src/interface.ts | 5 ++-- packages/hydrooj/src/model/builtin.ts | 1 + packages/hydrooj/src/model/training.ts | 2 +- packages/hydrooj/src/service/monitor.ts | 16 ++++++------ packages/ui-default/package.json | 2 +- .../templates/domain_permission.html | 2 +- .../ui-default/templates/training_edit.html | 8 ++++++ 10 files changed, 51 insertions(+), 25 deletions(-) diff --git a/packages/hydrooj/bin/hydrooj.js b/packages/hydrooj/bin/hydrooj.js index ad784f4d1..8aeff6eca 100755 --- a/packages/hydrooj/bin/hydrooj.js +++ b/packages/hydrooj/bin/hydrooj.js @@ -35,12 +35,14 @@ if (!cluster.isMaster) { return child.spawn('mongo', [url], { stdio: 'inherit' }); } - try { - const ui = argv.options.ui || '@hydrooj/ui-default'; - require.resolve(ui); - addons.push(ui); - } catch (e) { - console.error('Please also install @hydrooj/ui-default'); + if (!addons.includes('@hydrooj/ui-default')) { + try { + const ui = argv.options.ui || '@hydrooj/ui-default'; + require.resolve(ui); + addons.push(ui); + } catch (e) { + console.error('Please also install @hydrooj/ui-default'); + } } if (argv.args[0] && argv.args[0] !== 'cli') { @@ -55,8 +57,15 @@ if (!cluster.isMaster) { fs.mkdirSync('/root/addon/locales'); fs.mkdirSync('/root/addon/public'); addons.push('/root/addon'); - } else if (arg1 === 'add') addons.push(arg2); - else if (arg1 === 'remove') { + } else if (arg1 === 'add') { + for (let i = 0; i < addons.length; i++) { + if (addons[i] === arg2) { + addons.splice(i, 1); + break; + } + } + addons.push(arg2); + } else if (arg1 === 'remove') { for (let i = 0; i < addons.length; i++) { if (addons[i] === arg2) { addons.splice(i, 1); diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index f66ab5719..503237f20 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.28.37", + "version": "2.28.38", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/training.ts b/packages/hydrooj/src/handler/training.ts index 9b34d21c5..8cf202b1e 100644 --- a/packages/hydrooj/src/handler/training.ts +++ b/packages/hydrooj/src/handler/training.ts @@ -181,11 +181,13 @@ class TrainingCreateHandler extends Handler { @param('title', Types.Title) @param('content', Types.Content) @param('dag', Types.String, isContent) + @param('pin', Types.Boolean) @param('description', Types.String, isDescription) async post( domainId: string, title: string, content: string, - _dag: string, description: string, + _dag: string, pin = false, description: string, ) { + if (pin) this.checkPerm(PERM.PERM_PIN_TRAINING); const dag = await _parseDagJson(domainId, _dag); const pids = training.getPids(dag); assert(pids.length, new ValidationError('dag')); @@ -194,13 +196,14 @@ class TrainingCreateHandler extends Handler { if (pdoc.hidden) this.checkPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN); } const tid = await training.add(domainId, title, content, this.user._id, dag, description); + if (pin) await training.edit(domainId, tid, { pin }); this.response.body = { tid }; this.response.redirect = this.url('training_detail', { tid }); } } class TrainingEditHandler extends Handler { - tdoc: Tdoc; + tdoc: TrainingDoc; @param('tid', Types.ObjectID) async prepare(domainId: string, tid: ObjectID) { @@ -227,12 +230,14 @@ class TrainingEditHandler extends Handler { @param('title', Types.Title) @param('content', Types.Content) @param('dag', Types.Content) + @param('pin', Types.Boolean) @param('description', Types.String, isDescription) async post( domainId: string, tid: ObjectID, title: string, content: string, - _dag: string, description: string, + _dag: string, pin = false, description: string, ) { + if (this.tdoc.pin !== pin) this.checkPerm(PERM.PERM_PIN_TRAINING); const dag = await _parseDagJson(domainId, _dag); const pids = training.getPids(dag); assert(pids.length, new ValidationError('dag')); @@ -257,7 +262,7 @@ class TrainingEditHandler extends Handler { if (pdoc.hidden) this.checkPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN); } await training.edit(domainId, tid, { - title, content, dag, description, + title, content, dag, description, pin, }); this.response.body = { tid }; this.response.redirect = this.url('training_detail', { tid }); diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 5738b8a63..63cbcaed3 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -326,8 +326,9 @@ export interface Tdoc { diff --git a/packages/hydrooj/src/model/builtin.ts b/packages/hydrooj/src/model/builtin.ts index dadc73793..b65fc7499 100644 --- a/packages/hydrooj/src/model/builtin.ts +++ b/packages/hydrooj/src/model/builtin.ts @@ -85,6 +85,7 @@ export const PERM = { PERM_VIEW_TRAINING: 1n << 46n, PERM_CREATE_TRAINING: 1n << 47n, PERM_EDIT_TRAINING: 1n << 48n, + PERM_PIN_TRAINING: 1n << 63n, PERM_EDIT_TRAINING_SELF: 1n << 49n, // Ranking diff --git a/packages/hydrooj/src/model/training.ts b/packages/hydrooj/src/model/training.ts index 1253c34f3..25da09448 100644 --- a/packages/hydrooj/src/model/training.ts +++ b/packages/hydrooj/src/model/training.ts @@ -114,7 +114,7 @@ export async function getList(domainId: string, tids: ObjectID[]) { } export const getMulti = (domainId: string, query: FilterQuery = {}) => - document.getMulti(domainId, document.TYPE_TRAINING, query).sort('_id', 1); + document.getMulti(domainId, document.TYPE_TRAINING, query).sort({ pin: -1, _id: -1 }); global.Hydro.model.training = { getPids, diff --git a/packages/hydrooj/src/service/monitor.ts b/packages/hydrooj/src/service/monitor.ts index 84521c5d8..6bb731118 100644 --- a/packages/hydrooj/src/service/monitor.ts +++ b/packages/hydrooj/src/service/monitor.ts @@ -84,13 +84,15 @@ export async function updateJudge(args) { if (cluster.isMaster) { bus.on('app/started', async () => { - sysinfo.get().then((info) => coll.updateOne( - { mid: info.mid, type: 'server' }, - { $set: { ...info, updateAt: new Date(), type: 'server' } }, - { upsert: true }, - )); - feedback(); - setInterval(update, 60 * 1000); + sysinfo.get().then((info) => { + coll.updateOne( + { mid: info.mid, type: 'server' }, + { $set: { ...info, updateAt: new Date(), type: 'server' } }, + { upsert: true }, + ); + feedback(); + setInterval(update, 60 * 1000); + }); }); } diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index b9d5337b1..58b5f4b5c 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.11.24", + "version": "4.11.25", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/templates/domain_permission.html b/packages/ui-default/templates/domain_permission.html index b89cff154..f3fe341b3 100644 --- a/packages/ui-default/templates/domain_permission.html +++ b/packages/ui-default/templates/domain_permission.html @@ -45,7 +45,7 @@ {%- for role in roles -%} {%- endfor -%} diff --git a/packages/ui-default/templates/training_edit.html b/packages/ui-default/templates/training_edit.html index ff2370c94..c91481cab 100644 --- a/packages/ui-default/templates/training_edit.html +++ b/packages/ui-default/templates/training_edit.html @@ -12,6 +12,14 @@ +
+ +