core: add paginator keys

This commit is contained in:
undefined committed 2024-01-16 03:01:35 +08:00
1 parent 5d2ac74b04
commit 911676b050
7 files changed
+21 -23

No files matched your search

+1 -2
View File
@@ -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<Tdoc>(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);
+6 -8
View File
@@ -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] : [],
+4 -6
View File
@@ -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<Tdoc>(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);
+2 -3
View File
@@ -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)];
+2 -3
View File
@@ -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<TrainingDoc> = {};
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<ObjectId> = new Set();
for (const tdoc of tdocs) tids.add(tdoc.docId);
-1
View File
@@ -1,6 +1,5 @@
import './i18n';
import './mail';
import './paginate';
import './hash.hydro';
import './rank';
import './ui';
+6
View File
@@ -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<T>(cursor: FindCursor<T>, 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}`;