diff --git a/public/language/en-GB/admin/settings/activitypub.json b/public/language/en-GB/admin/settings/activitypub.json index 94f9ad7822..9a11dbe972 100644 --- a/public/language/en-GB/admin/settings/activitypub.json +++ b/public/language/en-GB/admin/settings/activitypub.json @@ -18,6 +18,16 @@ "probe-timeout": "Lookup Timeout (milliseconds)", "probe-timeout-help": "(Default: 2000) If the lookup query does not receive a response within the set timeframe, will send the user to the link directly instead. Adjust this number higher if sites are responding slowly and you wish to give extra time.", + "rules": "Categorization", + "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", + "rules.modal.title": "How it works", + "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", + "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", + "rules.add": "Add New Rule", + "rules.type": "Type", + "rules.value": "Value", + "rules.cid": "Category", + "server-filtering": "Filtering", "count": "This NodeBB is currently aware of %1 server(s)", "server.filter-help": "Specify servers you would like to bar from federating with your NodeBB. Alternatively, you may opt to selectively allow federation with specific servers, instead. Both options are supported, although they are mutually exclusive.", diff --git a/src/activitypub/index.js b/src/activitypub/index.js index 8b997e81d7..bc4b66bf53 100644 --- a/src/activitypub/index.js +++ b/src/activitypub/index.js @@ -64,6 +64,7 @@ ActivityPub.contexts = require('./contexts'); ActivityPub.actors = require('./actors'); ActivityPub.instances = require('./instances'); ActivityPub.feps = require('./feps'); +ActivityPub.rules = require('./rules'); ActivityPub.startJobs = () => { ActivityPub.helpers.log('[activitypub/jobs] Registering jobs.'); diff --git a/src/controllers/admin/settings.js b/src/controllers/admin/settings.js index 69d74ddbae..762a2d896f 100644 --- a/src/controllers/admin/settings.js +++ b/src/controllers/admin/settings.js @@ -159,11 +159,15 @@ settingsController.api = async (req, res) => { }; settingsController.activitypub = async (req, res) => { - const instanceCount = await activitypub.instances.getCount(); + const [instanceCount, rules] = await Promise.all([ + activitypub.instances.getCount(), + activitypub.rules.list(), + ]); res.render('admin/settings/activitypub', { title: `[[admin/menu:settings/activitypub]]`, instanceCount, + rules, }); }; @@ -186,7 +190,3 @@ settingsController.advanced = async (req, res) => { groupsExemptFromMaintenanceMode: groupData, }); }; - - - - diff --git a/src/controllers/write/admin.js b/src/controllers/write/admin.js index c4c8e29c8c..132462faaf 100644 --- a/src/controllers/write/admin.js +++ b/src/controllers/write/admin.js @@ -1,9 +1,11 @@ 'use strict'; +const categories = require('../../categories'); const api = require('../../api'); const helpers = require('../helpers'); const messaging = require('../../messaging'); const events = require('../../events'); +const activitypub = require('../../activitypub'); const Admin = module.exports; @@ -82,3 +84,22 @@ Admin.chats.deleteRoom = async (req, res) => { Admin.listGroups = async (req, res) => { helpers.formatApiResponse(200, res, await api.admin.listGroups()); }; + +Admin.activitypub = {}; + +Admin.activitypub.addRule = async (req, res) => { + const { type, value, cid } = req.body; + const exists = await categories.exists(cid); + if (!value || !exists) { + helpers.formatApiResponse(400, res); + } + + await activitypub.rules.add(type, value, cid); + helpers.formatApiResponse(200, res, await activitypub.rules.list()); +}; + +Admin.activitypub.deleteRule = async (req, res) => { + const { rid } = req.params; + await activitypub.rules.delete(rid); + helpers.formatApiResponse(200, res, await activitypub.rules.list()); +}; diff --git a/src/routes/write/admin.js b/src/routes/write/admin.js index 4a70e48022..d5b0fcad9c 100644 --- a/src/routes/write/admin.js +++ b/src/routes/write/admin.js @@ -25,5 +25,8 @@ module.exports = function () { setupApiRoute(router, 'get', '/groups', [...middlewares], controllers.write.admin.listGroups); + setupApiRoute(router, 'post', '/activitypub/rules', [...middlewares, middleware.checkRequired.bind(null, ['cid', 'value', 'type'])], controllers.write.admin.activitypub.addRule); + setupApiRoute(router, 'delete', '/activitypub/rules/:rid', [...middlewares], controllers.write.admin.activitypub.deleteRule); + return router; }; diff --git a/src/views/admin/settings/activitypub.tpl b/src/views/admin/settings/activitypub.tpl index 749fb57629..7a4f1e8430 100644 --- a/src/views/admin/settings/activitypub.tpl +++ b/src/views/admin/settings/activitypub.tpl @@ -44,6 +44,40 @@ +
+
[[admin/settings/activitypub:rules]]
+
+
+

[[admin/settings/activitypub:rules-intro]]

+ + + + + + + + + {{{ each rules }}} + + + + + + + {{{ end }}} + + + + + + +
[[admin/settings/activitypub:rules.type]][[admin/settings/activitypub:rules.value]][[admin/settings/activitypub:rules.cid]]
{./type}{./value}{./cid}
+ +
+
+
+
+
[[admin/settings/activitypub:pruning]]