diff --git a/src/routes/debug.js b/src/routes/debug.js index c49dfc7c2b..ca7a13b665 100644 --- a/src/routes/debug.js +++ b/src/routes/debug.js @@ -54,7 +54,6 @@ module.exports = function(app, middleware, controllers) { }); app.get('/test', function(req, res) { - user.sendDailyDigests(); res.send(200); }); }); diff --git a/src/user/jobs.js b/src/user/jobs.js index 520075281c..c2e88e752f 100644 --- a/src/user/jobs.js +++ b/src/user/jobs.js @@ -34,10 +34,28 @@ module.exports = function(User) { }, function(err, data) { var now = new Date(); - User.getMultipleUserFields(data.uids, ['uid', 'username', 'lastonline'], function(err, receipients) { + async.parallel({ + recipients: function(next) { + User.getMultipleUserFields(data.uids, ['uid', 'username', 'lastonline'], next); + }, + userSettings: function(next) { + User.getMultipleUserSettings(data.uids, next); + } + }, function(err, users) { + var recipients = users.recipients, + userSettings = users.userSettings, + subscribed; + + // Find uids subscribed to daily digest emails + subscribed = userSettings.filter(function(setting) { + return !setting.dailyDigestFreq || setting.dailyDigestFreq === 'daily'; + }).map(function(setting) { + return setting.uid; + }); + // Find only those users who have not been online in the past 24 hours - var users = receipients.filter(function(userObj) { - return yesterday > parseInt(userObj.lastonline, 10); + var users = recipients.filter(function(userObj) { + return subscribed.indexOf(userObj.uid) !== -1 && yesterday > parseInt(userObj.lastonline, 10); }); // Consider using eachLimit, but *only* if people complain about email relays choking -- otherwise we're ok. diff --git a/src/user/settings.js b/src/user/settings.js index 6dd9b6817e..781b1934f5 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -25,7 +25,7 @@ module.exports = function(User) { settings = data.settings; settings.showemail = settings.showemail ? parseInt(settings.showemail, 10) !== 0 : false; - settings.enableDailyDigest = settings.enableDailyDigest || 'daily'; + settings.dailyDigestFreq = settings.dailyDigestFreq || 'daily'; settings.usePagination = settings.usePagination ? parseInt(settings.usePagination, 10) === 1 : parseInt(meta.config.usePagination, 10) === 1; settings.topicsPerPage = settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : parseInt(meta.config.topicsPerPage, 10) || 20; settings.postsPerPage = settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : parseInt(meta.config.postsPerPage, 10) || 10; @@ -36,6 +36,31 @@ module.exports = function(User) { }); }; + User.getMultipleUserSettings = function(uids, callback) { + if (!Array.isArray(uids) || !uids.length) { + return callback(null, []); + } + + var keys = uids.map(function(uid) { + return 'user:' + uid + ':settings'; + }); + + db.getObjects(keys, function(err, settings) { + if (err) { + return callback(err); + } + + // Associate uid + settings = settings.map(function(setting, idx) { + setting = setting || {}; + setting.uid = uids[idx]; + return setting; + }); + + callback(null, settings); + }); + }; + User.saveSettings = function(uid, data, callback) { if(!data.topicsPerPage || !data.postsPerPage || parseInt(data.topicsPerPage, 10) <= 0 || parseInt(data.postsPerPage, 10) <= 0) { @@ -47,7 +72,7 @@ module.exports = function(User) { plugins.fireHook('action:user.saveSettings', {uid: uid, settings: data}); db.setObject('user:' + uid + ':settings', { showemail: data.showemail, - enableDailyDigest: data.enableDailyDigest || 'daily', + dailyDigestFreq: data.dailyDigestFreq || 'daily', usePagination: data.usePagination, topicsPerPage: data.topicsPerPage, postsPerPage: data.postsPerPage,