mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-11-03 23:14:13 +00:00 
			
		
		
		
	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
		
		Reference in a new issue