summaryrefslogtreecommitdiff
path: root/src/processor/http/follow.ts
blob: 8bf890efbcdeeb9f93419563180be56f12e99933 (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
import User, { isLocalUser, 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 }) => Following.findOne({ _id: data.following }).then(({ followerId, followeeId }) => {
	const promisedFollower = User.findOne({ _id: followerId });
	const promisedFollowee = User.findOne({ _id: followeeId });

	return Promise.all([
		// Increment following count
		User.update(followerId, {
			$inc: {
				followingCount: 1
			}
		}),

		promisedFollower.then(({ followingCount }) => FollowingLog.insert({
			createdAt: data.following.createdAt,
			userId: followerId,
			count: followingCount + 1
		})),

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

		promisedFollowee.then(({ followersCount }) => FollowedLog.insert({
			createdAt: data.following.createdAt,
			userId: followerId,
			count: followersCount + 1
		})),

		// Notify
		promisedFollowee.then(followee => followee.host === null ?
			notify(followeeId, followerId, 'follow') : null),

		// Publish follow event
		Promise.all([promisedFollower, promisedFollowee]).then(([follower, followee]) => {
			let followerEvent;
			let followeeEvent;

			if (isLocalUser(follower)) {
				followerEvent = packUser(followee, follower)
					.then(packed => event(follower._id, 'follow', packed));
			}

			if (isLocalUser(followee)) {
				followeeEvent = packUser(follower, followee)
					.then(packed => event(followee._id, 'followed', packed));
			} else if (isLocalUser(follower)) {
				const rendered = render(follower, followee);
				rendered['@context'] = context;

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

			return Promise.all([followerEvent, followeeEvent]);
		})
	]);
});