From 2699fd2278c94edcd340373542218158841771b7 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 8 Apr 2026 12:12:53 -0400 Subject: [PATCH] feat: ap/errors acp page --- public/language/en-GB/admin/menu.json | 1 + .../en-GB/admin/settings/activitypub.json | 4 +++- src/controllers/admin/federation.js | 16 ++++++++++++++++ src/routes/admin.js | 1 + src/views/admin/federation/errors.tpl | 19 +++++++++++++++++++ src/views/admin/partials/navigation.tpl | 1 + 6 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/views/admin/federation/errors.tpl diff --git a/public/language/en-GB/admin/menu.json b/public/language/en-GB/admin/menu.json index 8074988d6e..2feac0ff33 100644 --- a/public/language/en-GB/admin/menu.json +++ b/public/language/en-GB/admin/menu.json @@ -56,6 +56,7 @@ "federation/pruning": "Storage", "federation/safety": "Trust & Safety", "federation/analytics": "Analytics", + "federation/errors": "Errors", "section-appearance": "Appearance", "appearance/themes": "Themes", diff --git a/public/language/en-GB/admin/settings/activitypub.json b/public/language/en-GB/admin/settings/activitypub.json index d0398e74ff..272e9b4363 100644 --- a/public/language/en-GB/admin/settings/activitypub.json +++ b/public/language/en-GB/admin/settings/activitypub.json @@ -75,5 +75,7 @@ "analytics.errors": "Errors", "analytics.term": "Time scale", "analytics.hourly": "Hourly", - "analytics.daily": "Daily" + "analytics.daily": "Daily", + + "errors.intro": "The following errors were recorded by this instance within the last 24 hours." } \ No newline at end of file diff --git a/src/controllers/admin/federation.js b/src/controllers/admin/federation.js index 27704eaf27..537d27799b 100644 --- a/src/controllers/admin/federation.js +++ b/src/controllers/admin/federation.js @@ -1,5 +1,6 @@ 'use strict'; +const db = require('../../database'); const activitypub = require('../../activitypub'); const analytics = require('../../analytics'); @@ -81,5 +82,20 @@ federationController.analytics = async function (req, res) { received, receivedErr, sent, + hideSave: 1, + }); +}; + +federationController.errors = async function (req, res) { + const ids = await db.getSortedSetRangeByScore('ap:errors', 0, -1, '-inf', Date.now()); + const payloads = await db.mget(ids.map(id => `ap:errors:${id}`)); + const errors = ids.map((id, idx) => { + return { id, payload: payloads[idx] }; + }); + + res.render('admin/federation/errors', { + title: '[[admin/menu:federation/errors]]', + hideSave: 1, + errors, }); }; diff --git a/src/routes/admin.js b/src/routes/admin.js index de6e493d7d..241e0138ee 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -58,6 +58,7 @@ module.exports = function (app, name, middleware, controllers) { helpers.setupAdminPageRoute(app, `/${name}/federation/pruning`, middlewares, controllers.admin.federation.pruning); helpers.setupAdminPageRoute(app, `/${name}/federation/safety`, middlewares, controllers.admin.federation.safety); helpers.setupAdminPageRoute(app, `/${name}/federation/analytics`, middlewares, controllers.admin.federation.analytics); + helpers.setupAdminPageRoute(app, `/${name}/federation/errors`, middlewares, controllers.admin.federation.errors); helpers.setupAdminPageRoute(app, `/${name}/appearance/themes`, middlewares, controllers.admin.appearance.themes); helpers.setupAdminPageRoute(app, `/${name}/appearance/skins`, middlewares, controllers.admin.appearance.skins); diff --git a/src/views/admin/federation/errors.tpl b/src/views/admin/federation/errors.tpl new file mode 100644 index 0000000000..1364f5cf19 --- /dev/null +++ b/src/views/admin/federation/errors.tpl @@ -0,0 +1,19 @@ +
+ + +
+
+
+

[[admin/settings/activitypub:errors.intro]]

+ {{{ each errors }}} +
+ {./id} +
{./payload}
+
+ {{{ end }}} +
+
+ + +
+
diff --git a/src/views/admin/partials/navigation.tpl b/src/views/admin/partials/navigation.tpl index 728c86d293..3f12256c05 100644 --- a/src/views/admin/partials/navigation.tpl +++ b/src/views/admin/partials/navigation.tpl @@ -110,6 +110,7 @@ [[admin/menu:federation/pruning]] [[admin/menu:federation/safety]] [[admin/menu:federation/analytics]] + [[admin/menu:federation/errors]]