From 958fe3e72fc947475306cf6b1113d85de0f84aa0 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 19 Sep 2016 13:08:31 +0300 Subject: [PATCH] closes #3762 --- public/src/client/category.js | 4 +++- src/categories.js | 11 +++++++--- src/categories/topics.js | 8 +++---- src/controllers/category.js | 39 ++++++++++++++++++++++------------- src/socket.io/categories.js | 4 ++++ 5 files changed, 44 insertions(+), 22 deletions(-) diff --git a/public/src/client/category.js b/public/src/client/category.js index 80d8d10539..d0a6d37f2a 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -273,11 +273,13 @@ define('forum/category', [ } $(window).trigger('action:categories.loading'); + var params = utils.params(); infinitescroll.loadMore('categories.loadMore', { cid: ajaxify.data.cid, after: after, direction: direction, - author: utils.params().author, + author: params.author, + tag: params.tag, categoryTopicSort: config.categoryTopicSort }, function (data, done) { if (data.topics && data.topics.length) { diff --git a/src/categories.js b/src/categories.js index b5291b2f8b..e058a452e6 100644 --- a/src/categories.js +++ b/src/categories.js @@ -35,14 +35,18 @@ var privileges = require('./privileges'); 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); }, + topicCount: function(next) { + if (Array.isArray(data.set)) { + db.sortedSetIntersectCard(data.set, next); + } else { + next(null, category.topic_count); + } + }, isIgnored: function(next) { Categories.isIgnored([data.cid], data.uid, next); } @@ -52,6 +56,7 @@ var privileges = require('./privileges'); category.topics = results.topics.topics; category.nextStart = results.topics.nextStart; category.isIgnored = results.isIgnored[0]; + category.topic_count = results.topicCount; plugins.fireHook('filter:category.get', {category: category, uid: data.uid}, next); }, diff --git a/src/categories/topics.js b/src/categories/topics.js index 8ee7105256..05b20668cf 100644 --- a/src/categories/topics.js +++ b/src/categories/topics.js @@ -53,16 +53,16 @@ module.exports = function(Categories) { }; Categories.getTopicIds = function(set, reverse, start, stop, callback) { - if (reverse) { - db.getSortedSetRevRange(set, start, stop, callback); + if (Array.isArray(set)) { + db[reverse ? 'getSortedSetRevIntersect' : 'getSortedSetIntersect']({sets: set, start: start, stop: stop}, callback); } else { - db.getSortedSetRange(set, start, stop, callback); + db[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](set, start, stop, callback); } }; Categories.getTopicIndex = function(tid, callback) { topics.getTopicField(tid, 'cid', function(err, cid) { - if(err) { + if (err) { return callback(err); } diff --git a/src/controllers/category.js b/src/controllers/category.js index 6c74519c1a..bf76c8e09f 100644 --- a/src/controllers/category.js +++ b/src/controllers/category.js @@ -20,6 +20,7 @@ categoryController.get = function(req, res, callback) { var currentPage = parseInt(req.query.page, 10) || 1; var pageCount = 1; var userPrivileges; + var settings; if ((req.params.topic_index && !utils.isNumber(req.params.topic_index)) || !utils.isNumber(cid)) { return callback(); @@ -54,7 +55,7 @@ categoryController.get = function(req, res, callback) { return helpers.redirect(res, '/category/' + results.categoryData.slug); } - var settings = results.userSettings; + settings = results.userSettings; var topicIndex = utils.isNumber(req.params.topic_index) ? parseInt(req.params.topic_index, 10) - 1 : 0; var topicCount = parseInt(results.categoryData.topic_count, 10); pageCount = Math.max(1, Math.ceil(topicCount / settings.topicsPerPage)); @@ -89,7 +90,7 @@ categoryController.get = function(req, res, callback) { var start = (currentPage - 1) * settings.topicsPerPage + topicIndex; var stop = start + settings.topicsPerPage - 1; - next(null, { + var payload = { cid: cid, set: set, reverse: reverse, @@ -97,19 +98,24 @@ categoryController.get = function(req, res, callback) { stop: stop, uid: req.uid, settings: settings - }); - }, - function (payload, next) { - user.getUidByUserslug(req.query.author, function(err, uid) { - payload.targetUid = uid; - if (uid) { - payload.set = 'cid:' + cid + ':uid:' + uid + ':tids'; + }; + + async.waterfall([ + function(next) { + user.getUidByUserslug(req.query.author, next); + }, + function(uid, next) { + payload.targetUid = uid; + if (uid) { + payload.set = 'cid:' + cid + ':uid:' + uid + ':tids'; + } + + if (req.query.tag) { + payload.set = [payload.set, 'tag:' + req.query.tag + ':topics']; + } + categories.getCategoryById(payload, next); } - next(err, payload); - }); - }, - function (payload, next) { - categories.getCategoryById(payload, next); + ], next); }, function (categoryData, next) { @@ -190,9 +196,14 @@ categoryController.get = function(req, res, callback) { } ]; + if (parseInt(req.uid, 10)) { + categories.markAsRead([cid], req.uid); + } + categoryData['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; categoryData.rssFeedUrl = nconf.get('relative_path') + '/category/' + categoryData.cid + '.rss'; categoryData.title = categoryData.name; + pageCount = Math.max(1, Math.ceil(categoryData.topic_count / settings.topicsPerPage)); categoryData.pagination = pagination.create(currentPage, pageCount, req.query); categoryData.pagination.rel.forEach(function(rel) { rel.href = nconf.get('url') + '/category/' + categoryData.slug + rel.href; diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index a8957a10dc..0b43398f4b 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -105,6 +105,10 @@ SocketCategories.loadMore = function(socket, data, callback) { set = 'cid:' + data.cid + ':uid:' + results.targetUid + ':tids'; } + if (data.tag) { + set = [set, 'tag:' + data.tag + ':topics']; + } + categories.getCategoryTopics({ cid: data.cid, set: set,