mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
feat: have category actor send Announce(Note) on remote replies to topics in a cid
#12434
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 = {};
|
||||
|
||||
Reference in New Issue
Block a user