feat: asserted topics and posts to remote categories will notify and add to unread based on remote category watch state

This commit is contained in:
Julian Lam
2025-03-17 14:52:52 -04:00
parent dd030a5efb
commit 36a2c3336d
6 changed files with 122 additions and 34 deletions

View File

@@ -7,6 +7,7 @@ const events = require('../events');
const user = require('../user');
const groups = require('../groups');
const privileges = require('../privileges');
const utils = require('../utils');
const activitypubApi = require('./activitypub');
@@ -157,7 +158,9 @@ categoriesAPI.getTopics = async (caller, data) => {
categoriesAPI.setWatchState = async (caller, { cid, state, uid }) => {
let targetUid = caller.uid;
const cids = Array.isArray(cid) ? cid.map(cid => parseInt(cid, 10)) : [parseInt(cid, 10)];
let cids = Array.isArray(cid) ? cid : [cid];
cids = cids.map(cid => (utils.isNumber(cid) ? parseInt(cid, 10) : cid));
if (uid) {
targetUid = uid;
}

View File

@@ -3,6 +3,7 @@
const db = require('../database');
const user = require('../user');
const activitypub = require('../activitypub');
const utils = require('../utils');
module.exports = function (Categories) {
Categories.watchStates = {
@@ -32,7 +33,11 @@ module.exports = function (Categories) {
user.getSettings(uid),
db.sortedSetsScore(keys, uid),
]);
return states.map(state => state || Categories.watchStates[userSettings.categoryWatchState]);
const fallbacks = cids.map(cid => (utils.isNumber(cid) ?
Categories.watchStates[userSettings.categoryWatchState] : Categories.watchStates.notwatching));
return states.map((state, idx) => state || fallbacks[idx]);
};
Categories.getIgnorers = async function (cid, start, stop) {

View File

@@ -20,6 +20,11 @@ const uidToSystemGroup = {
};
helpers.isUsersAllowedTo = async function (privilege, uids, cid) {
// Remote categories inherit world pseudo-category privileges
if (!utils.isNumber(cid)) {
cid = -1;
}
const [hasUserPrivilege, hasGroupPrivilege] = await Promise.all([
groups.isMembers(uids, `cid:${cid}:privileges:${privilege}`),
groups.isMembersOfGroupList(uids, `cid:${cid}:privileges:groups:${privilege}`),

View File

@@ -67,7 +67,11 @@ module.exports = function (User) {
};
User.getCategoriesByStates = async function (uid, states) {
const cids = await categories.getAllCidsFromSet('categories:cid');
const remoteCids = await db.getObjectValues('handle:cid');
const cids = [
(await categories.getAllCidsFromSet('categories:cid')),
...remoteCids,
];
if (!(parseInt(uid, 10) > 0)) {
return cids;
}