From 5296c1e0a3834f6e808df37e7389f9904df974a7 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 1 Nov 2018 00:11:21 +0900 Subject: [PATCH] [API] Implement users/relation --- src/models/user.ts | 101 +++++++++++---------- src/server/api/endpoints/users/relation.ts | 28 ++++++ 2 files changed, 81 insertions(+), 48 deletions(-) create mode 100644 src/server/api/endpoints/users/relation.ts diff --git a/src/models/user.ts b/src/models/user.ts index ce877fe27..1a596c621 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -155,6 +155,50 @@ export function isValidBirthday(birthday: string): boolean { } //#endregion +export async function getRelation(me: mongo.ObjectId, target: mongo.ObjectId) { + const [following1, following2, followReq1, followReq2, toBlocking, fromBlocked, mute] = await Promise.all([ + Following.findOne({ + followerId: me, + followeeId: target + }), + Following.findOne({ + followerId: target, + followeeId: me + }), + FollowRequest.findOne({ + followerId: me, + followeeId: target + }), + FollowRequest.findOne({ + followerId: target, + followeeId: me + }), + Blocking.findOne({ + blockerId: me, + blockeeId: target + }), + Blocking.findOne({ + blockerId: target, + blockeeId: me + }), + Mute.findOne({ + muterId: me, + muteeId: target + }) + ]); + + return { + isFollowing: following1 !== null, + isStalking: following1 && following1.stalk, + hasPendingFollowRequestFromYou: followReq1 !== null, + hasPendingFollowRequestToYou: followReq2 !== null, + isFollowed: following2 !== null, + isBlocking: toBlocking !== null, + isBlocked: fromBlocked !== null, + isMuted: mute !== null + }; +} + /** * Pack a user for API response * @@ -271,55 +315,16 @@ export const pack = ( } if (meId && !meId.equals(_user.id) && opts.detail) { - const [following1, following2, followReq1, followReq2, toBlocking, fromBlocked, mute] = await Promise.all([ - Following.findOne({ - followerId: meId, - followeeId: _user.id - }), - Following.findOne({ - followerId: _user.id, - followeeId: meId - }), - FollowRequest.findOne({ - followerId: meId, - followeeId: _user.id - }), - FollowRequest.findOne({ - followerId: _user.id, - followeeId: meId - }), - Blocking.findOne({ - blockerId: meId, - blockeeId: _user.id - }), - Blocking.findOne({ - blockerId: _user.id, - blockeeId: meId - }), - Mute.findOne({ - muterId: meId, - muteeId: _user.id - }) - ]); + const relation = await getRelation(meId, _user.id); - // Whether the user is following - _user.isFollowing = following1 !== null; - _user.isStalking = following1 && following1.stalk; - - _user.hasPendingFollowRequestFromYou = followReq1 !== null; - _user.hasPendingFollowRequestToYou = followReq2 !== null; - - // Whether the user is followed - _user.isFollowed = following2 !== null; - - // Whether the user is blocking - _user.isBlocking = toBlocking !== null; - - // Whether the user is blocked - _user.isBlocked = fromBlocked !== null; - - // Whether the user is muted - _user.isMuted = mute !== null; + _user.isFollowing = relation.isFollowing; + _user.isFollowed = relation.isFollowed; + _user.isStalking = relation.isStalking; + _user.hasPendingFollowRequestFromYou = relation.hasPendingFollowRequestFromYou; + _user.hasPendingFollowRequestToYou = relation.hasPendingFollowRequestToYou; + _user.isBlocking = relation.isBlocking; + _user.isBlocked = relation.isBlocked; + _user.isMuted = relation.isMuted; } if (opts.detail) { diff --git a/src/server/api/endpoints/users/relation.ts b/src/server/api/endpoints/users/relation.ts new file mode 100644 index 000000000..d29065d11 --- /dev/null +++ b/src/server/api/endpoints/users/relation.ts @@ -0,0 +1,28 @@ +import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; +import { ILocalUser, getRelation } from '../../../../models/user'; +import getParams from '../../get-params'; + +export const meta = { + desc: { + 'ja-JP': 'ユーザー間のリレーションを取得します。' + }, + + params: { + userId: $.or($.type(ID), $.arr($.type(ID)).unique()).note({ + desc: { + 'ja-JP': 'ユーザーID (配列でも可)' + } + }) + } +}; + +export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => { + const [ps, psErr] = getParams(meta, params); + if (psErr) return rej(psErr); + + const ids = Array.isArray(ps.userId) ? ps.userId : [ps.userId]; + + const relations = await Promise.all(ids.map(id => getRelation(me._id, id))); + + res(Array.isArray(ps.userId) ? relations : relations[0]); +});