diff --git a/src/notifications.js b/src/notifications.js index 5d10686212..dc3aae7ea2 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -18,9 +18,7 @@ var async = require('async'), (function(Notifications) { Notifications.init = function() { - if (process.env.NODE_ENV === 'development') { - winston.verbose('[notifications.init] Registering jobs.'); - } + winston.verbose('[notifications.init] Registering jobs.'); new cron('*/30 * * * *', Notifications.prune, null, true); }; diff --git a/src/user/jobs.js b/src/user/jobs.js index 506f0d388b..16f6bd4ce8 100644 --- a/src/user/jobs.js +++ b/src/user/jobs.js @@ -4,7 +4,6 @@ var winston = require('winston'), cronJob = require('cron').CronJob, - user = require('../user'), meta = require('../meta'); module.exports = function(User) { @@ -23,6 +22,8 @@ module.exports = function(User) { winston.verbose('[user.startJobs] Digest job (monthly) started.'); User.digest.execute('month'); }, null, true); + + new cronJob('0 0 0 * * *', User.reset.clean, null, true); }; }; diff --git a/src/user/reset.js b/src/user/reset.js index e49c077180..3ce2f86cf8 100644 --- a/src/user/reset.js +++ b/src/user/reset.js @@ -2,6 +2,7 @@ var async = require('async'), nconf = require('nconf'), + winston = require('winston'), user = require('../user'), utils = require('../../public/src/utils'), @@ -13,7 +14,6 @@ var async = require('async'), emailer = require('../emailer'); (function(UserReset) { - UserReset.validate = function(code, callback) { db.getObjectField('reset:uid', code, function(err, uid) { if (err || !uid) { @@ -86,4 +86,20 @@ var async = require('async'), }); }; + UserReset.clean = function(callback) { + // Locate all codes that have expired, and remove them from the set/hash + async.waterfall([ + async.apply(db.getSortedSetRangeByScore, 'reset:issueDate', 0, -1, -1, +new Date()-(1000*60*120)), + function(tokens, next) { + if (!tokens.length) { return next(); } + + winston.verbose('[UserReset.clean] Removing ' + tokens.length + ' reset tokens from database'); + async.parallel([ + async.apply(db.deleteObjectField, 'reset:uid', tokens), + async.apply(db.sortedSetRemove, 'reset:issueDate', tokens) + ], next); + } + ], callback); + }; + }(exports));