var RDB = require('./redis.js'), posts = require('./posts.js'), utils = require('./../public/src/utils.js'), user = require('./user.js'), async = require('async'), topics = require('./topics.js'); (function(Categories) { Categories.getCategoryById = function(category_id, current_user, callback) { RDB.smembers('categories:' + category_id + ':tid', function(err, tids) { Categories.getCategoryData(category_id, function(categoryData) { var category_name = categoryData.name; category_slug = categoryData.slug; RDB.smembers('cid:' + category_id + ':active_users', function(err, active_users) { if (category_name === null) { callback(false); } var categoryData = { 'category_name' : category_name, 'show_sidebar' : 'show', 'show_topic_button': 'show', 'no_topics_message': 'hidden', 'topic_row_size': 'span9', 'category_id': category_id, 'active_users': [], 'topics' : [], 'twitter-intent-url': 'https://twitter.com/intent/tweet?url=' + encodeURIComponent(global.config.url + 'category/' + category_slug) + '&text=' + encodeURIComponent(category_name), 'facebook-share-url': 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(global.config.url + 'category/' + category_slug), 'google-share-url': 'https://plus.google.com/share?url=' + encodeURIComponent(global.config.url + 'category/' + category_slug) }; function getTopics(next) { Categories.getTopicsByTids(tids, current_user, function(topics) { // Float pinned topics to the top topics = topics.sort(function(a, b) { if (a.pinned !== b.pinned) return b.pinned - a.pinned; else { return b.lastposttime - a.lastposttime; } }); next(null, topics); }, category_id); } function getModerators(next) { Categories.getModerators(category_id, function(moderators) { next(null, moderators); }); } function getActiveUsers(next) { user.getMultipleUserFields(active_users, ['username', 'userslug'], function(users) { next(null, users); }); } if (tids.length === 0) { getModerators(function(err, moderators) { categoryData.moderator_block_class = moderators.length > 0 ? '' : 'none'; categoryData.moderators = moderators; categoryData.show_sidebar = 'hidden'; categoryData.no_topics_message = 'show'; callback(categoryData); }); } else { async.parallel([getTopics, getModerators, getActiveUsers], function(err, results) { categoryData.topics = results[0]; categoryData.moderator_block_class = results[1].length > 0 ? '' : 'none'; categoryData.moderators = results[1]; categoryData.active_users = results[2]; callback(categoryData); }); } }); }); }); } // not the permanent location for this function Categories.getLatestTopics = function(current_user, start, end, callback) { RDB.zrevrange('topics:recent', 0, -1, function(err, tids) { var latestTopics = { 'category_name' : 'Recent', 'show_sidebar' : 'hidden', 'show_topic_button' : 'hidden', 'no_topics_message' : 'hidden', 'topic_row_size': 'span12', 'category_id': false, 'topics' : [] }; if (!tids.length) { callback(latestTopics); return; } Categories.getTopicsByTids(tids, current_user, function(topicData) { latestTopics.topics = topicData; callback(latestTopics); }); }); } // not the permanent location for this function Categories.getTopicsByTids = function(tids, current_user, callback, category_id /*temporary*/) { var retrieved_topics = []; var topicCountToLoad = tids.length; function getTopicInfo(topicData, callback) { function getUserName(next) { user.getUserField(topicData.uid, 'username', function(username) { next(null, username); }); } function hasReadTopic(next) { topics.hasReadTopic(topicData.tid, current_user, function(hasRead) { next(null, hasRead); }); } function getTeaserInfo(next) { topics.getTeaser(topicData.tid, function(teaser) { next(null, teaser); }); } // temporary. I don't think this call should belong here function getPrivileges(next) { Categories.privileges(category_id, current_user, function(user_privs) { next(null, user_privs); }); } async.parallel([getUserName, hasReadTopic, getTeaserInfo, getPrivileges], function(err, results) { var username = results[0], hasReadTopic = results[1], teaserInfo = results[2], privileges = results[3]; callback({ username: username, hasread: hasReadTopic, teaserInfo: teaserInfo, privileges: privileges }); }); } function isTopicVisible(topicData, topicInfo) { var deleted = parseInt(topicData.deleted, 10) !== 0; return !deleted || (deleted && topicInfo.privileges.view_deleted) || topicData.uid === current_user; } for(var i=0; i