From 26a7c51a9a6419bc718176f1a7244a50a1599b44 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 5 Jul 2024 15:33:06 -0400 Subject: [PATCH] feat: AP note replies collection, closes #12675 --- src/activitypub/mocks.js | 2 +- src/controllers/activitypub/actors.js | 22 ++++++++++++++++++++++ src/routes/activitypub.js | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/activitypub/mocks.js b/src/activitypub/mocks.js index e262834f3a..7e9051d74d 100644 --- a/src/activitypub/mocks.js +++ b/src/activitypub/mocks.js @@ -403,7 +403,7 @@ Mocks.note = async (post) => { source, tag, attachment, - // replies: {} todo... + replies: `${id}/replies`, }; return object; diff --git a/src/controllers/activitypub/actors.js b/src/controllers/activitypub/actors.js index f173fda30b..8fe89f38e5 100644 --- a/src/controllers/activitypub/actors.js +++ b/src/controllers/activitypub/actors.js @@ -62,6 +62,28 @@ Actors.note = async function (req, res) { res.status(200).json(payload); }; +Actors.replies = async function (req, res) { + const page = parseInt(req.query.page, 10); + const replies = await activitypub.helpers.generateCollection({ + set: `pid:${req.params.pid}:replies`, + page, + perPage: meta.config.postsPerPage, + url: `${nconf.get('url')}/post/${req.params.pid}/replies`, + }); + + const object = { + '@context': 'https://www.w3.org/ns/activitystreams', + id: `${nconf.get('url')}/post/${req.params.pid}/replies${replies.orderedItems && page ? `?page=${page}` : ''}`, + url: `${nconf.get('url')}/post/${req.params.pid}`, + ...replies, + } + + // Convert pids to urls + replies.orderedItems = replies.orderedItems.map(pid => (utils.isNumber(pid) ? `${nconf.get('url')}/post/${pid}` : pid)); + + res.status(200).json(object); +}; + Actors.topic = async function (req, res, next) { const allowed = await privileges.topics.can('topics:read', req.params.tid, activitypub._constants.uid); if (!allowed) { diff --git a/src/routes/activitypub.js b/src/routes/activitypub.js index 9f32715ebc..851da933da 100644 --- a/src/routes/activitypub.js +++ b/src/routes/activitypub.js @@ -35,6 +35,7 @@ module.exports = function (app, middleware, controllers) { app.get('/uid/:uid/followers', [...middlewares, middleware.assert.user], controllers.activitypub.getFollowers); app.get('/post/:pid', [...middlewares, middleware.assert.post], controllers.activitypub.actors.note); + app.get('/post/:pid/replies', [...middlewares, middleware.assert.post], controllers.activitypub.actors.replies); app.get('/topic/:tid/:slug?', [...middlewares, middleware.assert.topic], controllers.activitypub.actors.topic);