Files
NodeBB/src/posts/category.js
2024-01-16 11:20:54 -05:00

47 lines
1.3 KiB
JavaScript

'use strict';
const _ = require('lodash');
const db = require('../database');
const topics = require('../topics');
const activitypub = require('../activitypub');
module.exports = function (Posts) {
Posts.getCidByPid = async function (pid) {
const tid = await Posts.getPostField(pid, 'tid');
if (!tid && activitypub.helpers.isUri(pid)) {
return -1; // fediverse pseudo-category
}
return await topics.getTopicField(tid, 'cid');
};
Posts.getCidsByPids = async function (pids) {
const postData = await Posts.getPostsFields(pids, ['tid']);
const tids = _.uniq(postData.map(post => post && post.tid).filter(Boolean));
const topicData = await topics.getTopicsFields(tids, ['cid']);
const tidToTopic = _.zipObject(tids, topicData);
const cids = postData.map(post => tidToTopic[post.tid] && tidToTopic[post.tid].cid);
return cids;
};
Posts.filterPidsByCid = async function (pids, cid) {
if (!cid) {
return pids;
}
if (!Array.isArray(cid) || cid.length === 1) {
return await filterPidsBySingleCid(pids, cid);
}
const pidsArr = await Promise.all(cid.map(c => Posts.filterPidsByCid(pids, c)));
return _.union(...pidsArr);
};
async function filterPidsBySingleCid(pids, cid) {
const isMembers = await db.isSortedSetMembers(`cid:${parseInt(cid, 10)}:pids`, pids);
return pids.filter((pid, index) => pid && isMembers[index]);
}
};