From 3ab61615af14db54bfdbfe981de0aea21ccea414 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 1 Dec 2025 11:11:27 -0500 Subject: [PATCH] feat: federate out topic removal activities when topic is deleted and purged from a local category --- src/api/helpers.js | 14 +++++++++++++- src/api/topics.js | 5 ++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/api/helpers.js b/src/api/helpers.js index 3422b4a6f9..d7300f01e0 100644 --- a/src/api/helpers.js +++ b/src/api/helpers.js @@ -7,6 +7,7 @@ const posts = require('../posts'); const privileges = require('../privileges'); const plugins = require('../plugins'); const activitypub = require('../activitypub'); +const utils = require('../utils'); const socketHelpers = require('../socket.io/helpers'); const websockets = require('../socket.io'); const events = require('../events'); @@ -66,11 +67,22 @@ exports.doTopicAction = async function (action, event, caller, { tids }) { const uids = await user.getUidsFromSet('users:online', 0, -1); await Promise.all(tids.map(async (tid) => { - const title = await topics.getTopicField(tid, 'title'); + const { title, cid, mainPid } = await topics.getTopicFields(tid, ['title', 'cid', 'mainPid']); const data = await topics.tools[action](tid, caller.uid); const notifyUids = await privileges.categories.filterUids('topics:read', data.cid, uids); socketHelpers.emitToUids(event, data, notifyUids); await logTopicAction(action, caller, tid, title); + + switch(action) { + case 'delete': // falls through + case 'purge': { + if (utils.isNumber(cid) && parseInt(cid, 10) > 0) { + activitypub.out.remove.context(caller.uid, tid); // 7888-style + activitypub.out.delete.note(caller.uid, mainPid); // 1b12-style + activitypub.out.undo.announce('cid', cid, tid); // microblogs + } + } + } })); }; diff --git a/src/api/topics.js b/src/api/topics.js index 91e0882db4..88a260dd7c 100644 --- a/src/api/topics.js +++ b/src/api/topics.js @@ -324,13 +324,12 @@ topicsAPI.move = async (caller, { tid, cid }) => { if (utils.isNumber(cid) && parseInt(cid, 10) === -1) { activitypub.out.remove.context(caller.uid, tid); // 7888-style - activitypub.out.delete.note(caller.uid, topicData.mainPid); // threadiverse - // tbd: activitypubApi.undo.announce? // microblogs + activitypub.out.delete.note(caller.uid, topicData.mainPid); // 1b12-style } else { activitypub.out.move.context(caller.uid, tid); activitypub.out.announce.topic(tid); } - activitypub.out.undo.announce('cid', topicData.cid, tid); + activitypub.out.undo.announce('cid', topicData.cid, tid); // microblogs } await events.log({