summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/users
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api/endpoints/users')
-rw-r--r--src/server/api/endpoints/users/recommendation.ts54
-rw-r--r--src/server/api/endpoints/users/search.ts91
-rw-r--r--src/server/api/endpoints/users/show.ts2
3 files changed, 52 insertions, 95 deletions
diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts
index 127029f83c..bacace6a6a 100644
--- a/src/server/api/endpoints/users/recommendation.ts
+++ b/src/server/api/endpoints/users/recommendation.ts
@@ -1,11 +1,13 @@
const ms = require('ms');
import $ from 'cafy';
-import User, { pack } from '../../../../models/user';
+import User, { pack, ILocalUser } from '../../../../models/user';
import { getFriendIds } from '../../common/get-friends';
import Mute from '../../../../models/mute';
-import * as request from 'request';
+import * as request from 'request-promise-native';
import config from '../../../../config';
import define from '../../define';
+import fetchMeta from '../../../../misc/fetch-meta';
+import resolveUser from '../../../../remote/resolve-user';
export const meta = {
desc: {
@@ -30,13 +32,15 @@ export const meta = {
};
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
- if (config.user_recommendation && config.user_recommendation.external) {
+ const instance = await fetchMeta();
+
+ if (instance.enableExternalUserRecommendation) {
const userName = me.username;
const hostName = config.hostname;
const limit = ps.limit;
const offset = ps.offset;
- const timeout = config.user_recommendation.timeout;
- const engine = config.user_recommendation.engine;
+ const timeout = instance.externalUserRecommendationTimeout;
+ const engine = instance.externalUserRecommendationEngine;
const url = engine
.replace('{{host}}', hostName)
.replace('{{user}}', userName)
@@ -50,13 +54,10 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
json: true,
followRedirect: true,
followAllRedirects: true
- }, (error: any, response: any, body: any) => {
- if (!error && response.statusCode == 200) {
- res(body);
- } else {
- res([]);
- }
- });
+ })
+ .then(body => convertUsers(body, me))
+ .then(packed => res(packed))
+ .catch(e => rej(e));
} else {
// ID list of the user itself and other users who the user follows
const followingIds = await getFriendIds(me._id);
@@ -72,7 +73,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
$nin: followingIds.concat(mutedUserIds)
},
isLocked: { $ne: true },
- lastUsedAt: {
+ updatedAt: {
$gte: new Date(Date.now() - ms('7days'))
},
host: null
@@ -87,3 +88,30 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
}
}));
+
+type IRecommendUser = {
+ name: string;
+ username: string;
+ host: string;
+ description: string;
+ avatarUrl: string;
+};
+
+/**
+ * Resolve/Pack dummy users
+ */
+async function convertUsers(src: IRecommendUser[], me: ILocalUser) {
+ const packed = await Promise.all(src.map(async x => {
+ const user = await resolveUser(x.username, x.host)
+ .catch(() => {
+ console.warn(`Can't resolve ${x.username}@${x.host}`);
+ return null;
+ });
+
+ if (user == null) return x;
+
+ return await pack(user, me, { detail: true });
+ }));
+
+ return packed;
+}
diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts
index edc4d603ca..f7f1794962 100644
--- a/src/server/api/endpoints/users/search.ts
+++ b/src/server/api/endpoints/users/search.ts
@@ -41,11 +41,19 @@ export const meta = {
'ja-JP': 'ローカルユーザーのみ検索対象にするか否か'
}
},
+
+ detail: {
+ validator: $.bool.optional,
+ default: true,
+ desc: {
+ 'ja-JP': '詳細なユーザー情報を含めるか否か'
+ }
+ },
},
};
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
- const isUsername = validateUsername(ps.query.replace('@', ''));
+ const isUsername = validateUsername(ps.query.replace('@', ''), true);
let users: IUser[] = [];
@@ -70,86 +78,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
users = users.concat(otherUsers);
}
-
- if (users.length < ps.limit) {
- const otherUsers = await User
- .find({
- _id: { $nin: users.map(u => u._id) },
- host: null,
- usernameLower: new RegExp(escapeRegexp(ps.query.replace('@', '').toLowerCase()))
- }, {
- limit: ps.limit - users.length
- });
-
- users = users.concat(otherUsers);
- }
-
- if (users.length < ps.limit && !ps.localOnly) {
- const otherUsers = await User
- .find({
- _id: { $nin: users.map(u => u._id) },
- host: { $ne: null },
- usernameLower: new RegExp(escapeRegexp(ps.query.replace('@', '').toLowerCase()))
- }, {
- limit: ps.limit - users.length
- });
-
- users = users.concat(otherUsers);
- }
- }
-
- if (users.length < ps.limit) {
- const otherUsers = await User
- .find({
- _id: { $nin: users.map(u => u._id) },
- host: null,
- name: new RegExp('^' + escapeRegexp(ps.query.toLowerCase()))
- }, {
- limit: ps.limit - users.length
- });
-
- users = users.concat(otherUsers);
- }
-
- if (users.length < ps.limit && !ps.localOnly) {
- const otherUsers = await User
- .find({
- _id: { $nin: users.map(u => u._id) },
- host: { $ne: null },
- name: new RegExp('^' + escapeRegexp(ps.query.toLowerCase()))
- }, {
- limit: ps.limit - users.length
- });
-
- users = users.concat(otherUsers);
- }
-
- if (users.length < ps.limit) {
- const otherUsers = await User
- .find({
- _id: { $nin: users.map(u => u._id) },
- host: null,
- name: new RegExp(escapeRegexp(ps.query.toLowerCase()))
- }, {
- limit: ps.limit - users.length
- });
-
- users = users.concat(otherUsers);
- }
-
- if (users.length < ps.limit && !ps.localOnly) {
- const otherUsers = await User
- .find({
- _id: { $nin: users.map(u => u._id) },
- host: { $ne: null },
- name: new RegExp(escapeRegexp(ps.query.toLowerCase()))
- }, {
- limit: ps.limit - users.length
- });
-
- users = users.concat(otherUsers);
}
- // Serialize
- res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
+ res(await Promise.all(users.map(user => pack(user, me, { detail: ps.detail }))));
}));
diff --git a/src/server/api/endpoints/users/show.ts b/src/server/api/endpoints/users/show.ts
index 6e4cf514de..fd26554709 100644
--- a/src/server/api/endpoints/users/show.ts
+++ b/src/server/api/endpoints/users/show.ts
@@ -80,7 +80,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
}));
if (isRemoteUser(user)) {
- if (user.updatedAt == null || Date.now() - user.updatedAt.getTime() > 1000 * 60 * 60 * 24) {
+ if (user.lastFetchedAt == null || Date.now() - user.lastFetchedAt.getTime() > 1000 * 60 * 60 * 24) {
resolveRemoteUser(ps.username, ps.host, { }, true);
}
}