diff --git a/hydro/handler/domain.ts b/hydro/handler/domain.ts index 1a4f34d93..3e116a2ad 100644 --- a/hydro/handler/domain.ts +++ b/hydro/handler/domain.ts @@ -2,7 +2,8 @@ import { RoleAlreadyExistError, ValidationError } from '../error'; import * as user from '../model/user'; import * as domain from '../model/domain'; import { DOMAIN_SETTINGS, DOMAIN_SETTINGS_BY_KEY } from '../model/setting'; -import { PERM, PERMS_BY_FAMILY } from '../model/builtin'; +import { PERM, PERMS_BY_FAMILY, PRIV } from '../model/builtin'; +import { gravatar } from '../lib/misc'; import paginate from '../lib/paginate'; import { Route, Handler, Types, param, @@ -180,6 +181,17 @@ class DomainRoleHandler extends ManageHandler { } } +class DomainSearchHandler extends Handler { + @param('q', Types.String) + async get(q: string) { + const ddocs = await domain.getPrefixSearch(q, 20); + for (let i = 0; i < ddocs.length; i++) { + ddocs[i].gravatar = ddocs[i].gravatar ? gravatar(ddocs[i].gravatar) : '/img/team_avatar.png'; + } + this.response.body = ddocs; + } +} + export async function apply() { Route('ranking', '/ranking', DomainRankHandler); Route('domain_dashboard', '/domain/dashboard', DomainDashboardHandler); @@ -187,6 +199,7 @@ export async function apply() { Route('domain_user', '/domain/user', DomainUserHandler); Route('domain_permission', '/domain/permission', DomainPermissionHandler); Route('domain_role', '/domain/role', DomainRoleHandler); + Route('domain_search', '/domain/search', DomainSearchHandler, PRIV.PRIV_USER_PROFILE); } global.Hydro.handler.domain = apply; diff --git a/hydro/loader.ts b/hydro/loader.ts index e42a00594..e145170f6 100644 --- a/hydro/loader.ts +++ b/hydro/loader.ts @@ -96,9 +96,7 @@ async function executeCommand(input: string) { async function messageHandler(worker: cluster.Worker, msg: any) { if (!msg) msg = worker; if (msg.event) { - if (msg.event === 'setAddon') { - global.addons = msg.addons; - } else if (msg.event === 'bus') { + if (msg.event === 'bus') { if (cluster.isMaster) { for (const i in cluster.workers) { cluster.workers[i].send(msg); @@ -165,11 +163,6 @@ process.on('unhandledRejection', (e) => console.error(e)); process.on('SIGINT', terminate); export async function load() { - while (!global.addons) { - await new Promise((resolve) => { - setTimeout(resolve, 100); - }); - } addon(path.resolve(__dirname, '..')); Error.stackTraceLimit = 50; process.on('message', messageHandler); @@ -201,19 +194,22 @@ export async function load() { }); cluster.on('online', (worker) => { console.log(`Worker ${worker.process.pid} ${worker.id} is online`); - worker.send({ event: 'setAddon', addons: global.addons }); }); await startWorker(cnt); - } else if (argv.entry) { - console.log(`Worker ${process.pid} Starting as ${argv.entry}`); - await entry({ entry: argv.entry }); - console.log(`Worker ${process.pid} Started as ${argv.entry}`); } else { - if (argv.firstWorker) cluster.isFirstWorker = true; - else cluster.isFirstWorker = false; - console.log(`Worker ${process.pid} Starting`); - await entry({ entry: 'worker' }); - console.log(`Worker ${process.pid} Started`); + global.addons = JSON.parse(Buffer.from(argv.addons as string, 'base64').toString()); + console.log(global.addons); + if (argv.entry) { + console.log(`Worker ${process.pid} Starting as ${argv.entry}`); + await entry({ entry: argv.entry }); + console.log(`Worker ${process.pid} Started as ${argv.entry}`); + } else { + if (argv.firstWorker) cluster.isFirstWorker = true; + else cluster.isFirstWorker = false; + console.log(`Worker ${process.pid} Starting`); + await entry({ entry: 'worker' }); + console.log(`Worker ${process.pid} Started`); + } } if (global.gc) global.gc(); } diff --git a/hydro/model/domain.ts b/hydro/model/domain.ts index fd1540364..23148e0cb 100644 --- a/hydro/model/domain.ts +++ b/hydro/model/domain.ts @@ -142,6 +142,14 @@ export async function getDictUserByDomainId(uid: number) { return dudict; } +export async function getPrefixSearch(prefix: string, limit = 50) { + const $regex = new RegExp(prefix, 'mi'); + const ddocs = await coll.find({ + $or: [{ _id: { $regex } }, { name: { $regex } }], + }).limit(limit).toArray(); + return ddocs; +} + global.Hydro.model.domain = { getRoles, add, @@ -161,4 +169,5 @@ global.Hydro.model.domain = { incUserInDomain, getMultiInDomain, getDictUserByDomainId, + getPrefixSearch, }; diff --git a/package.json b/package.json index 84e4d8be8..68aadfbde 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.9.11", + "version": "2.9.12", "main": "dist/loader.js", "bin": "bin/hydrooj.js", "repository": "https://github.com/hydro-dev/Hydro.git",