[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
 | 
					//#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
 | 
					 * Pack a user for API response
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -271,55 +315,16 @@ export const pack = (
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (meId && !meId.equals(_user.id) && opts.detail) {
 | 
						if (meId && !meId.equals(_user.id) && opts.detail) {
 | 
				
			||||||
		const [following1, following2, followReq1, followReq2, toBlocking, fromBlocked, mute] = await Promise.all([
 | 
							const relation = await getRelation(meId, _user.id);
 | 
				
			||||||
			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
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
		]);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Whether the user is following
 | 
							_user.isFollowing = relation.isFollowing;
 | 
				
			||||||
		_user.isFollowing = following1 !== null;
 | 
							_user.isFollowed = relation.isFollowed;
 | 
				
			||||||
		_user.isStalking = following1 && following1.stalk;
 | 
							_user.isStalking = relation.isStalking;
 | 
				
			||||||
 | 
							_user.hasPendingFollowRequestFromYou = relation.hasPendingFollowRequestFromYou;
 | 
				
			||||||
		_user.hasPendingFollowRequestFromYou = followReq1 !== null;
 | 
							_user.hasPendingFollowRequestToYou = relation.hasPendingFollowRequestToYou;
 | 
				
			||||||
		_user.hasPendingFollowRequestToYou = followReq2 !== null;
 | 
							_user.isBlocking = relation.isBlocking;
 | 
				
			||||||
 | 
							_user.isBlocked = relation.isBlocked;
 | 
				
			||||||
		// Whether the user is followed
 | 
							_user.isMuted = relation.isMuted;
 | 
				
			||||||
		_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;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (opts.detail) {
 | 
						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