'use strict'; var async = require('async'), db = require('../database'), topics = require('../topics'), plugins = require('../plugins'); module.exports = function(Categories) { Categories.getCategoryTopics = function(data, callback) { var tids; async.waterfall([ async.apply(plugins.fireHook, 'filter:category.topics.get', data), function(data, next) { Categories.getTopicIds(data.targetUid ? 'cid:' + data.cid + ':uid:' + data.targetUid + ':tids' : 'cid:' + data.cid + ':tids', data.start, data.stop, next); }, function(topicIds, next) { tids = topicIds; topics.getTopicsByTids(tids, data.uid, next); }, function(topics, next) { if (!Array.isArray(topics) || !topics.length) { return next(null, { topics: [], nextStart: 1 }); } var indices = {}, i = 0; for(i=0; i<tids.length; ++i) { indices[tids[i]] = data.start + i; } for(i=0; i<topics.length; ++i) { topics[i].index = indices[topics[i].tid]; } next(null, { topics: topics, nextStart: data.stop + 1 }); } ], callback); }; Categories.getTopicIds = function(set, start, stop, callback) { db.getSortedSetRevRange(set, start, stop, callback); }; Categories.getTopicIndex = function(tid, callback) { topics.getTopicField(tid, 'cid', function(err, cid) { if(err) { return callback(err); } db.sortedSetRevRank('cid:' + cid + ':tids', tid, callback); }); }; Categories.onNewPostMade = function(postData, callback) { topics.getTopicFields(postData.tid, ['cid', 'pinned'], function(err, topicData) { if (err) { return callback(err); } if (!topicData || !topicData.cid) { return callback(); } var cid = topicData.cid; async.parallel([ function(next) { db.sortedSetAdd('cid:' + cid + ':pids', postData.timestamp, postData.pid, next); }, function(next) { db.incrObjectField('category:' + cid, 'post_count', next); }, function(next) { if (parseInt(topicData.pinned, 10) === 1) { next(); } else { db.sortedSetAdd('cid:' + cid + ':tids', postData.timestamp, postData.tid, next); } } ], callback); }); }; };