summaryrefslogtreecommitdiff
path: root/src/queue/processors/http/unfollow.ts
blob: d62eb280dc3334a977f3211cbbdee42fc14476fc (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import FollowedLog from '../../../models/followed-log';
import Following from '../../../models/following';
import FollowingLog from '../../../models/following-log';
import User, { isLocalUser, 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 }, done) => {
	const following = await Following.findOne({ _id: data.id });
	if (following === null) {
		done();
		return;
	}

	let follower;
	let followee;

	try {
		[follower, followee] = await Promise.all([
			User.findOne({ _id: following.followerId }),
			User.findOne({ _id: following.followeeId })
		]);

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

			await request(follower, followee.account.inbox, undo);
		}
	} catch (error) {
		done(error);
		return;
	}

	try {
		await Promise.all([
			// Delete following
			Following.findOneAndDelete({ _id: data.id }),

			// Decrement following count
			User.update({ _id: follower._id }, { $inc: { followingCount: -1 } }),
			FollowingLog.insert({
				createdAt: new Date(),
				userId: follower._id,
				count: follower.followingCount - 1
			}),

			// Decrement followers count
			User.update({ _id: followee._id }, { $inc: { followersCount: -1 } }),
			FollowedLog.insert({
				createdAt: new Date(),
				userId: followee._id,
				count: followee.followersCount - 1
			})
		]);

		if (isLocalUser(follower)) {
			return;
		}

		const promisedPackedUser = packUser(followee, follower);

		// Publish follow event
		stream(follower._id, 'unfollow', promisedPackedUser);
	} finally {
		done();
	}
};