From 01bdf15a1fbaf013c53586a4e97406968c62ee41 Mon Sep 17 00:00:00 2001 From: mei23 Date: Sat, 4 Jan 2020 22:48:08 +0900 Subject: [PATCH] Resolve #544 --- src/server/api/endpoints/users/search.ts | 33 +++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts index fc8443c97a63..8eea21a04c3c 100644 --- a/src/server/api/endpoints/users/search.ts +++ b/src/server/api/endpoints/users/search.ts @@ -3,6 +3,8 @@ import * as escapeRegexp from 'escape-regexp'; import User, { pack, validateUsername, IUser } from '../../../../models/user'; import define from '../../define'; import { toDbHost } from '../../../../misc/convert-host'; +import Instance from '../../../../models/instance'; +import { concat } from '../../../../prelude/array'; export const meta = { desc: { @@ -69,9 +71,27 @@ export default define(meta, async (ps, me) => { let users: IUser[] = []; + // 隠すインスタンス + const hideInstances = await Instance.find({ + $or: [ + { isMarkedAsClosed: true }, + { isBlocked: true } + ] + }, { + fields: { + host: true + } + }); + + // 隠すホスト + const hideHosts = hideInstances.map(x => toDbHost(x.host)); + const hideHostsForRemote = concat([hideHosts, [null]]); + + // 表示名 if (isName) { const name = ps.query.replace(/^-/, ''); + // local users = await User .find({ host: null, @@ -83,9 +103,10 @@ export default define(meta, async (ps, me) => { }); if (users.length < ps.limit && !ps.localOnly) { + // try remote const otherUsers = await User .find({ - host: { $ne: null }, + host: { $nin: hideHostsForRemote }, name: new RegExp('^' + escapeRegexp(name), 'i'), isSuspended: { $ne: true } }, { @@ -94,10 +115,13 @@ export default define(meta, async (ps, me) => { users = users.concat(otherUsers); } + // ユーザー名 } else if (isUsername) { + // まず、username (local/remote) の完全一致でアクティブ順 if (users.length < ps.limit && !ps.localOnly) { users = await User .find({ + host: { $nin: hideHosts }, usernameLower: ps.query.replace('@', '').toLowerCase(), isSuspended: { $ne: true } }, { @@ -109,6 +133,7 @@ export default define(meta, async (ps, me) => { const ids = users.map(user => user._id); + // 足りなかったら、username (local) の前方一致でid順 if (users.length < ps.limit) { const otherUsers = await User .find({ @@ -122,13 +147,14 @@ export default define(meta, async (ps, me) => { }); users = users.concat(otherUsers); - } + } + // 足りなかったら、username (remote) の前方一致でid順 if (users.length < ps.limit && !ps.localOnly) { const otherUsers = await User .find({ _id: { $nin: ids }, - host: { $ne: null }, + host: { $nin: hideHostsForRemote }, usernameLower: new RegExp('^' + escapeRegexp(ps.query.replace('@', '').toLowerCase())), isSuspended: { $ne: true } }, { @@ -138,6 +164,7 @@ export default define(meta, async (ps, me) => { users = users.concat(otherUsers); } + // ホスト名 } else if (isHostname) { users = await User .find({