diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index b005215e6..e81d01ba1 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.19.3", + "version": "2.19.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 ca2e3542a..d2b61b55b 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -8,8 +8,9 @@ import { } from '../error'; import { isContent, isTitle } from '../lib/validator'; import paginate from '../lib/paginate'; -import { PERM, PRIV, CONSTANT } from '../model/builtin'; +import { PERM, PRIV } from '../model/builtin'; import * as contest from '../model/contest'; +import * as system from '../model/system'; import * as document from '../model/document'; import * as problem from '../model/problem'; import * as domain from '../model/domain'; @@ -39,7 +40,7 @@ class ContestListHandler extends ContestHandler { qs = `rule=${rule}`; } // eslint-disable-next-line prefer-const - [tdocs, tpcount] = await paginate(tdocs, page, CONSTANT.CONTEST_PER_PAGE); + [tdocs, tpcount] = await paginate(tdocs, page, system.get('pagination.contest')); const tids = []; for (const tdoc of tdocs) tids.push(tdoc.docId); const tsdict = await contest.getListStatus(domainId, this.user._id, tids); diff --git a/packages/hydrooj/src/handler/discussion.ts b/packages/hydrooj/src/handler/discussion.ts index 7229d7ea5..5a35268fb 100644 --- a/packages/hydrooj/src/handler/discussion.ts +++ b/packages/hydrooj/src/handler/discussion.ts @@ -5,12 +5,13 @@ import { Mdoc, Drdoc, Ddoc, Drrdoc, } from '../interface'; import paginate from '../lib/paginate'; +import * as system from '../model/system'; import * as user from '../model/user'; import * as oplog from '../model/oplog'; import * as message from '../model/message'; import * as discussion from '../model/discussion'; import * as document from '../model/document'; -import { PERM, PRIV, CONSTANT } from '../model/builtin'; +import { PERM, PRIV } from '../model/builtin'; import { Route, Handler, Types, param, } from '../service/server'; @@ -74,7 +75,7 @@ class DiscussionMainHandler extends Handler { const [ddocs, dpcount] = await paginate( discussion.getMulti(domainId), page, - CONSTANT.DISCUSSION_PER_PAGE, + system.get('pagination.discussion'), ); const udict = await user.getList(domainId, ddocs.map((ddoc) => ddoc.owner)); const path = [ @@ -106,7 +107,7 @@ class DiscussionNodeHandler extends DiscussionHandler { const [ddocs, dpcount] = await paginate( discussion.getMulti(domainId, { parentType: typeMapper[type], parentId: name }), page, - CONSTANT.DISCUSSION_PER_PAGE, + system.get('pagination.discussion'), ); const uids = ddocs.map((ddoc) => ddoc.owner); uids.push(this.vnode.owner); @@ -183,7 +184,7 @@ class DiscussionDetailHandler extends DiscussionHandler { const [drdocs, pcount, drcount] = await paginate( discussion.getMultiReply(domainId, did), page, - CONSTANT.REPLY_PER_PAGE, + system.get('pagination.reply'), ); const uids = drdocs.map((drdoc) => drdoc.owner); uids.push(this.ddoc.owner); diff --git a/packages/hydrooj/src/handler/home.ts b/packages/hydrooj/src/handler/home.ts index dc4f97746..fa31b83cd 100644 --- a/packages/hydrooj/src/handler/home.ts +++ b/packages/hydrooj/src/handler/home.ts @@ -20,7 +20,7 @@ import * as domain from '../model/domain'; import * as discussion from '../model/discussion'; import * as token from '../model/token'; import * as training from '../model/training'; -import { PERM, PRIV, CONSTANT } from '../model/builtin'; +import { PERM, PRIV } from '../model/builtin'; import { isContent, isPassword, isEmail, isTitle, } from '../lib/validator'; @@ -32,7 +32,7 @@ class HomeHandler extends Handler { if (this.user.hasPerm(PERM.PERM_VIEW_HOMEWORK)) { const tdocs = await contest.getMulti(domainId, {}, document.TYPE_HOMEWORK) .sort('beginAt', -1) - .limit(CONSTANT.HOMEWORK_ON_MAIN) + .limit(system.get('pagination.homework_main')) .toArray(); const tsdict = await contest.getListStatus( domainId, this.user._id, @@ -47,7 +47,7 @@ class HomeHandler extends Handler { if (this.user.hasPerm(PERM.PERM_VIEW_CONTEST)) { const tdocs = await contest.getMulti(domainId) .sort('beginAt', -1) - .limit(CONSTANT.CONTEST_ON_MAIN) + .limit(system.get('pagination.contest_main')) .toArray(); const tsdict = await contest.getListStatus( domainId, this.user._id, tdocs.map((tdoc) => tdoc.docId), @@ -61,7 +61,7 @@ class HomeHandler extends Handler { if (this.user.hasPerm(PERM.PERM_VIEW_TRAINING)) { const tdocs = await training.getMulti(domainId) .sort('_id', 1) - .limit(CONSTANT.TRAINING_ON_MAIN) + .limit(system.get('pagination.training_main')) .toArray(); const tsdict = await training.getListStatus( domainId, this.user._id, tdocs.map((tdoc) => tdoc.docId), @@ -74,7 +74,7 @@ class HomeHandler extends Handler { async discussion(domainId: string): Promise<[any[], any]> { if (this.user.hasPerm(PERM.PERM_VIEW_DISCUSSION)) { const ddocs = await discussion.getMulti(domainId) - .limit(CONSTANT.DISCUSSION_ON_MAIN) + .limit(system.get('pagination.discussion_main')) .toArray(); const vndict = await discussion.getListVnodes( domainId, ddocs, this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN), diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index 3c69df94d..2826f8c9b 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -13,8 +13,9 @@ import { } from '../service/server'; import * as bus from '../service/bus'; import * as domain from '../model/domain'; -import { PERM, CONSTANT } from '../model/builtin'; +import { PERM } from '../model/builtin'; import * as user from '../model/user'; +import * as system from '../model/system'; import * as contest from '../model/contest'; import * as discussion from '../model/discussion'; import * as problem from '../model/problem'; @@ -84,7 +85,7 @@ class HomeworkDetailHandler extends HomeworkHandler { const [ddocs, dpcount, dcount] = await paginate( discussion.getMulti(domainId, { parentType: tdoc.docType, parentId: tdoc.docId }), page, - CONSTANT.DISCUSSION_PER_PAGE, + system.get('pagination.discussion'), ); const uids = ddocs.map((ddoc) => ddoc.owner); uids.push(tdoc.owner); diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 838359f34..a9a5094b1 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -11,12 +11,13 @@ import { } from '../interface'; import paginate from '../lib/paginate'; import { isTitle, isContent, isPid } from '../lib/validator'; +import * as system from '../model/system'; import * as problem from '../model/problem'; import * as record from '../model/record'; import * as domain from '../model/domain'; import * as user from '../model/user'; import * as solution from '../model/solution'; -import { PERM, PRIV, CONSTANT } from '../model/builtin'; +import { PERM, PRIV } from '../model/builtin'; import storage from '../service/storage'; import * as bus from '../service/bus'; import { @@ -70,7 +71,7 @@ export class ProblemMainHandler extends ProblemHandler { const [pdocs, ppcount, pcount] = await paginate( problem.getMulti(domainId, query).sort({ pid: 1, docId: 1 }), page, - CONSTANT.PROBLEM_PER_PAGE, + system.get('pagination.problem'), ); if (this.user.hasPriv(PRIV.PRIV_USER_PROFILE)) { psdict = await problem.getListStatus( @@ -115,7 +116,7 @@ export class ProblemCategoryHandler extends ProblemHandler { const [pdocs, ppcount, pcount] = await paginate( problem.getMulti(domainId, q).sort({ pid: 1, docId: 1 }), page, - CONSTANT.PROBLEM_PER_PAGE, + system.get('pagination.problem'), ); if (this.user.hasPriv(PRIV.PRIV_USER_PROFILE)) { psdict = await problem.getListStatus( @@ -465,7 +466,7 @@ export class ProblemSolutionHandler extends ProblemDetailHandler { const [psdocs, pcount, pscount] = await paginate( solution.getMulti(domainId, this.pdoc.docId), page, - CONSTANT.SOLUTION_PER_PAGE, + system.get('pagination.solution'), ); const uids = [this.pdoc.owner]; const docids = []; diff --git a/packages/hydrooj/src/handler/record.ts b/packages/hydrooj/src/handler/record.ts index 9a381d46c..20fd8c182 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -1,8 +1,7 @@ import { FilterQuery, ObjectID } from 'mongodb'; import { PermissionError, RecordNotFoundError } from '../error'; -import { - PERM, CONSTANT, STATUS, PRIV, -} from '../model/builtin'; +import { PERM, STATUS, PRIV } from '../model/builtin'; +import * as system from '../model/system'; import * as problem from '../model/problem'; import * as record from '../model/record'; import * as contest from '../model/contest'; @@ -42,7 +41,7 @@ class RecordListHandler extends RecordHandler { const [rdocs] = await paginate( record.getMulti(domainId, q).sort('_id', -1), page, - CONSTANT.RECORD_PER_PAGE, + system.get('pagination.record'), ); const canViewProblem = this.user.hasPerm(PERM.PERM_VIEW_PROBLEM); const canViewProblemHidden = this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN); diff --git a/packages/hydrooj/src/handler/training.ts b/packages/hydrooj/src/handler/training.ts index 617f9ba44..aff8405a7 100644 --- a/packages/hydrooj/src/handler/training.ts +++ b/packages/hydrooj/src/handler/training.ts @@ -4,7 +4,8 @@ import { Tdoc, TrainingDoc } from '../interface'; import { ValidationError, ProblemNotFoundError } from '../error'; import { isTitle, isContent, isDescription } from '../lib/validator'; import paginate from '../lib/paginate'; -import { PERM, PRIV, CONSTANT } from '../model/builtin'; +import * as system from '../model/system'; +import { PERM, PRIV } from '../model/builtin'; import * as problem from '../model/problem'; import * as builtin from '../model/builtin'; import * as training from '../model/training'; @@ -62,7 +63,7 @@ class TrainingMainHandler extends Handler { const [tdocs, tpcount] = await paginate( training.getMulti(domainId), page, - CONSTANT.TRAINING_PER_PAGE, + system.get('pagination.training'), ); const tids: Set = new Set(); for (const tdoc of tdocs) tids.add(tdoc.docId); diff --git a/packages/hydrooj/src/model/builtin.ts b/packages/hydrooj/src/model/builtin.ts index 1607eb934..9e1ed59d6 100644 --- a/packages/hydrooj/src/model/builtin.ts +++ b/packages/hydrooj/src/model/builtin.ts @@ -589,23 +589,8 @@ export const USER_GENDER_ICONS = { [USER_GENDER_OTHER]: '?', }; -export const CONSTANT = { - PROBLEM_PER_PAGE: 100, - CONTEST_PER_PAGE: 20, - DISCUSSION_PER_PAGE: 50, - RECORD_PER_PAGE: 100, - SOLUTION_PER_PAGE: 20, - TRAINING_PER_PAGE: 10, - REPLY_PER_PAGE: 50, - HOMEWORK_ON_MAIN: 5, - DISCUSSION_ON_MAIN: 20, - CONTEST_ON_MAIN: 10, - TRAINING_ON_MAIN: 10, -}; - global.Hydro.model.builtin = { Permission, - CONSTANT, PERM, PERMS, PERMS_BY_FAMILY, diff --git a/packages/hydrooj/src/model/setting.ts b/packages/hydrooj/src/model/setting.ts index 3d313ce55..3fe5c3e46 100644 --- a/packages/hydrooj/src/model/setting.ts +++ b/packages/hydrooj/src/model/setting.ts @@ -158,6 +158,17 @@ SystemSetting( Setting('setting_server', 'server.language', 'zh_CN', langRange, 'Default display language'), Setting('setting_basic', 'problem.categories', builtin.CATEGORIES, 'yaml', 'Problem Categories'), Setting('setting_basic', 'lang.texts', builtin.LANG_TEXTS, 'yaml', 'LANG_TEXTS'), + Setting('setting_basic', 'pagination.problem', 100, 'number', 'Problems per page'), + Setting('setting_basic', 'pagination.contest', 20, 'number', 'Contests per page'), + Setting('setting_basic', 'pagination.discussion', 50, 'number', 'Discussions per page'), + Setting('setting_basic', 'pagination.record', 100, 'number', 'Records per page'), + Setting('setting_basic', 'pagination.solution', 20, 'number', 'Solutions per page'), + Setting('setting_basic', 'pagination.training', 10, 'number', 'Trainings per page'), + Setting('setting_basic', 'pagination.reply', 50, 'number', 'Replies per page'), + Setting('setting_basic', 'pagination.homework_main', 5, 'number', 'Homeworks on main'), + Setting('setting_basic', 'pagination.contest_main', 10, 'number', 'Contests on main'), + Setting('setting_basic', 'pagination.training_main', 10, 'number', 'Trainings on main'), + Setting('setting_basic', 'pagination.discussion_main', 20, 'number', 'Discussions on main'), Setting('setting_session', 'session.keys', [String.random(32)], 'text', 'session.keys', null, FLAG_HIDDEN), Setting('setting_session', 'session.secure', false, 'boolean', 'session.secure'), Setting('setting_session', 'session.saved_expire_seconds', 3600 * 24 * 30, 'number', 'Saved session expire seconds'),