Files
NodeBB/src/activitypub/rules.js

52 lines
1.3 KiB
JavaScript

'use strict';
const db = require('../database');
const utils = require('../utils');
const activitypub = require('.');
const Rules = module.exports;
Rules.list = async () => {
const rids = await db.getSortedSetMembers('categorization:rid');
let rules = await db.getObjects(rids.map(rid => `rid:${rid}`));
rules = rules.map((rule, idx) => {
rule.rid = rids[idx];
return rule;
});
return rules;
};
Rules.add = async (type, value, cid) => {
const uuid = utils.generateUUID();
// normalize user rule values into a uid
if (type === 'user' && value.indexOf('@') !== -1) {
const response = await activitypub.actors.assert(value);
if (!response) {
throw new Error('[[error:no-user]]');
}
value = await db.getObjectField('handle:uid', String(value).toLowerCase());
}
await Promise.all([
db.setObject(`rid:${uuid}`, { type, value, cid }),
db.sortedSetAdd('categorization:rid', Date.now(), uuid),
]);
};
Rules.delete = async (rid) => {
await Promise.all([
db.sortedSetRemove('categorization:rid', rid),
db.delete(`rid:${rid}`),
]);
};
Rules.reorder = async (rids) => {
const exists = await db.isSortedSetMembers('categorization:rid', rids);
rids = rids.filter((_, idx) => exists[idx]);
const scores = Array.from({ length: rids.length }, (_, idx) => idx);
await db.sortedSetAdd('categorization:rid', scores, rids);
};