'use strict'; var async = require('async'), meta = require('../meta'), db = require('../database'), plugins = require('../plugins'); module.exports = function(User) { User.getSettings = function(uid, callback) { 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 meta.config.postsPerPage) { return callback(new Error('[[error:invalid-pagination-value, 2, ' + meta.config.postsPerPage + ']]')); } if (!data.topicsPerPage || parseInt(data.topicsPerPage, 10) <= 1 || parseInt(data.topicsPerPage, 10) > meta.config.topicsPerPage) { return callback(new Error('[[error:invalid-pagination-value, 2, ' + meta.config.topicsPerPage + ']]')); } data.userLang = data.userLang || meta.config.defaultLang; plugins.fireHook('action:user.saveSettings', {uid: uid, settings: data}); var settings = { showemail: data.showemail, showfullname: data.showfullname, openOutgoingLinksInNewTab: data.openOutgoingLinksInNewTab, dailyDigestFreq: data.dailyDigestFreq || 'off', usePagination: data.usePagination, topicsPerPage: Math.min(data.topicsPerPage, parseInt(meta.config.topicsPerPage, 10) || 20), postsPerPage: Math.min(data.postsPerPage, parseInt(meta.config.postsPerPage, 10) || 20), notificationSounds: data.notificationSounds, userLang: data.userLang || meta.config.defaultLang, followTopicsOnCreate: data.followTopicsOnCreate, followTopicsOnReply: data.followTopicsOnReply, sendChatNotifications: data.sendChatNotifications, sendPostNotifications: data.sendPostNotifications, restrictChat: data.restrictChat, topicSearchEnabled: data.topicSearchEnabled, groupTitle: data.groupTitle, homePageRoute: data.homePageCustom || data.homePageRoute, scrollToMyPost: data.scrollToMyPost }; if (data.bootswatchSkin) { settings.bootswatchSkin = data.bootswatchSkin; } async.waterfall([ function(next) { db.setObject('user:' + uid + ':settings', settings, next); }, function(next) { updateDigestSetting(uid, data.dailyDigestFreq, next); }, function(next) { User.getSettings(uid, next); } ], 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) { db.setObjectField('user:' + uid + ':settings', key, value, callback); }; User.setGroupTitle = function(groupName, uid, callback) { if (groupName === 'registered-users') { return callback(); } db.getObjectField('user:' + uid + ':settings', 'groupTitle', function(err, currentTitle) { if (err || (currentTitle || currentTitle === '')) { return callback(err); } User.setSetting(uid, 'groupTitle', groupName, callback); }); }; };