You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/posts/category.js

84 lines
1.8 KiB
JavaScript

'use strict';
9 years ago
var async = require('async');
var _ = require('lodash');
9 years ago
var db = require('../database');
9 years ago
var topics = require('../topics');
module.exports = function (Posts) {
Posts.getCidByPid = function (pid, callback) {
async.waterfall([
function (next) {
Posts.getPostField(pid, 'tid', next);
},
function (tid, next) {
topics.getTopicField(tid, 'cid', next);
},
], callback);
};
Posts.getCidsByPids = function (pids, callback) {
8 years ago
var tids;
var postData;
async.waterfall([
function (next) {
Posts.getPostsFields(pids, ['tid'], next);
},
function (_postData, next) {
postData = _postData;
tids = _.uniq(postData.map(post => post && post.tid).filter(Boolean));
8 years ago
topics.getTopicsFields(tids, ['cid'], next);
},
function (topicData, next) {
var map = {};
8 years ago
topicData.forEach(function (topic, index) {
if (topic) {
map[tids[index]] = topic.cid;
}
});
var cids = postData.map(post => map[post.tid]);
8 years ago
next(null, cids);
},
8 years ago
], callback);
};
9 years ago
Posts.filterPidsByCid = function (pids, cid, callback) {
9 years ago
if (!cid) {
return setImmediate(callback, null, pids);
9 years ago
}
8 years ago
if (!Array.isArray(cid) || cid.length === 1) {
return filterPidsBySingleCid(pids, cid, callback);
}
async.waterfall([
function (next) {
async.map(cid, function (cid, next) {
Posts.filterPidsByCid(pids, cid, next);
}, next);
},
function (pidsArr, next) {
next(null, _.union.apply(_, pidsArr));
},
], callback);
};
function filterPidsBySingleCid(pids, cid, callback) {
async.waterfall([
function (next) {
db.isSortedSetMembers('cid:' + parseInt(cid, 10) + ':pids', pids, next);
},
function (isMembers, next) {
pids = pids.filter(function (pid, index) {
8 years ago
return pid && isMembers[index];
});
next(null, pids);
},
], callback);
}
8 years ago
};