mirror of
https://iceshrimp.dev/limepotato/jormungandr-bite.git
synced 2024-11-15 06:27:34 -07:00
[wip] Implement like activity
This commit is contained in:
parent
92bdf8b2e2
commit
507b9fdfd7
3 changed files with 50 additions and 2 deletions
|
@ -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;
|
||||
|
|
48
src/remote/activitypub/act/like.ts
Normal file
48
src/remote/activitypub/act/like.ts
Normal 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);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue