diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index c3290faad2..2031155b78 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -85,7 +85,9 @@ module.exports = function(db, module) { } value = helpers.valueToString(value); - db.collection('objects').remove({_key: {$in: keys}, value: value}, callback); + db.collection('objects').remove({_key: {$in: keys}, value: value}, function(err, res) { + callback(err); + }); }; module.sortedSetsRemoveRangeByScore = function(keys, min, max, callback) { diff --git a/src/upgrade.js b/src/upgrade.js index 9e13e78c39..3139366941 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -21,7 +21,7 @@ var db = require('./database'), schemaDate, thisSchemaDate, // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema - latestSchema = Date.UTC(2014, 11, 12); + latestSchema = Date.UTC(2014, 11, 20); Upgrade.check = function(callback) { db.get('schemaDate', function(err, value) { @@ -412,7 +412,43 @@ Upgrade.upgrade = function(callback) { }); }); } else { - winston.info('[2014/12/12] Updating teasers skipped skipped'); + winston.info('[2014/12/12] Updating teasers skipped'); + next(); + } + }, + function(next) { + thisSchemaDate = Date.UTC(2014, 11, 20); + if (schemaDate < thisSchemaDate) { + winston.info('[2014/12/20] Updating digest settings'); + + async.waterfall([ + async.apply(db.getSortedSetRange, 'users:joindate', 0, -1), + async.apply(User.getMultipleUserSettings) + ], function(err, userSettings) { + if (err) { + winston.error('[2014/12/20] Error encountered while updating digest settings'); + return next(err); + } + + var now = Date.now(); + + async.eachLimit(userSettings, 50, function(setting, next) { + if (setting.dailyDigestFreq !== 'off') { + db.sortedSetAdd('digest:' + setting.dailyDigestFreq + ':uids', now, setting.uid, next); + } else { + next(); + } + }, function(err) { + if (err) { + winston.error('[2014/12/20] Error encountered while updating digest settings'); + return next(err); + } + winston.info('[2014/12/20] Updating digest settings done'); + Upgrade.update(thisSchemaDate, next); + }); + }); + } else { + winston.info('[2014/12/20] Updating digest settings skipped'); next(); } } diff --git a/src/user/digest.js b/src/user/digest.js index a5d8f4d8e8..62c8a11ae8 100644 --- a/src/user/digest.js +++ b/src/user/digest.js @@ -48,22 +48,7 @@ var async = require('async'), }; Digest.getSubscribers = function(interval, callback) { - async.waterfall([ - async.apply(db.getSortedSetRange, 'users:joindate', 0, -1), - async.apply(user.getMultipleUserSettings) - ], function(err, userSettings) { - if (err) { - return callback(err); - } - - var subscribed = userSettings.filter(function(setting) { - return setting.dailyDigestFreq === interval; - }).map(function(setting) { - return setting.uid; - }); - - callback(null, subscribed); - }); + db.getSortedSetRange('digest:' + interval + ':uids', 0, -1, callback); }; Digest.send = function(data, callback) { diff --git a/src/user/settings.js b/src/user/settings.js index 3bda78c315..87b6b713ee 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -9,36 +9,8 @@ var async = require('async'), module.exports = function(User) { User.getSettings = function(uid, callback) { - function onSettingsLoaded(settings) { - plugins.fireHook('filter:user.getSettings', {uid: uid, settings: settings}, function(err, data) { - if (err) { - return callback(err); - } - - settings = data.settings; - - settings.showemail = parseInt(settings.showemail, 10) === 1; - settings.showfullname = parseInt(settings.showfullname, 10) === 1; - settings.openOutgoingLinksInNewTab = parseInt(settings.openOutgoingLinksInNewTab, 10) === 1; - settings.dailyDigestFreq = settings.dailyDigestFreq || 'off'; - settings.usePagination = (settings.usePagination === null || settings.usePagination === undefined) ? parseInt(meta.config.usePagination, 10) === 1 : parseInt(settings.usePagination, 10) === 1; - settings.topicsPerPage = Math.min(settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : parseInt(meta.config.topicsPerPage, 10) || 20, 20); - settings.postsPerPage = Math.min(settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : parseInt(meta.config.postsPerPage, 10) || 10, 20); - settings.notificationSounds = parseInt(settings.notificationSounds, 10) === 1; - settings.language = settings.language || meta.config.defaultLang || 'en_GB'; - settings.topicPostSort = settings.topicPostSort || meta.config.topicPostSort || 'oldest_to_newest'; - settings.followTopicsOnCreate = (settings.followTopicsOnCreate === null || settings.followTopicsOnCreate === undefined) ? true : parseInt(settings.followTopicsOnCreate, 10) === 1; - settings.followTopicsOnReply = parseInt(settings.followTopicsOnReply, 10) === 1; - settings.sendChatNotifications = parseInt(settings.sendChatNotifications, 10) === 1; - settings.restrictChat = parseInt(settings.restrictChat, 10) === 1; - settings.topicSearchEnabled = parseInt(settings.topicSearchEnabled, 10) === 1; - - callback(null, settings); - }); - } - if (!parseInt(uid, 10)) { - return onSettingsLoaded({}); + return onSettingsLoaded(0, {}, callback); } db.getObject('user:' + uid + ':settings', function(err, settings) { @@ -46,7 +18,7 @@ module.exports = function(User) { return callback(err); } - onSettingsLoaded(settings ? settings : {}); + onSettingsLoaded(uid, settings ? settings : {}, callback); }); }; @@ -64,17 +36,45 @@ module.exports = function(User) { return callback(err); } - // Associate uid - settings = settings.map(function(setting, idx) { - setting = setting || {}; - setting.uid = uids[idx]; - return setting; - }); + for (var i=0; i