'use strict'; var async = require('async'); var db = require('./database'); var user = require('./user'); var Groups = require('./groups'); var plugins = require('./plugins'); (function(Categories) { require('./categories/data')(Categories); require('./categories/create')(Categories); require('./categories/delete')(Categories); require('./categories/topics')(Categories); require('./categories/unread')(Categories); require('./categories/activeusers')(Categories); require('./categories/recentreplies')(Categories); require('./categories/update')(Categories); Categories.exists = function(cid, callback) { db.isSortedSetMember('categories:cid', cid, callback); }; Categories.getCategoryById = function(data, callback) { var category; async.waterfall([ function (next) { Categories.getCategories([data.cid], data.uid, next); }, function (categories, next) { if (!Array.isArray(categories) || !categories[0]) { return next(new Error('[[error:invalid-cid]]')); } category = categories[0]; if (parseInt(data.uid, 10)) { Categories.markAsRead([data.cid], data.uid); } async.parallel({ topics: function(next) { Categories.getCategoryTopics(data, next); }, isIgnored: function(next) { Categories.isIgnored([data.cid], data.uid, next); } }, next); }, function (results, next) { category.topics = results.topics.topics; category.nextStart = results.topics.nextStart; category.isIgnored = results.isIgnored[0]; plugins.fireHook('filter:category.get', {category: category, uid: data.uid}, next); }, function (data, next) { next(null, data.category); } ], callback); }; Categories.isIgnored = function(cids, uid, callback) { user.getIgnoredCategories(uid, function(err, ignoredCids) { if (err) { return callback(err); } cids = cids.map(function(cid) { return ignoredCids.indexOf(cid.toString()) !== -1; }); callback(null, cids); }); }; Categories.getPageCount = function(cid, uid, callback) { async.parallel({ topicCount: async.apply(Categories.getCategoryField, cid, 'topic_count'), settings: async.apply(user.getSettings, uid) }, function(err, results) { if (err) { return callback(err); } if (!parseInt(results.topicCount, 10)) { return callback(null, 1); } callback(null, Math.ceil(parseInt(results.topicCount, 10) / results.settings.topicsPerPage)); }); }; Categories.getAllCategories = function(uid, callback) { db.getSortedSetRange('categories:cid', 0, -1, function(err, cids) { if (err || !Array.isArray(cids) || !cids.length) { return callback(err, []); } Categories.getCategories(cids, uid, callback); }); }; Categories.getCategoriesByPrivilege = function(set, uid, privilege, callback) { var privileges = require('./privileges'); async.waterfall([ function(next) { db.getSortedSetRange(set, 0, -1, next); }, function(cids, next) { privileges.categories.filterCids(privilege, cids, uid, next); }, function(cids, next) { Categories.getCategories(cids, uid, next); } ], callback); }; Categories.getModerators = function(cid, callback) { Groups.getMembers('cid:' + cid + ':privileges:mods', 0, -1, function(err, uids) { if (err || !Array.isArray(uids) || !uids.length) { return callback(err, []); } user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture'], callback); }); }; Categories.getCategories = function(cids, uid, callback) { if (!Array.isArray(cids)) { return callback(new Error('[[error:invalid-cid]]')); } if (!cids.length) { return callback(null, []); } async.parallel({ categories: function(next) { Categories.getCategoriesData(cids, next); }, children: function(next) { Categories.getChildren(cids, uid, next); }, parents: function(next) { Categories.getParents(cids, next); }, hasRead: function(next) { Categories.hasReadCategories(cids, uid, next); } }, function(err, results) { if (err) { return callback(err); } var categories = results.categories; var hasRead = results.hasRead; uid = parseInt(uid, 10); for(var i=0; i