summaryrefslogtreecommitdiff
path: root/src/processor/http/unfollow.ts
blob: d3d5f2246fc2cff0a755dccb8f0a59333b70506e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import FollowedLog from '../../models/followed-log';
import Following from '../../models/following';
import FollowingLog from '../../models/following-log';
import User, { isRemoteUser, pack as packUser } from '../../models/user';
import stream from '../../publishers/stream';
import renderFollow from '../../remote/activitypub/renderer/follow';
import renderUndo from '../../remote/activitypub/renderer/undo';
import context from '../../remote/activitypub/renderer/context';
import request from '../../remote/request';

export default async ({ data }) => {
	// Delete following
	const following = await Following.findOneAndDelete({ _id: data.id });
	if (following === null) {
		return;
	}

	const promisedFollower = User.findOne({ _id: following.followerId });
	const promisedFollowee = User.findOne({ _id: following.followeeId });

	await Promise.all([
		// Decrement following count
		User.update({ _id: following.followerId }, { $inc: { followingCount: -1 } }),
		promisedFollower.then(({ followingCount }) => FollowingLog.insert({
			createdAt: new Date(),
			userId: following.followerId,
			count: followingCount - 1
		})),

		// Decrement followers count
		User.update({ _id: following.followeeId }, { $inc: { followersCount: -1 } }),
		promisedFollowee.then(({ followersCount }) => FollowedLog.insert({
			createdAt: new Date(),
			userId: following.followeeId,
			count: followersCount - 1
		})),

		// Publish follow event
		Promise.all([promisedFollower, promisedFollowee]).then(async ([follower, followee]) => {
			if (isRemoteUser(follower)) {
				return;
			}

			const promisedPackedUser = packUser(followee, follower);

			if (isRemoteUser(followee)) {
				const undo = renderUndo(renderFollow(follower, followee));
				undo['@context'] = context;

				await request(follower, followee.account.inbox, undo);
			}

			stream(follower._id, 'unfollow', promisedPackedUser);
		})
	]);
};