This commit is contained in:
barisusakli
2014-12-20 17:26:39 -05:00
parent 4ce6341d85
commit 984b17349a
4 changed files with 97 additions and 56 deletions

View File

@@ -85,7 +85,9 @@ module.exports = function(db, module) {
} }
value = helpers.valueToString(value); 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) { module.sortedSetsRemoveRangeByScore = function(keys, min, max, callback) {

View File

@@ -21,7 +21,7 @@ var db = require('./database'),
schemaDate, thisSchemaDate, schemaDate, thisSchemaDate,
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
latestSchema = Date.UTC(2014, 11, 12); latestSchema = Date.UTC(2014, 11, 20);
Upgrade.check = function(callback) { Upgrade.check = function(callback) {
db.get('schemaDate', function(err, value) { db.get('schemaDate', function(err, value) {
@@ -412,7 +412,43 @@ Upgrade.upgrade = function(callback) {
}); });
}); });
} else { } 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(); next();
} }
} }

View File

@@ -48,22 +48,7 @@ var async = require('async'),
}; };
Digest.getSubscribers = function(interval, callback) { Digest.getSubscribers = function(interval, callback) {
async.waterfall([ db.getSortedSetRange('digest:' + interval + ':uids', 0, -1, callback);
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);
});
}; };
Digest.send = function(data, callback) { Digest.send = function(data, callback) {

View File

@@ -9,7 +9,45 @@ var async = require('async'),
module.exports = function(User) { module.exports = function(User) {
User.getSettings = function(uid, callback) { User.getSettings = function(uid, callback) {
function onSettingsLoaded(settings) { if (!parseInt(uid, 10)) {
return onSettingsLoaded(0, {}, callback);
}
db.getObject('user:' + uid + ':settings', function(err, settings) {
if (err) {
return callback(err);
}
onSettingsLoaded(uid, settings ? settings : {}, callback);
});
};
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);
}
for (var i=0; i<settings.length; ++i) {
settings[i] = settings[i] || {};
settings[i].uid = uids[i];
}
async.map(settings, function(setting, next) {
onSettingsLoaded(setting.uid, setting, next);
}, callback);
});
};
function onSettingsLoaded(uid, settings, callback) {
plugins.fireHook('filter:user.getSettings', {uid: uid, settings: settings}, function(err, data) { plugins.fireHook('filter:user.getSettings', {uid: uid, settings: settings}, function(err, data) {
if (err) { if (err) {
return callback(err); return callback(err);
@@ -37,44 +75,6 @@ module.exports = function(User) {
}); });
} }
if (!parseInt(uid, 10)) {
return onSettingsLoaded({});
}
db.getObject('user:' + uid + ':settings', function(err, settings) {
if (err) {
return callback(err);
}
onSettingsLoaded(settings ? settings : {});
});
};
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) { User.saveSettings = function(uid, data, callback) {
if(!data.topicsPerPage || !data.postsPerPage || parseInt(data.topicsPerPage, 10) <= 0 || parseInt(data.postsPerPage, 10) <= 0) { if(!data.topicsPerPage || !data.postsPerPage || parseInt(data.topicsPerPage, 10) <= 0 || parseInt(data.postsPerPage, 10) <= 0) {
return callback(new Error('[[error:invalid-pagination-value]]')); return callback(new Error('[[error:invalid-pagination-value]]'));
@@ -103,12 +103,30 @@ module.exports = function(User) {
topicSearchEnabled: data.topicSearchEnabled topicSearchEnabled: data.topicSearchEnabled
}, next); }, next);
}, },
function(next) {
updateDigestSetting(uid, data.dailyDigestFreq, next);
},
function(next) { function(next) {
User.getSettings(uid, next); User.getSettings(uid, next);
} }
], callback); ], callback);
}; };
function updateDigestSetting(uid, dailyDigestFreq, callback) {
async.waterfall([
function(next) {
db.sortedSetsRemove(['digest:day:uids', 'digest:week:uids', 'digest:month:uids'], uid, next);
},
function(next) {
if (['day', 'week', 'month'].indexOf(dailyDigestFreq) !== -1) {
db.sortedSetAdd('digest:' + dailyDigestFreq + ':uids', Date.now(), uid, next);
} else {
next();
}
}
], callback);
}
User.setSetting = function(uid, key, value, callback) { User.setSetting = function(uid, key, value, callback) {
db.setObjectField('user:' + uid + ':settings', key, value, callback); db.setObjectField('user:' + uid + ':settings', key, value, callback);
}; };