From fa5ac04cd3c02011cec928fc23fa17f2a0080a9b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 11 Nov 2014 19:47:56 -0500 Subject: [PATCH] src/topics.js cleanup --- src/privileges/topics.js | 2 +- src/topics.js | 188 +-------------------------------------- src/topics/posts.js | 9 +- src/topics/teaser.js | 130 +++++++++++++++++++++++++++ src/topics/user.js | 45 ++++++++++ tests/topics.js | 8 +- 6 files changed, 184 insertions(+), 198 deletions(-) create mode 100644 src/topics/teaser.js create mode 100644 src/topics/user.js diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 3a32bcfa5a..63793dbc0c 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -76,7 +76,7 @@ module.exports = function(privileges) { }; privileges.topics.filter = function(privilege, tids, uid, callback) { - if (!tids.length) { + if (!Array.isArray(tids) || !tids.length) { return callback(null, []); } diff --git a/src/topics.js b/src/topics.js index d90d6aefde..807138286d 100644 --- a/src/topics.js +++ b/src/topics.js @@ -1,7 +1,6 @@ "use strict"; var async = require('async'), - winston = require('winston'), validator = require('validator'), _ = require('underscore'), @@ -20,10 +19,12 @@ var async = require('async'), require('./topics/unread')(Topics); require('./topics/recent')(Topics); require('./topics/popular')(Topics); + require('./topics/user')(Topics); require('./topics/fork')(Topics); require('./topics/posts')(Topics); require('./topics/follow')(Topics); require('./topics/tags')(Topics); + require('./topics/teaser')(Topics); Topics.getTopicData = function(tid, callback) { db.getObject('topic:' + tid, function(err, topic) { @@ -59,23 +60,6 @@ var async = require('async'), }); }; - Topics.getTopicDataWithUser = function(tid, callback) { - Topics.getTopicData(tid, function(err, topic) { - if (err || !topic) { - return callback(err || new Error('[[error:no-topic]]')); - } - - user.getUserFields(topic.uid, ['username', 'userslug', 'picture'], function(err, userData) { - if (err) { - return callback(err); - } - - topic.user = userData; - callback(null, topic); - }); - }); - }; - Topics.getPageCount = function(tid, uid, callback) { Topics.getTopicField(tid, 'postcount', function(err, postCount) { if (err) { @@ -130,10 +114,6 @@ var async = require('async'), nextStart: 0 }; - if (!Array.isArray(tids) || !tids.length) { - return callback(null, returnTopics); - } - privileges.topics.filter('read', tids, uid, function(err, tids) { if (err) { return callback(err); @@ -144,10 +124,6 @@ var async = require('async'), return callback(err); } - if(!Array.isArray(topicData) || !topicData.length) { - return callback(null, returnTopics); - } - returnTopics.topics = topicData; callback(null, returnTopics); }); @@ -328,130 +304,11 @@ var async = require('async'), return callback(err); } - if (!Array.isArray(postData) || !postData.length) { - return callback(null, []); - } - Topics.addPostData(postData, uid, callback); }); }); }; - Topics.getTeasers = function(tids, uid, callback) { - if (!Array.isArray(tids) || !tids.length) { - return callback(null, []); - } - - async.parallel({ - counts: function(next) { - Topics.getTopicsFields(tids, ['postcount'], function(err, topics) { - if (err) { - return next(err); - } - topics = topics.map(function(topic) { - return topic && (parseInt(topic.postcount, 10) || 0); - }); - - next(null, topics); - }); - }, - pids: function(next) { - async.map(tids, function(tid, next) { - db.getSortedSetRevRange('tid:' + tid + ':posts', 0, 0, function(err, data) { - next(err, Array.isArray(data) && data.length ? data[0] : null); - }); - }, next); - } - }, function(err, results) { - if (err) { - return callback(err); - } - - var postKeys = results.pids.filter(Boolean).map(function(pid) { - return 'post:' + pid; - }); - - db.getObjectsFields(postKeys, ['pid', 'uid', 'timestamp', 'tid'], function(err, postData) { - if (err) { - return callback(err); - } - - var uids = postData.map(function(post) { - return post.uid; - }).filter(function(uid, index, array) { - return array.indexOf(uid) === index; - }); - - - user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], function(err, usersData) { - if (err) { - return callback(err); - } - - var users = {}; - usersData.forEach(function(user) { - users[user.uid] = user; - }); - var tidToPost = {}; - postData.forEach(function(post) { - post.user = users[post.uid]; - post.timestamp = utils.toISOString(post.timestamp); - tidToPost[post.tid] = post; - }); - - var teasers = tids.map(function(tid, index) { - if (tidToPost[tid]) { - tidToPost[tid].index = results.counts[index]; - } - return tidToPost[tid]; - }); - - callback(null, teasers); - }); - }); - }); - }; - - Topics.getTeaser = function(tid, uid, callback) { - Topics.getLatestUndeletedPid(tid, function(err, pid) { - if (err || !pid) { - return callback(err); - } - - async.parallel({ - postData: function(next) { - posts.getPostFields(pid, ['pid', 'uid', 'timestamp'], function(err, postData) { - if (err) { - return next(err); - } else if(!postData || !utils.isNumber(postData.uid)) { - return callback(); - } - - user.getUserFields(postData.uid, ['username', 'userslug', 'picture'], function(err, userData) { - if (err) { - return next(err); - } - postData.user = userData; - next(null, postData); - }); - }); - }, - postIndex: function(next) { - posts.getPidIndex(pid, uid, next); - } - }, function(err, results) { - if (err) { - return callback(err); - } - - results.postData.timestamp = utils.toISOString(results.postData.timestamp); - results.postData.index = results.postIndex; - - callback(null, results.postData); - }); - }); - }; - Topics.getTopicField = function(tid, field, callback) { db.getObjectField('topic:' + tid, field, callback); }; @@ -473,46 +330,7 @@ var async = require('async'), Topics.isLocked = function(tid, callback) { Topics.getTopicField(tid, 'locked', function(err, locked) { - if(err) { - return callback(err); - } - callback(null, parseInt(locked, 10) === 1); - }); - }; - - Topics.isOwner = function(tid, uid, callback) { - uid = parseInt(uid, 10); - if (!uid) { - return callback(null, false); - } - Topics.getTopicField(tid, 'uid', function(err, author) { - callback(err, parseInt(author, 10) === uid); - }); - }; - - Topics.getUids = function(tid, callback) { - Topics.getPids(tid, function(err, pids) { - if (err) { - return callback(err); - } - - var keys = pids.map(function(pid) { - return 'post:' + pid; - }); - - db.getObjectsFields(keys, ['uid'], function(err, data) { - if (err) { - return callback(err); - } - - var uids = data.map(function(data) { - return data.uid; - }).filter(function(uid, pos, array) { - return array.indexOf(uid) === pos; - }); - - callback(null, uids); - }); + callback(err, parseInt(locked, 10) === 1); }); }; diff --git a/src/topics/posts.js b/src/topics/posts.js index 8c18ad7d7a..7cecf809b9 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -31,19 +31,18 @@ module.exports = function(Topics) { Topics.getTopicPosts = function(tid, set, start, end, uid, reverse, callback) { callback = callback || function() {}; posts.getPostsByTid(tid, set, start, end, uid, reverse, function(err, postData) { - if(err) { + if (err) { return callback(err); } - if (Array.isArray(postData) && !postData.length) { - return callback(null, []); - } - Topics.addPostData(postData, uid, callback); }); }; Topics.addPostData = function(postData, uid, callback) { + if (!Array.isArray(postData) || !postData.length) { + return callback(null, []); + } var pids = postData.map(function(post) { return post && post.pid; }); diff --git a/src/topics/teaser.js b/src/topics/teaser.js new file mode 100644 index 0000000000..22bbd7af22 --- /dev/null +++ b/src/topics/teaser.js @@ -0,0 +1,130 @@ + + +'use strict'; + +var async = require('async'), + + db = require('../database'), + user = require('../user'), + posts = require('../posts'), + utils = require('../../public/src/utils'); + + + +module.exports = function(Topics) { + + Topics.getTeasers = function(tids, uid, callback) { + if (!Array.isArray(tids) || !tids.length) { + return callback(null, []); + } + + async.parallel({ + counts: function(next) { + Topics.getTopicsFields(tids, ['postcount'], function(err, topics) { + if (err) { + return next(err); + } + topics = topics.map(function(topic) { + return topic && (parseInt(topic.postcount, 10) || 0); + }); + + next(null, topics); + }); + }, + pids: function(next) { + async.map(tids, function(tid, next) { + db.getSortedSetRevRange('tid:' + tid + ':posts', 0, 0, function(err, data) { + next(err, Array.isArray(data) && data.length ? data[0] : null); + }); + }, next); + } + }, function(err, results) { + if (err) { + return callback(err); + } + + var postKeys = results.pids.filter(Boolean).map(function(pid) { + return 'post:' + pid; + }); + + db.getObjectsFields(postKeys, ['pid', 'uid', 'timestamp', 'tid'], function(err, postData) { + if (err) { + return callback(err); + } + + var uids = postData.map(function(post) { + return post.uid; + }).filter(function(uid, index, array) { + return array.indexOf(uid) === index; + }); + + + user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], function(err, usersData) { + if (err) { + return callback(err); + } + + var users = {}; + usersData.forEach(function(user) { + users[user.uid] = user; + }); + var tidToPost = {}; + postData.forEach(function(post) { + post.user = users[post.uid]; + post.timestamp = utils.toISOString(post.timestamp); + tidToPost[post.tid] = post; + }); + + var teasers = tids.map(function(tid, index) { + if (tidToPost[tid]) { + tidToPost[tid].index = results.counts[index]; + } + return tidToPost[tid]; + }); + + callback(null, teasers); + }); + }); + }); + }; + + Topics.getTeaser = function(tid, uid, callback) { + Topics.getLatestUndeletedPid(tid, function(err, pid) { + if (err || !pid) { + return callback(err); + } + + async.parallel({ + postData: function(next) { + posts.getPostFields(pid, ['pid', 'uid', 'timestamp'], function(err, postData) { + if (err) { + return next(err); + } else if(!postData || !utils.isNumber(postData.uid)) { + return callback(); + } + + user.getUserFields(postData.uid, ['username', 'userslug', 'picture'], function(err, userData) { + if (err) { + return next(err); + } + postData.user = userData; + next(null, postData); + }); + }); + }, + postIndex: function(next) { + posts.getPidIndex(pid, uid, next); + } + }, function(err, results) { + if (err) { + return callback(err); + } + + results.postData.timestamp = utils.toISOString(results.postData.timestamp); + results.postData.index = results.postIndex; + + callback(null, results.postData); + }); + }); + }; +}; \ No newline at end of file diff --git a/src/topics/user.js b/src/topics/user.js new file mode 100644 index 0000000000..1d6bea9a28 --- /dev/null +++ b/src/topics/user.js @@ -0,0 +1,45 @@ + + +'use strict'; + +var db = require('../database'); + + +module.exports = function(Topics) { + + Topics.isOwner = function(tid, uid, callback) { + uid = parseInt(uid, 10); + if (!uid) { + return callback(null, false); + } + Topics.getTopicField(tid, 'uid', function(err, author) { + callback(err, parseInt(author, 10) === uid); + }); + }; + + Topics.getUids = function(tid, callback) { + Topics.getPids(tid, function(err, pids) { + if (err) { + return callback(err); + } + + var keys = pids.map(function(pid) { + return 'post:' + pid; + }); + + db.getObjectsFields(keys, ['uid'], function(err, data) { + if (err) { + return callback(err); + } + + var uids = data.map(function(data) { + return data.uid; + }).filter(function(uid, pos, array) { + return array.indexOf(uid) === pos; + }); + + callback(null, uids); + }); + }); + }; +}; \ No newline at end of file diff --git a/tests/topics.js b/tests/topics.js index 3d5f924197..f6ed12cbac 100644 --- a/tests/topics.js +++ b/tests/topics.js @@ -38,7 +38,7 @@ describe('Topic\'s', function() { }); }); - + }); describe('.post', function() { @@ -77,12 +77,6 @@ describe('Topic\'s', function() { topics.getTopicData(newTopic.tid, done); }); }); - - describe('.getTopicDataWithUser', function() { - it('should not receive errors', function(done) { - topics.getTopicDataWithUser(newTopic.tid, done); - }); - }); }); after(function() {