[wip] Implement like activity

This commit is contained in:
syuilo 2018-04-03 00:59:38 +09:00
parent 92bdf8b2e2
commit 507b9fdfd7
3 changed files with 50 additions and 2 deletions

View file

@ -5,12 +5,12 @@ import Reaction from './post-reaction';
import { pack as packUser } from './user'; import { pack as packUser } from './user';
const PostReaction = db.get<IPostReaction>('postReactions'); const PostReaction = db.get<IPostReaction>('postReactions');
PostReaction.createIndex(['userId', 'postId'], { unique: true });
export default PostReaction; export default PostReaction;
export interface IPostReaction { export interface IPostReaction {
_id: mongo.ObjectID; _id: mongo.ObjectID;
createdAt: Date; createdAt: Date;
deletedAt: Date;
postId: mongo.ObjectID; postId: mongo.ObjectID;
userId: mongo.ObjectID; userId: mongo.ObjectID;
reaction: string; reaction: string;

View file

@ -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);
}
});
});
};

View file

@ -30,7 +30,7 @@ export default async (user, post) => {
const attributedTo = `${config.url}/@${user.username}`; const attributedTo = `${config.url}/@${user.username}`;
return { return {
id: `${attributedTo}/${post._id}`, id: `${config.url}/posts/${post._id}}`,
type: 'Note', type: 'Note',
attributedTo, attributedTo,
content: post.textHtml, content: post.textHtml,