'use strict'; var db = require('../database'), async = require('async'), winston = require('winston'), cronJob = require('cron').CronJob, nconf = require('nconf'), user = require('../user'), topics = require('../topics'), emailer = require('../emailer'), meta = require('../meta'); module.exports = function(User) { User.startJobs = function() { winston.info('[user.startJobs] Registering User Jobs'); new cronJob('0 0 17 * * *', function() { User.sendDailyDigests(); }, null, true); }; User.sendDailyDigests = function() { async.parallel({ recent: function(next) { topics.getLatestTopics(0, 0, 10, 'day', next); }, uids: function(next) { db.getSortedSetRange('users:joindate', 0, -1, next); } }, function(err, data) { if (err) { return winston.error('[user/jobs] Could not send daily digests: ' + err.message); } User.getMultipleUserSettings(data.uids, function(err, userSettings) { if (err) { return winston.error('[user/jobs] Could not send daily digests: ' + err.message); } var subscribed = userSettings.filter(function(setting) { return setting.dailyDigestFreq === 'daily'; }).map(function(setting) { return setting.uid; }); sendEmails(subscribed, data.recent.topics); }); }); }; function sendEmails(uids, recentTopics) { var now = new Date(); User.getMultipleUserFields(uids, ['uid', 'username', 'lastonline'], function(err, users) { if (err) { return winston.error('[user/jobs] Could not send daily digests: ' + err.message); } // Consider using eachLimit, but *only* if people complain about email relays choking -- otherwise we're ok. async.eachLimit(users, 100, function(userObj, next) { user.notifications.getDailyUnread(userObj.uid, function(err, notifications) { if (err) { winston.error('[user/jobs] Could not send daily digests: ' + err.message); return next(err); } // Turn relative URLs into absolute ones for(var i=0; i