refactoring
https: //github.com/misskey-dev/misskey/pull/7901 Co-Authored-By: MeiMei <30769358+mei23@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									22464c434e
								
							
						
					
					
						commit
						e617ced1d3
					
				
					 4 changed files with 110 additions and 50 deletions
				
			
		|  | @ -1,8 +1,9 @@ | |||
| import { IRemoteUser } from '@/models/entities/user'; | ||||
| import reject from '@/services/following/requests/reject'; | ||||
| import { remoteReject } from '@/services/following/reject'; | ||||
| import { IFollow } from '../../type'; | ||||
| import DbResolver from '../../db-resolver'; | ||||
| import { relayRejected } from '@/services/relay'; | ||||
| import { Users } from '@/models'; | ||||
| 
 | ||||
| export default async (actor: IRemoteUser, activity: IFollow): Promise<string> => { | ||||
| 	// ※ activityはこっちから投げたフォローリクエストなので、activity.actorは存在するローカルユーザーである必要がある
 | ||||
|  | @ -14,7 +15,7 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<string> => | |||
| 		return `skip: follower not found`; | ||||
| 	} | ||||
| 
 | ||||
| 	if (follower.host != null) { | ||||
| 	if (!Users.isLocalUser(follower)) { | ||||
| 		return `skip: follower is not a local user`; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -24,6 +25,6 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<string> => | |||
| 		return await relayRejected(match[1]); | ||||
| 	} | ||||
| 
 | ||||
| 	await reject(actor, follower); | ||||
| 	await remoteReject(actor, follower); | ||||
| 	return `ok`; | ||||
| }; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| import $ from 'cafy'; | ||||
| import { ID } from '@/misc/cafy-id'; | ||||
| import rejectFollowRequest from '@/services/following/requests/reject'; | ||||
| import { rejectFollowRequest } from '@/services/following/reject'; | ||||
| import define from '../../../define'; | ||||
| import { ApiError } from '../../../error'; | ||||
| import { getUser } from '../../../common/getters'; | ||||
|  |  | |||
							
								
								
									
										105
									
								
								packages/backend/src/services/following/reject.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								packages/backend/src/services/following/reject.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,105 @@ | |||
| import { renderActivity } from '@/remote/activitypub/renderer/index'; | ||||
| import renderFollow from '@/remote/activitypub/renderer/follow'; | ||||
| import renderReject from '@/remote/activitypub/renderer/reject'; | ||||
| import { deliver } from '@/queue/index'; | ||||
| import { publishMainStream, publishUserEvent } from '@/services/stream'; | ||||
| import { User, ILocalUser, IRemoteUser } from '@/models/entities/user'; | ||||
| import { Users, FollowRequests, Followings } from '@/models/index'; | ||||
| import { decrementFollowing } from './delete'; | ||||
| 
 | ||||
| type Local = ILocalUser | { id: User['id']; host: User['host']; uri: User['host'] }; | ||||
| type Remote = IRemoteUser; | ||||
| type Both = Local | Remote; | ||||
| 
 | ||||
