mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-19 17:38:19 +08:00
core: add paginator keys
This commit is contained in:
7 files changed
+21
-23
No files matched your search
@@ -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);
|
||||
|
||||
@@ -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] : [],
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)];
|
||||
|
||||
@@ -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,6 +1,5 @@
|
||||
import './i18n';
|
||||
import './mail';
|
||||
import './paginate';
|
||||
import './hash.hydro';
|
||||
import './rank';
|
||||
import './ui';
|
||||
|
||||
@@ -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}`;
|
||||
|
||||
Reference in new issue
Block a user