Skip to content

Commit

Permalink
feat: have category actor send Announce(Note) on remote replies to to…
Browse files Browse the repository at this point in the history
…pics in a cid

#12434
  • Loading branch information
julianlam committed Mar 22, 2024
1 parent 4ee8519 commit 04c743e
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 9 deletions.
6 changes: 3 additions & 3 deletions src/activitypub/inbox.js
Expand Up @@ -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}`);
};

Expand All @@ -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, {
Expand Down Expand Up @@ -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;
}
Expand Down
24 changes: 19 additions & 5 deletions src/activitypub/notes.js
Expand Up @@ -2,6 +2,7 @@

const winston = require('winston');
const crypto = require('crypto');
const nconf = require('nconf');

const db = require('../database');
const meta = require('../meta');
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down
4 changes: 3 additions & 1 deletion src/api/activitypub.js
Expand Up @@ -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 = {};
Expand Down

0 comments on commit 04c743e

Please sign in to comment.