From 20335e23f9cda7f06d8d230aad4f1799cc81dc28 Mon Sep 17 00:00:00 2001
From: MeiMei <30769358+mei23@users.noreply.github.com>
Date: Sun, 2 Dec 2018 03:42:45 +0900
Subject: [PATCH] Resolve external recommended users (#3462)

* Resolve external recommended users

* Skip unresolvable users

* Fix indent

* Use original for unresolvable users
---
 .../api/endpoints/users/recommendation.ts     | 43 +++++++++++++++----
 1 file changed, 34 insertions(+), 9 deletions(-)

diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts
index 2ed57c0d7b..bacace6a6a 100644
--- a/src/server/api/endpoints/users/recommendation.ts
+++ b/src/server/api/endpoints/users/recommendation.ts
@@ -1,12 +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: {
@@ -53,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);
@@ -90,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;
+}