feat: search with sonic

This commit is contained in:
undefined committed 2021-04-02 00:39:21 +08:00
1 parent 5d01c81607
commit 43c4bfd8e7
43 files changed
+512 -317

No files matched your search

+1 -1
View File
@@ -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';
+8 -8
View File
@@ -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);
+1 -1
View File
@@ -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';
+1 -1
View File
@@ -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,
+3 -3
View File
@@ -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);
}
}
+5 -1
View File
@@ -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,
+2 -2
View File
@@ -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 },
);
+11 -5
View File
@@ -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 });
}
}
+4 -4
View File
@@ -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 = {
+4 -3
View File
@@ -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']);
+1 -1
View File
@@ -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';
+3 -3
View File
@@ -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) {