[API] Implement users/relation
This commit is contained in:
		
							parent
							
								
									c15148b23c
								
							
						
					
					
						commit
						649177985d
					
				|  | @ -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) { | ||||
|  |  | |||
|  | @ -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]); | ||||
| }); | ||||
		Loading…
	
		Reference in New Issue