diff --git a/src/activitypub/inbox.js b/src/activitypub/inbox.js index e224ab1599..770ae1a4ca 100644 --- a/src/activitypub/inbox.js +++ b/src/activitypub/inbox.js @@ -25,7 +25,7 @@ inbox.create = async (req) => { throw new Error('[[error:activitypub.not-implemented]]'); } - const { tid, count } = await activitypub.notes.assertTopic(0, object.id); + const { tid, count } = await activitypub.notes.assert(0, object.id); winston.verbose(`[activitypub/inbox] Parsing ${count} notes into topic ${tid}`); }; @@ -47,7 +47,7 @@ inbox.update = async (req) => { if (exists) { await posts.edit(postData); } else { - await activitypub.notes.assertTopic(0, object.id); + await activitypub.notes.assert(0, object.id); } } catch (e) { activitypub.send('uid', 0, actor, { @@ -129,7 +129,7 @@ inbox.announce = async (req) => { return; } - ({ tid } = await activitypub.notes.assertTopic(0, pid)); + ({ tid } = await activitypub.notes.assert(0, pid, object)); if (!tid) { return; } diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index 2d3cb9a01d..0fb9bcf040 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -2,6 +2,7 @@ const winston = require('winston'); const crypto = require('crypto'); +const nconf = require('nconf'); const db = require('../database'); const meta = require('../meta'); @@ -15,15 +16,15 @@ const utils = require('../utils'); const activitypub = module.parent.exports; const Notes = module.exports; -Notes.assert = async (uid, id) => { +Notes.assert = async (uid, id, object) => { /** - * Given the id of any post, traverses up to cache the entire threaded context + * Given the id (or optional AS object) of any post, traverses up to cache the entire threaded context * * Unfortunately, due to limitations and fragmentation of the existing ActivityPub landscape, * retrieving the entire reply tree is not possible at this time. */ - const chain = Array.from(await Notes.getParentChain(uid, id)); + const chain = Array.from(await Notes.getParentChain(uid, object || id)); if (!chain.length) { return null; } @@ -124,6 +125,19 @@ Notes.assert = async (uid, id) => { Notes.updateLocalRecipients(post.pid, { to, cc }), Notes.saveAttachments(post.pid, attachment), ]); + + // Category announce + if (id === post.id) { + // eslint-disable-next-line no-await-in-loop + const followers = await activitypub.notes.getCategoryFollowers(cid); + // eslint-disable-next-line no-await-in-loop + await activitypub.send('cid', cid, followers, { + type: 'Announce', + to: [`${nconf.get('url')}/category/${cid}/followers`], + cc: [activitypub._constants.publicAddress], + object, + }); + } } await Notes.syncUserInboxes(tid); @@ -213,9 +227,9 @@ Notes.getParentChain = async (uid, input) => { } } } else { - let object; + let object = !activitypub.helpers.isUri(input) && input.id === id ? input : undefined; try { - object = await activitypub.get('uid', uid, id); + object = object || await activitypub.get('uid', uid, id); // Handle incorrect id passed in if (id !== object.id) { diff --git a/src/api/activitypub.js b/src/api/activitypub.js index bd8d700908..0d21d6e0b1 100644 --- a/src/api/activitypub.js +++ b/src/api/activitypub.js @@ -123,7 +123,9 @@ activitypubApi.create.post = enabledCheck(async (caller, { pid }) => { }; await activitypub.send('uid', caller.uid, Array.from(targets), payloads.create); - await activitypub.send('cid', cid, followers, payloads.announce); + if (followers.length) { + await activitypub.send('cid', cid, followers, payloads.announce); + } }); activitypubApi.update = {};