From 5de4f084124924cc289b8ff0756658a577ed097f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 25 Jan 2024 15:35:45 -0500 Subject: [PATCH] refactor: added mocks.note in preparation for AP note retrieval logic, inReplyTo is always populated now, unless new topic --- src/activitypub/mocks.js | 50 ++++++++++++++++++++++++++++++++++ src/api/activitypub.js | 58 ++++++++++++---------------------------- src/api/topics.js | 4 +-- src/categories/topics.js | 1 - 4 files changed, 69 insertions(+), 44 deletions(-) diff --git a/src/activitypub/mocks.js b/src/activitypub/mocks.js index bd72713186..7f6ddd40d2 100644 --- a/src/activitypub/mocks.js +++ b/src/activitypub/mocks.js @@ -5,6 +5,8 @@ const mime = require('mime'); const db = require('../database'); const user = require('../user'); +const posts = require('../posts'); +const topics = require('../topics'); const activitypub = module.parent.exports; const Mocks = module.exports; @@ -166,3 +168,51 @@ Mocks.actor = async (uid) => { }, }; }; + +Mocks.note = async (post) => { + const id = `${nconf.get('url')}/post/${post.pid}`; + const published = new Date(post.timestamp).toISOString(); + + const [raw, userslug] = await Promise.all([ + posts.getPostField(post.pid, 'content'), + user.getUserField(post.user.uid, 'userslug'), + ]); + + // todo: post visibility, category privileges integration + const to = [activitypub._constants.publicAddress]; + const cc = [`${nconf.get('url')}/user/${userslug}/followers`]; + + let inReplyTo = null; + if (post.toPid) { + inReplyTo = activitypub.helpers.isUri(post.toPid) ? post.toPid : `${nconf.get('url')}/post/${post.toPid}`; + const parentId = await posts.getPostField(post.toPid, 'uid'); + if (activitypub.helpers.isUri(parentId)) { + to.unshift(parentId); + } + } else { + const mainPid = await topics.getTopicFieldByPid('mainPid', post.pid); + if (mainPid !== post.pid) { + inReplyTo = `${nconf.get('url')}/post/${mainPid}`; + } + } + + const object = { + id, + type: 'Note', + to, + cc, + inReplyTo, + published, + url: id, + attributedTo: `${nconf.get('url')}/uid/${post.user.uid}`, + sensitive: false, // todo + content: post.content, + source: { + content: raw, + mediaType: 'text/markdown', + }, + // replies: {} todo... + }; + + return object; +}; diff --git a/src/api/activitypub.js b/src/api/activitypub.js index 810fbc732e..c9893ceb41 100644 --- a/src/api/activitypub.js +++ b/src/api/activitypub.js @@ -53,52 +53,28 @@ activitypubApi.unfollow = async (caller, { uid: actorId }) => { activitypubApi.create = {}; -activitypubApi.create.post = async (caller, { post }) => { - const id = `${nconf.get('url')}/post/${post.pid}`; - const published = new Date(post.timestamp).toISOString(); - const [userslug, raw, followers] = await Promise.all([ - user.getUserField(caller.uid, 'userslug'), - posts.getPostField(post.pid, 'content'), - db.getSortedSetMembers(`followersRemote:${caller.uid}`), - ]); - - // todo: post visibility, category privileges integration - const recipients = { - to: [activitypub._constants.publicAddress], - cc: [`${nconf.get('url')}/user/${userslug}/followers`], - }; - const targets = new Set(followers); - - let inReplyTo = null; - if (post.toPid) { - inReplyTo = activitypub.helpers.isUri(post.toPid) ? post.toPid : id; - const parentId = await posts.getPostField(post.toPid, 'uid'); - if (activitypub.helpers.isUri(parentId)) { - recipients.to.unshift(parentId); - targets.add(parentId); - } +activitypubApi.create.post = async (caller, { pid }) => { + const post = (await posts.getPostSummaryByPids([pid], caller.uid, { stripTags: false })).pop(); + if (!post) { + return; } - const object = { - id, - type: 'Note', - ...recipients, - inReplyTo, - published, - url: id, - attributedTo: `${nconf.get('url')}/user/${post.user.userslug}`, - sensitive: false, // todo - content: post.content, - source: { - content: raw, - mediaType: 'text/markdown', - }, - // replies: {} todo... - }; + const [object, followers] = await Promise.all([ + activitypub.mocks.note(post), + db.getSortedSetMembers(`followersRemote:${post.user.uid}`), + ]); + + const { to, cc } = object; + const targets = new Set(followers); + const parentId = await posts.getPostField(object.inReplyTo, 'uid'); + if (activitypub.helpers.isUri(parentId)) { + to.unshift(parentId); + } const payload = { type: 'Create', - ...recipients, + to, + cc, object, }; diff --git a/src/api/topics.js b/src/api/topics.js index 873071cf4a..26f00c8e5f 100644 --- a/src/api/topics.js +++ b/src/api/topics.js @@ -80,7 +80,7 @@ topicsAPI.create = async function (caller, data) { socketHelpers.emitToUids('event:new_post', { posts: [result.postData] }, [caller.uid]); socketHelpers.emitToUids('event:new_topic', result.topicData, [caller.uid]); socketHelpers.notifyNew(caller.uid, 'newTopic', { posts: [result.postData], topic: result.topicData }); - activitypubApi.create.post(caller, { post: result.postData }); + activitypubApi.create.post(caller, { pid: result.postData.pid }); return result.topicData; }; @@ -115,7 +115,7 @@ topicsAPI.reply = async function (caller, data) { } socketHelpers.notifyNew(caller.uid, 'newPost', result); - activitypubApi.create.post(caller, { post: postData }); + activitypubApi.create.post(caller, { pid: postData.pid }); return postObj[0]; }; diff --git a/src/categories/topics.js b/src/categories/topics.js index 86b41141f7..64248890c0 100644 --- a/src/categories/topics.js +++ b/src/categories/topics.js @@ -15,7 +15,6 @@ module.exports = function (Categories) { let results = await plugins.hooks.fire('filter:category.topics.prepare', data); const tids = await Categories.getTopicIds(results); let topicsData = await topics.getTopicsByTids(tids, data.uid); - console.log(topicsData); topicsData = await user.blocks.filter(data.uid, topicsData); if (!topicsData.length) {