mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-18 17:38:19 +08:00
feat: search with sonic
This commit is contained in:
1 parent
5d01c81607
commit
43c4bfd8e7
43 files changed
+512
-317
No files matched your search
@@ -12,7 +12,7 @@ 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 problem from '../model/problem';
|
||||
import domain from '../model/domain';
|
||||
import record from '../model/record';
|
||||
import user from '../model/user';
|
||||
|
||||
@@ -17,11 +17,11 @@ import {
|
||||
import { gravatar } from '../lib/misc';
|
||||
import paginate from '../lib/paginate';
|
||||
import {
|
||||
Route, Handler, Types, param,
|
||||
Route, Handler, Types, param, query, post,
|
||||
} from '../service/server';
|
||||
|
||||
class DomainRankHandler extends Handler {
|
||||
@param('page', Types.PositiveInt, true)
|
||||
@query('page', Types.PositiveInt, true)
|
||||
async get(domainId: string, page = 1) {
|
||||
const [dudocs, upcount, ucount] = await paginate(
|
||||
domain.getMultiUserInDomain(domainId).sort({ rp: -1 }),
|
||||
@@ -129,8 +129,8 @@ class DomainUserHandler extends ManageHandler {
|
||||
};
|
||||
}
|
||||
|
||||
@param('uid', Types.Int)
|
||||
@param('role', Types.String)
|
||||
@post('uid', Types.Int)
|
||||
@post('role', Types.String)
|
||||
async postSetUser(domainId: string, uid: number, role: string) {
|
||||
await domain.setUserRole(domainId, uid, role);
|
||||
this.back();
|
||||
@@ -228,10 +228,10 @@ class DomainJoinApplicationsHandler extends ManageHandler {
|
||||
this.response.template = 'domain_join_applications.html';
|
||||
}
|
||||
|
||||
@param('method', Types.Range([domain.JOIN_METHOD_NONE, domain.JOIN_METHOD_ALL, domain.JOIN_METHOD_CODE]))
|
||||
@param('role', Types.String, true)
|
||||
@param('expire', Types.Int, true)
|
||||
@param('invitationCode', Types.String, true)
|
||||
@post('method', Types.Range([domain.JOIN_METHOD_NONE, domain.JOIN_METHOD_ALL, domain.JOIN_METHOD_CODE]))
|
||||
@post('role', Types.String, true)
|
||||
@post('expire', Types.Int, true)
|
||||
@post('invitationCode', Types.String, true)
|
||||
async post(domainId: string, method: number, role: string, expire: number, invitationCode = '') {
|
||||
const r = await domain.getRoles(this.domain);
|
||||
const roles = r.map((rl) => rl._id);
|
||||
|
||||
@@ -18,7 +18,7 @@ import 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';
|
||||
import problem from '../model/problem';
|
||||
import record from '../model/record';
|
||||
import * as document from '../model/document';
|
||||
import paginate from '../lib/paginate';
|
||||
|
||||
@@ -10,7 +10,7 @@ import yaml from 'js-yaml';
|
||||
import { ValidationError, RemoteOnlineJudgeError } from '../error';
|
||||
import { Logger } from '../logger';
|
||||
import type { ContentNode } from '../interface';
|
||||
import * as problem from '../model/problem';
|
||||
import problem from '../model/problem';
|
||||
import { PERM } from '../model/builtin';
|
||||
import {
|
||||
Route, Handler, Types, post,
|
||||
|
||||
@@ -4,7 +4,7 @@ import { sleep } from '../utils';
|
||||
import { Logger } from '../logger';
|
||||
import difficultyAlgorithm from '../lib/difficulty';
|
||||
import record from '../model/record';
|
||||
import * as problem from '../model/problem';
|
||||
import problem from '../model/problem';
|
||||
import * as builtin from '../model/builtin';
|
||||
import * as contest from '../model/contest';
|
||||
import domain from '../model/domain';
|
||||
@@ -14,7 +14,7 @@ import {
|
||||
Route, Handler, Connection, ConnectionHandler, post, Types,
|
||||
} from '../service/server';
|
||||
import storage from '../service/storage';
|
||||
import { updateJudger } from '../service/monitor';
|
||||
import { updateJudge } from '../service/monitor';
|
||||
|
||||
const logger = new Logger('judge');
|
||||
|
||||
@@ -145,7 +145,7 @@ class JudgeConnectionHandler extends ConnectionHandler {
|
||||
this.processing = null;
|
||||
await this.newTask();
|
||||
} else if (msg.key === 'status') {
|
||||
await updateJudger(msg.info);
|
||||
await updateJudge(msg.info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import * as yaml from 'js-yaml';
|
||||
import * as judge from './judge';
|
||||
import { ValidationError } from '../error';
|
||||
import * as check from '../check';
|
||||
import { Logger } from '../logger';
|
||||
import * as setting from '../model/setting';
|
||||
import * as system from '../model/system';
|
||||
import user from '../model/user';
|
||||
@@ -17,6 +18,8 @@ import {
|
||||
validate, isEmail, isUname, isPassword,
|
||||
} from '../lib/validator';
|
||||
|
||||
const logger = new Logger('manage');
|
||||
|
||||
function set(key: string, value: any) {
|
||||
if (setting.SYSTEM_SETTINGS_BY_KEY[key]) {
|
||||
const s = setting.SYSTEM_SETTINGS_BY_KEY[key];
|
||||
@@ -125,11 +128,12 @@ class SystemScriptHandler extends SystemHandler {
|
||||
})
|
||||
.catch((err: Error) => {
|
||||
const time = new Date().getTime() - start;
|
||||
logger.error(err);
|
||||
judge.end({
|
||||
domainId,
|
||||
rid,
|
||||
status: STATUS.STATUS_SYSTEM_ERROR,
|
||||
message: `${err} \n${err.stack} `,
|
||||
message: `${err.message} \n${err.stack} `,
|
||||
judger: 1,
|
||||
time,
|
||||
memory: 0,
|
||||
|
||||
@@ -32,9 +32,9 @@ class StatusHandler extends Handler {
|
||||
class StatusUpdateHandler extends Handler {
|
||||
async post(args) {
|
||||
this.checkPriv(PRIV.PRIV_JUDGE);
|
||||
args.type = 'judger';
|
||||
args.type = 'judge';
|
||||
return coll.updateOne(
|
||||
{ mid: args.mid, type: 'judger' },
|
||||
{ mid: args.mid, type: 'judge' },
|
||||
{ $set: args },
|
||||
{ upsert: true },
|
||||
);
|
||||
|
||||
@@ -12,7 +12,7 @@ import paginate from '../lib/paginate';
|
||||
import { isTitle, isContent, isPid } from '../lib/validator';
|
||||
import difficultyAlgorithm from '../lib/difficulty';
|
||||
import * as system from '../model/system';
|
||||
import * as problem from '../model/problem';
|
||||
import problem from '../model/problem';
|
||||
import record from '../model/record';
|
||||
import domain from '../model/domain';
|
||||
import user from '../model/user';
|
||||
@@ -62,18 +62,26 @@ export class ProblemMainHandler extends ProblemHandler {
|
||||
['Hydro', 'homepage'],
|
||||
['problem_main', null],
|
||||
];
|
||||
const search = global.Hydro.lib.problemSearch;
|
||||
let sort: number[];
|
||||
if (q) {
|
||||
query.$text = { $search: q };
|
||||
path[1][1] = 'problem_main';
|
||||
path.push([q, null, null, true]);
|
||||
if (search) {
|
||||
const result = await search(domainId, q);
|
||||
query.docId = { $in: result };
|
||||
sort = result;
|
||||
} else query.$text = { $search: q };
|
||||
}
|
||||
if (!this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN)) query.hidden = false;
|
||||
await bus.serial('problem/list', query, this);
|
||||
const [pdocs, ppcount, pcount] = await paginate(
|
||||
// eslint-disable-next-line prefer-const
|
||||
let [pdocs, ppcount, pcount] = await paginate(
|
||||
problem.getMulti(domainId, query).sort({ pid: 1, docId: 1 }),
|
||||
page,
|
||||
system.get('pagination.problem'),
|
||||
);
|
||||
if (sort) pdocs = pdocs.sort((a, b) => sort.indexOf(a.docId) - sort.indexOf(b.docId));
|
||||
if (q && +q) {
|
||||
const pdoc = await problem.get(domainId, +q, this.user._id, problem.PROJECTION_LIST);
|
||||
if (pdoc) pdocs.unshift(pdoc);
|
||||
@@ -341,9 +349,7 @@ export class ProblemEditHandler extends ProblemManageHandler {
|
||||
};
|
||||
let pdoc = await problem.get(domainId, pid);
|
||||
$update.difficulty = difficultyAlgorithm(pdoc.nSubmit, pdoc.nAccept);
|
||||
await bus.serial('problem/before-edit', $update);
|
||||
pdoc = await problem.edit(domainId, pdoc.docId, $update);
|
||||
await bus.emit('problem/edit', pdoc);
|
||||
this.response.redirect = this.url('problem_detail', { pid: newPid || pdoc.docId });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import { PermissionError, RecordNotFoundError } from '../error';
|
||||
import { Rdoc } from '../interface';
|
||||
import { PERM, STATUS, PRIV } from '../model/builtin';
|
||||
import * as system from '../model/system';
|
||||
import * as problem from '../model/problem';
|
||||
import problem from '../model/problem';
|
||||
import record from '../model/record';
|
||||
import * as contest from '../model/contest';
|
||||
import user from '../model/user';
|
||||
@@ -49,7 +49,7 @@ class RecordListHandler extends RecordHandler {
|
||||
user.getList(domainId, rdocs.map((rdoc) => rdoc.uid)),
|
||||
canViewProblem
|
||||
? problem.getList(domainId, rdocs.map((rdoc) => rdoc.pid), canViewProblemHidden, false)
|
||||
: Object.fromEntries([rdocs.map((rdoc) => [rdoc.pid, problem.Pdoc.create(rdoc.pid, rdoc.pid)])]),
|
||||
: Object.fromEntries([rdocs.map((rdoc) => [rdoc.pid, problem.create(rdoc.pid, rdoc.pid)])]),
|
||||
]);
|
||||
const path = [
|
||||
['Hydro', 'homepage'],
|
||||
@@ -88,11 +88,11 @@ class RecordDetailHandler extends RecordHandler {
|
||||
user.getById(domainId, rdoc.uid),
|
||||
]);
|
||||
if (!(pdoc && this.user.hasPerm(PERM.PERM_VIEW_PROBLEM))) {
|
||||
pdoc = problem.Pdoc.create(pdoc?.docId || 0, pdoc?.pid || '*');
|
||||
pdoc = problem.create(pdoc?.docId || 0, pdoc?.pid || '*');
|
||||
}
|
||||
if (!rdoc.contest && pdoc.hidden && pdoc.owner !== this.user._id) {
|
||||
if (!this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN)) {
|
||||
pdoc = problem.Pdoc.create(pdoc.docId, pdoc.pid);
|
||||
pdoc = problem.create(pdoc.docId, pdoc.pid);
|
||||
}
|
||||
}
|
||||
this.response.body = {
|
||||
|
||||
@@ -6,7 +6,7 @@ import { Logger } from '../logger';
|
||||
import { ProblemAdd } from '../lib/ui';
|
||||
import { PERM } from '../model/builtin';
|
||||
import token from '../model/token';
|
||||
import * as problem from '../model/problem';
|
||||
import problem from '../model/problem';
|
||||
import * as system from '../model/system';
|
||||
import {
|
||||
Handler, Types, Route, post,
|
||||
@@ -24,9 +24,10 @@ export class ProblemSendHandler extends Handler {
|
||||
|
||||
@post('target', Types.String)
|
||||
@post('pids', Types.Array)
|
||||
async postSend(domainId: string, target: any, _pids: (number | string)[]) {
|
||||
async postSend(domainId: string, _target: string, _pids: (number | string)[]) {
|
||||
this.checkPerm(PERM.PERM_VIEW_PROBLEM);
|
||||
target = target.split('@');
|
||||
const target = _target.split('@');
|
||||
if (target[1].endsWith('/')) target[1] = target[1].substr(0, target[1].length - 1);
|
||||
const getHidden = this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN);
|
||||
const getData = this.user.hasPerm(PERM.PERM_READ_PROBLEM_DATA);
|
||||
const pdocs = await problem.getList(domainId, _pids, true, true, ['docId', 'owner', 'hidden']);
|
||||
|
||||
@@ -6,7 +6,7 @@ import { isTitle, isContent, isDescription } from '../lib/validator';
|
||||
import paginate from '../lib/paginate';
|
||||
import * as system from '../model/system';
|
||||
import { PERM, PRIV } from '../model/builtin';
|
||||
import * as problem from '../model/problem';
|
||||
import problem from '../model/problem';
|
||||
import * as builtin from '../model/builtin';
|
||||
import * as training from '../model/training';
|
||||
import user from '../model/user';
|
||||
|
||||
@@ -11,7 +11,7 @@ import user from '../model/user';
|
||||
import oauth from '../model/oauth';
|
||||
import token from '../model/token';
|
||||
import record from '../model/record';
|
||||
import * as problem from '../model/problem';
|
||||
import problem, { Pdoc } from '../model/problem';
|
||||
import task from '../model/task';
|
||||
import * as system from '../model/system';
|
||||
import { PERM, PRIV } from '../model/builtin';
|
||||
@@ -183,7 +183,7 @@ class UserDetailHandler extends Handler {
|
||||
1,
|
||||
100,
|
||||
)
|
||||
: [[], 0, 0] as [problem.Pdoc[], number, number],
|
||||
: [[], 0, 0] as [Pdoc[], number, number],
|
||||
]);
|
||||
const pdict = this.user.hasPerm(PERM.PERM_VIEW_PROBLEM)
|
||||
? await problem.getList(
|
||||
@@ -191,7 +191,7 @@ class UserDetailHandler extends Handler {
|
||||
this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN), false,
|
||||
)
|
||||
: Object.fromEntries(rdocs.map(
|
||||
(rdoc) => [rdoc.pid, problem.Pdoc.create(undefined, rdoc.pid.toString())],
|
||||
(rdoc) => [rdoc.pid, problem.create(undefined, rdoc.pid.toString())],
|
||||
));
|
||||
// Remove sensitive data
|
||||
if (!isSelfProfile && sdoc) {
|
||||
|
||||
Reference in new issue
Block a user