'use strict'; const db = require('../database'); const user = require('../user'); module.exports = function (Categories) { Categories.watchStates = { ignoring: 1, notwatching: 2, watching: 3, }; Categories.isIgnored = async function (cids, uid) { if (!(parseInt(uid, 10) > 0)) { return cids.map(() => false); } const states = await Categories.getWatchState(cids, uid); return states.map(state => state === Categories.watchStates.ignoring); }; Categories.getWatchState = async function (cids, uid) { if (!(parseInt(uid, 10) > 0)) { return cids.map(() => Categories.watchStates.notwatching); } if (!Array.isArray(cids) || !cids.length) { return []; } const keys = cids.map(cid => `cid:${cid}:uid:watch:state`); const [userSettings, states] = await Promise.all([ user.getSettings(uid), db.sortedSetsScore(keys, uid), ]); return states.map(state => state || Categories.watchStates[userSettings.categoryWatchState]); }; Categories.getIgnorers = async function (cid, start, stop) { const count = (stop === -1) ? -1 : (stop - start + 1); return await db.getSortedSetRevRangeByScore(`cid:${cid}:uid:watch:state`, start, count, Categories.watchStates.ignoring, Categories.watchStates.ignoring); }; Categories.filterIgnoringUids = async function (cid, uids) { const states = await Categories.getUidsWatchStates(cid, uids); const readingUids = uids.filter((uid, index) => uid && states[index] !== Categories.watchStates.ignoring); return readingUids; }; Categories.getUidsWatchStates = async function (cid, uids) { const [userSettings, states] = await Promise.all([ user.getMultipleUserSettings(uids), db.sortedSetScores(`cid:${cid}:uid:watch:state`, uids), ]); return states.map((state, index) => state || Categories.watchStates[userSettings[index].categoryWatchState]); }; };