| /** | ||||
|  * API following/request/reject | ||||
|  */ | ||||
| export async function rejectFollowRequest(user: Local, follower: Both) { | ||||
| 	if (Users.isRemoteUser(follower)) { | ||||
| 		deliverReject(user, follower); | ||||
| 	} | ||||
| 
 | ||||
| 	await removeFollowRequest(user, follower); | ||||
| 
 | ||||
| 	if (Users.isLocalUser(follower)) { | ||||
| 		publishUnfollow(user, follower); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * API following/reject | ||||
|  */ | ||||
| export async function rejectFollow(user: Local, follower: Both) { | ||||
| 	if (Users.isRemoteUser(follower)) { | ||||
| 		deliverReject(user, follower); | ||||
| 	} | ||||
| 
 | ||||
| 	await removeFollow(user, follower); | ||||
| 
 | ||||
| 	if (Users.isLocalUser(follower)) { | ||||
| 		publishUnfollow(user, follower); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * AP Reject/Follow | ||||
|  */ | ||||
| export async function remoteReject(actor: Remote, follower: Local) { | ||||
| 	await removeFollowRequest(actor, follower); | ||||
| 	await removeFollow(actor, follower); | ||||
| 	publishUnfollow(actor, follower); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Remove follow request record | ||||
|  */ | ||||
| async function removeFollowRequest(followee: Both, follower: Both) { | ||||
| 	const request = await FollowRequests.findOne({ | ||||
| 		followeeId: followee.id, | ||||
| 		followerId: follower.id | ||||
| 	}); | ||||
| 
 | ||||
| 	if (!request) return; | ||||
| 
 | ||||
| 	await FollowRequests.delete(request.id); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Remove follow record | ||||
|  */ | ||||
| async function removeFollow(followee: Both, follower: Both) { | ||||
| 	const following = await Followings.findOne({ | ||||
| 		followeeId: followee.id, | ||||
| 		followerId: follower.id | ||||
| 	}); | ||||
| 
 | ||||
| 	if (!following) return; | ||||
| 
 | ||||
| 	await Followings.delete(following.id); | ||||
| 	decrementFollowing(follower, followee); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Deliver Reject to remote | ||||
|  */ | ||||
| async function deliverReject(followee: Local, follower: Remote) { | ||||
| 	const request = await FollowRequests.findOne({ | ||||
| 		followeeId: followee.id, | ||||
| 		followerId: follower.id | ||||
| 	}); | ||||
| 
 | ||||
| 	const content = renderActivity(renderReject(renderFollow(follower, followee, request?.requestId || undefined), followee)); | ||||
| 	deliver(followee, content, follower.inbox); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Publish unfollow to local | ||||
|  */ | ||||
| async function publishUnfollow(followee: Both, follower: Local) { | ||||
| 	const packedFollowee = await Users.pack(followee.id, follower, { | ||||
| 		detail: true | ||||
| 	}); | ||||
| 
 | ||||
| 	publishUserEvent(follower.id, 'unfollow', packedFollowee); | ||||
| 	publishMainStream(follower.id, 'unfollow', packedFollowee); | ||||
| } | ||||
|  | @ -1,46 +0,0 @@ | |||
| import { renderActivity } from '@/remote/activitypub/renderer/index'; | ||||
| import renderFollow from '@/remote/activitypub/renderer/follow'; | ||||
| import renderReject from '@/remote/activitypub/renderer/reject'; | ||||
| import { deliver } from '@/queue/index'; | ||||
| import { publishMainStream, publishUserEvent } from '@/services/stream'; | ||||
| import { User, ILocalUser } from '@/models/entities/user'; | ||||
| import { Users, FollowRequests, Followings } from '@/models/index'; | ||||
| import { decrementFollowing } from '../delete'; | ||||
| 
 | ||||
| export default async function(followee: { id: User['id']; host: User['host']; uri: User['host'] }, follower: User) { | ||||
| 	if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) { | ||||
| 		const request = await FollowRequests.findOne({ | ||||
| 			followeeId: followee.id, | ||||
| 			followerId: follower.id | ||||
| 		}); | ||||
| 
 | ||||
| 		const content = renderActivity(renderReject(renderFollow(follower, followee, request!.requestId!), followee)); | ||||
| 		deliver(followee, content, follower.inbox); | ||||
| 	} | ||||
| 
 | ||||
| 	const request = await FollowRequests.findOne({ | ||||
| 		followeeId: followee.id, | ||||
| 		followerId: follower.id | ||||
| 	}); | ||||
| 
 | ||||
| 	if (request) { | ||||
| 		await FollowRequests.delete(request.id); | ||||
| 	} else { | ||||
| 		const following = await Followings.findOne({ | ||||
| 			followeeId: followee.id, | ||||
| 			followerId: follower.id | ||||
| 		}); | ||||
| 
 | ||||
| 		if (following) { | ||||
| 			await Followings.delete(following.id); | ||||
| 			decrementFollowing(follower, followee); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	Users.pack(followee.id, follower, { | ||||
| 		detail: true | ||||
| 	}).then(packed => { | ||||
| 		publishUserEvent(follower.id, 'unfollow', packed); | ||||
| 		publishMainStream(follower.id, 'unfollow', packed); | ||||
| 	}); | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue