mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
feat: #12647, federate out Add activity on inbox.create and local post creation
This commit is contained in:
@@ -70,6 +70,7 @@ inbox.create = async (req) => {
|
|||||||
const asserted = await activitypub.notes.assert(0, object);
|
const asserted = await activitypub.notes.assert(0, object);
|
||||||
if (asserted) {
|
if (asserted) {
|
||||||
announce(object.id, req.body);
|
announce(object.id, req.body);
|
||||||
|
api.activitypub.add(req, { pid: object.id });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -102,20 +102,35 @@ activitypubApi.unfollow = enabledCheck(async (caller, { type, id, actor }) => {
|
|||||||
|
|
||||||
activitypubApi.create = {};
|
activitypubApi.create = {};
|
||||||
|
|
||||||
async function buildRecipients(object, { pid, uid }) {
|
async function buildRecipients(object, { pid, uid, cid }) {
|
||||||
/**
|
/**
|
||||||
* - Builds a list of targets for activitypub.send to consume
|
* - Builds a list of targets for activitypub.send to consume
|
||||||
* - Extends to and cc since the activity can be addressed more widely
|
* - Extends to and cc since the activity can be addressed more widely
|
||||||
* - `pid` is optional, but if included, includes announcers and all authors up the toPid chain
|
* - Optional parameters:
|
||||||
|
* - `cid`: includes followers of the passed-in cid (local only)
|
||||||
|
* - `uid`: includes followers of the passed-in uid (local only)
|
||||||
|
* - `pid`: includes announcers and all authors up the toPid chain
|
||||||
*/
|
*/
|
||||||
const followers = await db.getSortedSetMembers(`followersRemote:${uid}`);
|
|
||||||
let { to, cc } = object;
|
let { to, cc } = object;
|
||||||
to = new Set(to);
|
to = new Set(to);
|
||||||
cc = new Set(cc);
|
cc = new Set(cc);
|
||||||
|
|
||||||
const followersUrl = `${nconf.get('url')}/uid/${uid}/followers`;
|
let followers = [];
|
||||||
if (!to.has(followersUrl)) {
|
if (uid) {
|
||||||
cc.add(followersUrl);
|
followers = await db.getSortedSetMembers(`followersRemote:${uid}`);
|
||||||
|
const followersUrl = `${nconf.get('url')}/uid/${uid}/followers`;
|
||||||
|
if (!to.has(followersUrl)) {
|
||||||
|
cc.add(followersUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cid) {
|
||||||
|
const cidFollowers = await activitypub.notes.getCategoryFollowers(cid);
|
||||||
|
followers = followers.concat(cidFollowers);
|
||||||
|
const followersUrl = `${nconf.get('url')}/category/${cid}/followers`;
|
||||||
|
if (!to.has(followersUrl)) {
|
||||||
|
cc.add(followersUrl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const targets = new Set([...followers, ...to, ...cc]);
|
const targets = new Set([...followers, ...to, ...cc]);
|
||||||
@@ -138,8 +153,8 @@ async function buildRecipients(object, { pid, uid }) {
|
|||||||
const auxiliaryFollowers = (await user.getUsersFields(auxiliaries, ['followersUrl']))
|
const auxiliaryFollowers = (await user.getUsersFields(auxiliaries, ['followersUrl']))
|
||||||
.filter(o => o.hasOwnProperty('followersUrl'))
|
.filter(o => o.hasOwnProperty('followersUrl'))
|
||||||
.map(({ followersUrl }) => followersUrl);
|
.map(({ followersUrl }) => followersUrl);
|
||||||
[...auxiliaries].forEach(uri => targets.add(uri));
|
[...auxiliaries].forEach(uri => uri && targets.add(uri));
|
||||||
[...auxiliaries, ...auxiliaryFollowers].forEach(uri => cc.add(uri));
|
[...auxiliaries, ...auxiliaryFollowers].forEach(uri => uri && cc.add(uri));
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -191,6 +206,7 @@ activitypubApi.create.note = enabledCheck(async (caller, { pid, post }) => {
|
|||||||
object,
|
object,
|
||||||
});
|
});
|
||||||
})).catch(err => winston.error(err.stack));
|
})).catch(err => winston.error(err.stack));
|
||||||
|
activitypubApi.add(caller, { pid });
|
||||||
}, 5000);
|
}, 5000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -383,6 +399,33 @@ activitypubApi.flag = enabledCheck(async (caller, flag) => {
|
|||||||
await db.sortedSetAdd(`flag:${flag.flagId}:remote`, Date.now(), caller.uid);
|
await db.sortedSetAdd(`flag:${flag.flagId}:remote`, Date.now(), caller.uid);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
activitypubApi.add = enabledCheck((async (_, { pid }) => {
|
||||||
|
let localId;
|
||||||
|
if (String(pid).startsWith(nconf.get('url'))) {
|
||||||
|
({ id: localId } = await activitypub.helpers.resolveLocalId(pid));
|
||||||
|
}
|
||||||
|
|
||||||
|
const tid = await posts.getPostField(localId || pid, 'tid');
|
||||||
|
const cid = await posts.getCidByPid(localId || pid);
|
||||||
|
if (cid <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let to = [activitypub._constants.publicAddress];
|
||||||
|
let cc = [];
|
||||||
|
let targets;
|
||||||
|
({ to, cc, targets } = await buildRecipients({ to, cc }, { pid: localId || pid, cid }));
|
||||||
|
|
||||||
|
await activitypub.send('cid', cid, targets, {
|
||||||
|
id: `${nconf.get('url')}/post/${encodeURIComponent(localId || pid)}#activity/add/${Date.now()}`,
|
||||||
|
type: 'Add',
|
||||||
|
to,
|
||||||
|
cc,
|
||||||
|
object: utils.isNumber(pid) ? `${nconf.get('url')}/post/${pid}` : pid,
|
||||||
|
target: `${nconf.get('url')}/topic/${tid}`,
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
activitypubApi.undo.flag = enabledCheck(async (caller, flag) => {
|
activitypubApi.undo.flag = enabledCheck(async (caller, flag) => {
|
||||||
if (!activitypub.helpers.isUri(flag.targetId)) {
|
if (!activitypub.helpers.isUri(flag.targetId)) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user