diff --git a/src/categories.js b/src/categories.js
index a2aee70091..31e425c27b 100644
--- a/src/categories.js
+++ b/src/categories.js
@@ -1,8 +1,8 @@
-var db = require('./database.js'),
- posts = require('./posts.js'),
- utils = require('./../public/src/utils.js'),
- user = require('./user.js'),
- topics = require('./topics.js'),
+var db = require('./database'),
+ posts = require('./posts'),
+ utils = require('./../public/src/utils'),
+ user = require('./user'),
+ topics = require('./topics'),
plugins = require('./plugins'),
CategoryTools = require('./categoryTools'),
meta = require('./meta'),
@@ -52,8 +52,8 @@ var db = require('./database.js'),
return callback(err);
}
- function getTopicIds(next) {
- Categories.getTopicIds(category_id, start, end, next);
+ function getTopics(next) {
+ Categories.getCategoryTopics(category_id, start, end, current_user, next);
}
function getActiveUsers(next) {
@@ -70,9 +70,12 @@ var db = require('./database.js'),
Categories.getPageCount(category_id, next);
}
- async.parallel([getTopicIds, getActiveUsers, getSidebars, getPageCount], function(err, results) {
- var tids = results[0],
- active_users = results[1],
+ async.parallel([getTopics, getActiveUsers, getSidebars, getPageCount], function(err, results) {
+ if(err) {
+ return callback(err);
+ }
+
+ var active_users = results[1],
sidebars = results[2],
pageCount = results[3];
@@ -87,27 +90,22 @@ var db = require('./database.js'),
'topic_row_size': 'col-md-9',
'category_id': category_id,
'active_users': [],
- 'topics': [],
+ 'topics': results[0].topics,
+ 'nextStart': results[0].nextStart,
'pageCount': pageCount,
'disableSocialButtons': meta.config.disableSocialButtons !== undefined ? parseInt(meta.config.disableSocialButtons, 10) !== 0 : false,
'sidebars': sidebars
};
- function getTopics(next) {
- topics.getTopicsByTids(tids, category_id, current_user, next);
- }
-
function getModerators(next) {
Categories.getModerators(category_id, next);
}
function getActiveUsers(next) {
- user.getMultipleUserFields(active_users, ['uid', 'username', 'userslug', 'picture'], function(err, users) {
- next(err, users);
- });
+ user.getMultipleUserFields(active_users, ['uid', 'username', 'userslug', 'picture'], next);
}
- if (tids.length === 0) {
+ if (!category.topics.length) {
getModerators(function(err, moderators) {
category.moderator_block_class = moderators.length > 0 ? '' : 'none';
category.moderators = moderators;
@@ -116,11 +114,10 @@ var db = require('./database.js'),
callback(null, category);
});
} else {
- async.parallel([getTopics, getModerators, getActiveUsers], function(err, results) {
- category.topics = results[0];
- category.moderator_block_class = results[1].length > 0 ? '' : 'none';
- category.moderators = results[1];
- category.active_users = results[2];
+ async.parallel([getModerators, getActiveUsers], function(err, results) {
+ category.moderator_block_class = results[0].length > 0 ? '' : 'none';
+ category.moderators = results[0];
+ category.active_users = results[1];
category.show_sidebar = category.topics.length > 0 ? 'show' : 'hidden';
callback(null, category);
});
@@ -131,13 +128,26 @@ var db = require('./database.js'),
};
Categories.getCategoryTopics = function(cid, start, stop, uid, callback) {
- Categories.getTopicIds(cid, start, stop, function(err, tids) {
- if(err) {
- return callback(err);
- }
+ async.waterfall([
+ function(next) {
+ Categories.getTopicIds(cid, start, stop, next);
+ },
+ function(tids, next) {
+ topics.getTopicsByTids(tids, cid, uid, next);
+ },
+ function(topics, next) {
+ db.sortedSetRevRank('categories:' + cid + ':tid', topics[topics.length - 1].tid, function(err, rank) {
+ if(err) {
+ return next(err);
+ }
- topics.getTopicsByTids(tids, cid, uid, callback);
- });
+ return next(null, {
+ topics: topics,
+ nextStart: parseInt(rank, 10) + 1
+ });
+ });
+ }
+ ], callback);
};
Categories.getTopicIds = function(cid, start, stop, callback) {
diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js
index eaac85b4ac..4ccc949779 100644
--- a/src/socket.io/categories.js
+++ b/src/socket.io/categories.js
@@ -18,14 +18,10 @@ SocketCategories.loadMore = function(socket, data, callback) {
var topicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20;
- var start = data.after,
+ var start = parseInt(data.after, 10),
end = start + topicsPerPage - 1;
-
- categories.getCategoryTopics(data.cid, start, end, socket.uid, function(err, topics) {
- callback(err, {
- topics: topics
- });
- });
+console.log(start, end);
+ categories.getCategoryTopics(data.cid, start, end, socket.uid, callback);
};
SocketCategories.getPageCount = function(socket, cid, callback) {
diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js
index b81b484610..e290efc59e 100644
--- a/src/socket.io/topics.js
+++ b/src/socket.io/topics.js
@@ -236,7 +236,7 @@ SocketTopics.loadMore = function(socket, data, callback) {
var postsPerPage = parseInt(meta.config.postsPerPage, 10);
postsPerPage = postsPerPage ? postsPerPage : 20;
- var start = data.after,
+ var start = parseInt(data.after, 10),
end = start + postsPerPage - 1;
async.parallel({
@@ -256,14 +256,14 @@ SocketTopics.loadMoreRecentTopics = function(socket, data, callback) {
return callback(new Error('invalid data'));
}
- var start = data.after,
+ var start = parseInt(data.after, 10),
end = start + 9;
topics.getLatestTopics(socket.uid, start, end, data.term, callback);
};
SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) {
- var start = data.after,
+ var start = parseInt(data.after, 10),
end = start + 9;
topics.getUnreadTopics(socket.uid, start, end, callback);
diff --git a/src/topics.js b/src/topics.js
index 76a98767d9..580b1e15d3 100644
--- a/src/topics.js
+++ b/src/topics.js
@@ -448,11 +448,7 @@ var async = require('async'),
async.filter(tids, function(tid, next) {
threadTools.privileges(tid, current_user, function(err, privileges) {
- if (!err && privileges.read) {
- next(true);
- } else {
- next(false);
- }
+ next(!err && privileges.read);
});
}, function(tids) {
Topics.getTopicsByTids(tids, 0, current_user, function(err, topicData) {
@@ -466,7 +462,7 @@ var async = require('async'),
}
db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) {
- latestTopics.lastIndex = rank;
+ latestTopics.nextStart = parseInt(rank,10) + 1;
latestTopics.topics = topicData;
callback(null, latestTopics);
});
@@ -549,7 +545,7 @@ var async = require('async'),
return parseInt(read[index], 10) === 0;
});
- // Filter out topics that belong to categories that this user cannot access
+
async.filter(newtids, function(tid, next) {
threadTools.privileges(tid, uid, function(err, privileges) {
if (!err && privileges.read) {
@@ -599,16 +595,23 @@ var async = require('async'),
return callback(err);
}
- unreadTopics.topics = topicData;
- unreadTopics.nextStart = stop + 1;
- if (!topicData || topicData.length === 0) {
- unreadTopics.no_topics_message = 'show';
- }
- if (uid === 0 || topicData.length === 0) {
- unreadTopics.show_markallread_button = 'hidden';
- }
+ db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) {
+ if(err) {
+ return callback(err);
+ }
+
+ unreadTopics.topics = topicData;
+ unreadTopics.nextStart = parseInt(rank, 10) + 1;
+
+ if (!topicData || topicData.length === 0) {
+ unreadTopics.no_topics_message = 'show';
+ }
+ if (uid === 0 || topicData.length === 0) {
+ unreadTopics.show_markallread_button = 'hidden';
+ }
- callback(null, unreadTopics);
+ callback(null, unreadTopics);
+ });
});
}
diff --git a/tests/categories.js b/tests/categories.js
index ba9cf3b702..770ad0b498 100644
--- a/tests/categories.js
+++ b/tests/categories.js
@@ -43,9 +43,9 @@ describe('Categories', function() {
describe('.getCategoryTopics', function() {
it('should return a list of topics', function(done) {
- Categories.getCategoryTopics(categoryObj.cid, 0, 10, 0, function(err, topics) {
- assert(Array.isArray(topics));
- assert(topics.every(function(topic) {
+ Categories.getCategoryTopics(categoryObj.cid, 0, 10, 0, function(err, result) {
+ assert(Array.isArray(result.topics));
+ assert(result.topics.every(function(topic) {
return topic instanceof Object;
}));