[API] Implement users/relation
This commit is contained in:
		
							parent
							
								
									c15148b23c
								
							
						
					
					
						commit
						649177985d
					
				
					 2 changed files with 81 additions and 48 deletions
				
			
		| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										28
									
								
								src/server/api/endpoints/users/relation.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/server/api/endpoints/users/relation.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue