diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index bd74fa0eb..42425bcdc 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -13,7 +13,6 @@ import { InvalidTokenError, NotAssignedError, PermissionError, ValidationError, } from '../error'; import { ScoreboardConfig, Tdoc } from '../interface'; -import paginate from '../lib/paginate'; import { PERM, PRIV, STATUS } from '../model/builtin'; import * as contest from '../model/contest'; import * as discussion from '../model/discussion'; @@ -99,7 +98,7 @@ export class ContestListHandler extends Handler { const cursor = contest.getMulti(domainId, q).sort({ endAt: -1, beginAt: -1, _id: -1 }); let qs = rule ? `rule=${rule}` : ''; if (group) qs += qs ? `&group=${group}` : `group=${group}`; - const [tdocs, tpcount] = await paginate(cursor, page, system.get('pagination.contest')); + const [tdocs, tpcount] = await this.paginate(cursor, page, '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 5c6188667..dcbd07178 100644 --- a/packages/hydrooj/src/handler/discussion.ts +++ b/packages/hydrooj/src/handler/discussion.ts @@ -5,13 +5,11 @@ import { PermissionError, } from '../error'; import { DiscussionDoc, DiscussionReplyDoc, DiscussionTailReplyDoc } from '../interface'; -import paginate from '../lib/paginate'; import { PERM, PRIV } from '../model/builtin'; import * as discussion from '../model/discussion'; import * as document from '../model/document'; import message from '../model/message'; import * as oplog from '../model/oplog'; -import * as system from '../model/system'; import user from '../model/user'; import { Handler, param, Types } from '../service/server'; @@ -73,10 +71,10 @@ class DiscussionMainHandler extends Handler { // Limit to known types const parentType = { $in: Object.keys(typeMapper).map((i) => typeMapper[i]) }; all &&= this.user.hasPerm(PERM.PERM_MOD_BADGE); - const [ddocs, dpcount] = await paginate( + const [ddocs, dpcount] = await this.paginate( discussion.getMulti(domainId, { parentType, ...all ? {} : { hidden: false } }), page, - system.get('pagination.discussion'), + 'discussion', ); const udict = await user.getList(domainId, ddocs.map((ddoc) => ddoc.owner)); const [vndict, vnodes] = await Promise.all([ @@ -100,10 +98,10 @@ class DiscussionNodeHandler extends DiscussionHandler { else if (isSafeInteger(parseInt(_name, 10))) name = parseInt(_name, 10); else name = _name; const hidden = this.user.own(this.vnode) || this.user.hasPerm(PERM.PERM_EDIT_DISCUSSION) ? {} : { hidden: false }; - const [ddocs, dpcount] = await paginate( + const [ddocs, dpcount] = await this.paginate( discussion.getMulti(domainId, { parentType: typeMapper[type], parentId: name, ...hidden }), page, - system.get('pagination.discussion'), + 'discussion', ); const uids = ddocs.map((ddoc) => ddoc.owner); uids.push(this.vnode.owner); @@ -167,10 +165,10 @@ class DiscussionDetailHandler extends DiscussionHandler { const dsdoc = this.user.hasPriv(PRIV.PRIV_USER_PROFILE) ? await discussion.getStatus(domainId, did, this.user._id) : null; - const [drdocs, pcount, drcount] = await paginate( + const [drdocs, pcount, drcount] = await this.paginate( discussion.getMultiReply(domainId, did), page, - system.get('pagination.reply'), + 'reply', ); const uids = [ ...this.vnode.owner ? [this.vnode.owner] : [], diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index f3b10e895..e69741c89 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -5,14 +5,12 @@ import { Time } from '@hydrooj/utils/lib/utils'; import { ContestNotFoundError, HomeworkNotLiveError, NotAssignedError, ValidationError, } from '../error'; -import { PenaltyRules, Tdoc } from '../interface'; -import paginate from '../lib/paginate'; +import { PenaltyRules } from '../interface'; import { PERM } from '../model/builtin'; import * as contest from '../model/contest'; import * as discussion from '../model/discussion'; import problem from '../model/problem'; import record from '../model/record'; -import * as system from '../model/system'; import user from '../model/user'; import { Handler, param, Types } from '../service/server'; import { ContestCodeHandler, ContestScoreboardHandler } from './contest'; @@ -43,7 +41,7 @@ class HomeworkMainHandler extends Handler { }).sort({ penaltySince: -1, endAt: -1, beginAt: -1, _id: -1, }); - const [tdocs, tpcount] = await paginate(cursor, page, system.get('pagination.contest')); + const [tdocs, tpcount] = await this.paginate(cursor, page, 'contest'); const calendar = []; for (const tdoc of tdocs) { const cal = { ...tdoc, url: this.url('homework_detail', { tid: tdoc.docId }) }; @@ -83,10 +81,10 @@ class HomeworkDetailHandler extends Handler { ]); if (tdoc.rule !== 'homework') throw new ContestNotFoundError(domainId, tid); // discussion - const [ddocs, dpcount, dcount] = await paginate( + const [ddocs, dpcount, dcount] = await this.paginate( discussion.getMulti(domainId, { parentType: tdoc.docType, parentId: tdoc.docId }), page, - system.get('pagination.discussion'), + '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 7d19c3cd1..2ffc5c414 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -18,7 +18,6 @@ import { import { ProblemDoc, ProblemSearchOptions, ProblemStatusDoc, RecordDoc, User, } from '../interface'; -import paginate from '../lib/paginate'; import { PERM, PRIV, STATUS } from '../model/builtin'; import * as contest from '../model/contest'; import * as discussion from '../model/discussion'; @@ -854,10 +853,10 @@ export class ProblemSolutionHandler extends ProblemDetailHandler { this.checkPerm(PERM.PERM_VIEW_PROBLEM_SOLUTION); } // eslint-disable-next-line prefer-const - let [psdocs, pcount, pscount] = await paginate( + let [psdocs, pcount, pscount] = await this.paginate( solution.getMulti(domainId, this.pdoc.docId), page, - system.get('pagination.solution'), + 'solution', ); if (sid) { psdocs = [await solution.get(domainId, sid)]; diff --git a/packages/hydrooj/src/handler/training.ts b/packages/hydrooj/src/handler/training.ts index 78fcda2b6..803684000 100644 --- a/packages/hydrooj/src/handler/training.ts +++ b/packages/hydrooj/src/handler/training.ts @@ -7,7 +7,6 @@ import { FileLimitExceededError, FileUploadError, ProblemNotFoundError, ValidationError, } from '../error'; import { Tdoc, TrainingDoc } from '../interface'; -import paginate from '../lib/paginate'; import { PERM, PRIV, STATUS } from '../model/builtin'; import * as oplog from '../model/oplog'; import problem from '../model/problem'; @@ -64,10 +63,10 @@ class TrainingMainHandler extends Handler { async get(domainId: string, page = 1) { const query: Filter = {}; await this.ctx.parallel('training/list', query, this); - const [tdocs, tpcount] = await paginate( + const [tdocs, tpcount] = await this.paginate( training.getMulti(domainId), page, - system.get('pagination.training'), + 'training', ); const tids: Set = new Set(); for (const tdoc of tdocs) tids.add(tdoc.docId); diff --git a/packages/hydrooj/src/lib/index.ts b/packages/hydrooj/src/lib/index.ts index 752f9329b..0b836d544 100644 --- a/packages/hydrooj/src/lib/index.ts +++ b/packages/hydrooj/src/lib/index.ts @@ -1,6 +1,5 @@ import './i18n'; import './mail'; -import './paginate'; import './hash.hydro'; import './rank'; import './ui'; diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index c401810ec..44b5573c6 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -9,6 +9,7 @@ import Body from 'koa-body'; import Compress from 'koa-compress'; import proxy from 'koa-proxies'; import cache from 'koa-static-cache'; +import type { FindCursor } from 'mongodb'; import WebSocket from 'ws'; import { Counter, isClass, parseMemoryMB } from '@hydrooj/utils/lib/utils'; import { Context, Service } from '../context'; @@ -18,6 +19,7 @@ import { PrivilegeError, UserFacingError, } from '../error'; import { DomainDoc } from '../interface'; +import paginate from '../lib/paginate'; import serializer from '../lib/serializer'; import { Types } from '../lib/validator'; import { Logger } from '../logger'; @@ -150,6 +152,10 @@ export class HandlerCommon { await opcount.inc(op, id, periodSecs, maxOperations); } + paginate(cursor: FindCursor, page: number, key: string) { + return paginate(cursor, page, this.ctx.setting.get(`pagination.${key}`)); + } + renderTitle(str: string) { const name = this.domain?.ui?.name || system.get('server.name'); if (this.UiContext.extraTitleContent) return `${this.translate(str)} - ${this.UiContext.extraTitleContent} - ${name}`;