diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index 6c0ece91df..6acbcc7354 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -149,7 +149,7 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT var postcount = $('.user_postcount_' + data.posts[i].uid); postcount.html(parseInt(postcount.html(), 10) + 1); } - socket.emit('topics.markAsRead', tid); + socket.emit('topics.markAsRead', [tid]); createNewPosts(data); } diff --git a/public/src/forum/unread.js b/public/src/forum/unread.js index f8e1a9be63..a3e3bb1b10 100644 --- a/public/src/forum/unread.js +++ b/public/src/forum/unread.js @@ -25,7 +25,7 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll'], if(!tids.length) { return; } - socket.emit('topics.markTidsRead', tids, function(err) { + socket.emit('topics.markAsRead', tids, function(err) { if(err) { return app.alertError(err.message); } diff --git a/src/categories.js b/src/categories.js index aaf732151b..315f6e8c4f 100644 --- a/src/categories.js +++ b/src/categories.js @@ -74,7 +74,7 @@ var db = require('./database'), var category = categories[0]; if (parseInt(uid, 10)) { - Categories.markAsRead(cid, uid); + Categories.markAsRead([cid], uid); } async.parallel({ @@ -250,8 +250,14 @@ var db = require('./database'), }); }; - Categories.markAsRead = function(cid, uid, callback) { - db.setAdd('cid:' + cid + ':read_by_uid', uid, callback); + Categories.markAsRead = function(cids, uid, callback) { + if (!Array.isArray(cids) || !cids.length) { + return callback(); + } + var keys = cids.map(function(cid) { + return 'cid:' + cid + ':read_by_uid'; + }); + db.setsAdd(keys, uid, callback); }; Categories.markAsUnreadForAll = function(cid, callback) { diff --git a/src/database/level/sets.js b/src/database/level/sets.js index df10f4a632..525477db7d 100644 --- a/src/database/level/sets.js +++ b/src/database/level/sets.js @@ -19,6 +19,10 @@ module.exports = function(db, module) { }); }; + module.setsAdd = function(keys, value, callback) { + throw new Error('not-implemented'); + }; + module.setRemove = function(key, value, callback) { module.getListRange(key, 0, -1, function(err, set) { module.set(key, set.splice(set.indexOf(value), 1), callback); diff --git a/src/database/mongo/sets.js b/src/database/mongo/sets.js index 927337fbff..d247a1f945 100644 --- a/src/database/mongo/sets.js +++ b/src/database/mongo/sets.js @@ -31,6 +31,31 @@ module.exports = function(db, module) { }); }; + module.setsAdd = function(keys, value, callback) { + callback = callback || helpers.noop; + if(!Array.isArray(value)) { + value = [value]; + } + + value.forEach(function(element, index, array) { + array[index] = helpers.valueToString(element); + }); + + var bulk = db.collection('objects').initializeUnorderedBulkOp(); + + for(var i=0; i