summaryrefslogtreecommitdiff
path: root/src/remote/activitypub/act/like.ts
blob: ea53242017cc99cb4555b042b943709d9a92ffcf (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
import { MongoError } from 'mongodb';
import Reaction, { IPostReaction } from '../../../models/post-reaction';
import Post from '../../../models/post';
import queue from '../../../queue';

export default async (resolver, actor, activity, distribute) => {
	const id = activity.object.id || activity.object;

	// Transform:
	// https://misskey.ex/@syuilo/xxxx to
	// xxxx
	const postId = id.split('/').pop();

	const post = await Post.findOne({ _id: postId });
	if (post === null) {
		throw new Error();
	}

	if (!distribute) {
		const { _id } = await Reaction.findOne({
			userId: actor._id,
			postId: post._id
		});

		return {
			resolver,
			object: { $ref: 'postPeactions', $id: _id }
		};
	}

	const promisedReaction = Reaction.insert({
		createdAt: new Date(),
		userId: actor._id,
		postId: post._id,
		reaction: 'pudding'
	}).then(reaction => new Promise<IPostReaction>((resolve, reject) => {
		queue.create('http', {
			type: 'reaction',
			reactionId: reaction._id
		}).save(error => {
			if (error) {
				reject(error);
			} else {
				resolve(reaction);
			}
		});
	}), async error => {
		// duplicate key error
		if (error instanceof MongoError && error.code === 11000) {
			return Reaction.findOne({
				userId: actor._id,
				postId: post._id
			});
		}

		throw error;
	});

	return promisedReaction.then(({ _id }) => ({
		resolver,
		object: { $ref: 'postPeactions', $id: _id }
	}));
};