summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/models/post-reaction.ts2
-rw-r--r--src/remote/activitypub/act/like.ts48
-rw-r--r--src/remote/activitypub/renderer/note.ts2
3 files changed, 50 insertions, 2 deletions
diff --git a/src/models/post-reaction.ts b/src/models/post-reaction.ts
index 3fc33411fb..81be95b8d8 100644
--- a/src/models/post-reaction.ts
+++ b/src/models/post-reaction.ts
@@ -5,12 +5,12 @@ import Reaction from './post-reaction';
import { pack as packUser } from './user';
const PostReaction = db.get<IPostReaction>('postReactions');
+PostReaction.createIndex(['userId', 'postId'], { unique: true });
export default PostReaction;
export interface IPostReaction {
_id: mongo.ObjectID;
createdAt: Date;
- deletedAt: Date;
postId: mongo.ObjectID;
userId: mongo.ObjectID;
reaction: string;
diff --git a/src/remote/activitypub/act/like.ts b/src/remote/activitypub/act/like.ts
new file mode 100644
index 0000000000..d2ddba89a9
--- /dev/null
+++ b/src/remote/activitypub/act/like.ts
@@ -0,0 +1,48 @@
+import { MongoError } from 'mongodb';
+import Post from '../../../models/post';
+import Reaction from '../../../models/post-reaction';
+import config from '../../../config';
+import queue from '../../../queue';
+
+export default async (actor, activity) => {
+ const prefix = config.url + '/posts';
+ const id = activity.object.id || activity.object;
+ let reaction;
+
+ if (!id.startsWith(prefix)) {
+ return null;
+ }
+
+ const postId = id.slice(prefix.length);
+
+ const post = await Post.findOne({ _id: postId });
+ if (post === null) {
+ throw new Error();
+ }
+
+ try {
+ reaction = await Reaction.insert({
+ createdAt: new Date(),
+ postId,
+ userId: actor._id,
+ reaction: 'pudding'
+ });
+ } catch (exception) {
+ // duplicate key error
+ if (exception instanceof MongoError && exception.code === 11000) {
+ return null;
+ }
+
+ throw exception;
+ }
+
+ await new Promise((resolve, reject) => {
+ queue.create('http', { type: 'like', reaction: reaction._id }).save(error => {
+ if (error) {
+ reject(error);
+ } else {
+ resolve(null);
+ }
+ });
+ });
+};
diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
index 43531b121a..36f8578ec4 100644
--- a/src/remote/activitypub/renderer/note.ts
+++ b/src/remote/activitypub/renderer/note.ts
@@ -30,7 +30,7 @@ export default async (user, post) => {
const attributedTo = `${config.url}/@${user.username}`;
return {
- id: `${attributedTo}/${post._id}`,
+ id: `${config.url}/posts/${post._id}}`,
type: 'Note',
attributedTo,
content: post.textHtml,