|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
|
|
const _ = require('lodash');
|
|
|
|
|
|
|
|
const db = require('../database');
|
|
|
|
const topics = require('../topics');
|
|
|
|
|
|
|
|
module.exports = function (Posts) {
|
|
|
|
Posts.getCidByPid = async function (pid) {
|
|
|
|
const tid = await Posts.getPostField(pid, 'tid');
|
|
|
|
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]);
|
|
|
|
}
|
|
|
|
};
|