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