summaryrefslogtreecommitdiff
path: root/src/queue/processors/http/follow.ts
blob: ba1cc3118639389985842fd9f8bfecefff5cfaa0 (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
import User, { isLocalUser, isRemoteUser, pack as packUser } from '../../../models/user';
import Following from '../../../models/following';
import FollowingLog from '../../../models/following-log';
import FollowedLog from '../../../models/followed-log';
import event from '../../../publishers/stream';
import notify from '../../../publishers/notify';
import context from '../../../remote/activitypub/renderer/context';
import render from '../../../remote/activitypub/renderer/follow';
import request from '../../../remote/request';

export default ({ data }, done) => Following.findOne({ _id: data.following }).then(async ({ followerId, followeeId }) => {
	const [follower, followee] = await Promise.all([
		User.findOne({ _id: followerId }),
		User.findOne({ _id: followeeId })
	]);

	if (isLocalUser(follower) && isRemoteUser(followee)) {
		const rendered = render(follower, followee);
		rendered['@context'] = context;

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

	return [follower, followee];
}).then(([follower, followee]) => Promise.all([
	// Increment following count
	User.update(follower._id, {
		$inc: {
			followingCount: 1
		}
	}),

	FollowingLog.insert({
		createdAt: data.following.createdAt,
		userId: follower._id,
		count: follower.followingCount + 1
	}),

	// Increment followers count
	User.update({ _id: followee._id }, {
		$inc: {
			followersCount: 1
		}
	}),

	FollowedLog.insert({
		createdAt: data.following.createdAt,
		userId: follower._id,
		count: followee.followersCount + 1
	}),

	// Publish follow event
	isLocalUser(follower) && packUser(followee, follower)
		.then(packed => event(follower._id, 'follow', packed)),

	isLocalUser(followee) && Promise.all([
		packUser(follower, followee)
			.then(packed => event(followee._id, 'followed', packed)),

		// Notify
		isLocalUser(followee) && notify(followee._id, follower._id, 'follow')
	])
]).then(() => done(), error => {
	done();
	throw error;
}), done);