Files
NodeBB/src/user/settings.js

166 lines
6.2 KiB
JavaScript
Raw Normal View History

'use strict';
2016-04-14 18:44:44 +03:00
var async = require('async');
var meta = require('../meta');
var db = require('../database');
var plugins = require('../plugins');
module.exports = function (User) {
User.getSettings = function (uid, callback) {
if (!parseInt(uid, 10)) {
2014-12-20 17:26:39 -05:00
return onSettingsLoaded(0, {}, callback);
}
db.getObject('user:' + uid + ':settings', function (err, settings) {
if (err) {
return callback(err);
}
2014-12-20 17:26:39 -05:00
onSettingsLoaded(uid, settings ? settings : {}, callback);
});
};
User.getMultipleUserSettings = function (uids, callback) {
2014-04-16 17:38:34 -04:00
if (!Array.isArray(uids) || !uids.length) {
return callback(null, []);
}
var keys = uids.map(function (uid) {
2014-04-16 17:38:34 -04:00
return 'user:' + uid + ':settings';
});
db.getObjects(keys, function (err, settings) {
2014-04-16 17:38:34 -04:00
if (err) {
return callback(err);
}
2016-10-13 11:42:29 +02:00
for (var i = 0; i < settings.length; ++i) {
2014-12-20 17:26:39 -05:00
settings[i] = settings[i] || {};
settings[i].uid = uids[i];
}
2014-04-16 17:38:34 -04:00
async.map(settings, function (setting, next) {
2014-12-20 17:26:39 -05:00
onSettingsLoaded(setting.uid, setting, next);
}, callback);
2014-04-16 17:38:34 -04:00
});
};
2014-12-20 17:26:39 -05:00
function onSettingsLoaded(uid, settings, callback) {
plugins.fireHook('filter:user.getSettings', {uid: uid, settings: settings}, function (err, data) {
2014-12-20 17:26:39 -05:00
if (err) {
return callback(err);
}
settings = data.settings;
2015-04-10 15:40:23 -04:00
var defaultTopicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20;
var defaultPostsPerPage = parseInt(meta.config.postsPerPage, 10) || 20;
2016-02-25 11:41:28 +02:00
settings.showemail = parseInt(getSetting(settings, 'showemail', 0), 10) === 1;
settings.showfullname = parseInt(getSetting(settings, 'showfullname', 0), 10) === 1;
2015-09-11 12:51:10 -04:00
settings.openOutgoingLinksInNewTab = parseInt(getSetting(settings, 'openOutgoingLinksInNewTab', 0), 10) === 1;
settings.dailyDigestFreq = getSetting(settings, 'dailyDigestFreq', 'off');
settings.usePagination = parseInt(getSetting(settings, 'usePagination', 0), 10) === 1;
2015-04-10 15:40:23 -04:00
settings.topicsPerPage = Math.min(settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : defaultTopicsPerPage, defaultTopicsPerPage);
settings.postsPerPage = Math.min(settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : defaultPostsPerPage, defaultPostsPerPage);
settings.userLang = settings.userLang || meta.config.defaultLang || 'en_GB';
2015-09-11 12:51:10 -04:00
settings.topicPostSort = getSetting(settings, 'topicPostSort', 'oldest_to_newest');
settings.categoryTopicSort = getSetting(settings, 'categoryTopicSort', 'newest_to_oldest');
settings.followTopicsOnCreate = parseInt(getSetting(settings, 'followTopicsOnCreate', 1), 10) === 1;
settings.followTopicsOnReply = parseInt(getSetting(settings, 'followTopicsOnReply', 0), 10) === 1;
settings.sendChatNotifications = parseInt(getSetting(settings, 'sendChatNotifications', 0), 10) === 1;
settings.sendPostNotifications = parseInt(getSetting(settings, 'sendPostNotifications', 0), 10) === 1;
2016-02-25 11:41:28 +02:00
settings.restrictChat = parseInt(getSetting(settings, 'restrictChat', 0), 10) === 1;
2015-09-11 12:51:10 -04:00
settings.topicSearchEnabled = parseInt(getSetting(settings, 'topicSearchEnabled', 0), 10) === 1;
2016-04-07 11:32:18 -04:00
settings.delayImageLoading = parseInt(getSetting(settings, 'delayImageLoading', 1), 10) === 1;
2015-08-17 15:55:09 -04:00
settings.bootswatchSkin = settings.bootswatchSkin || 'default';
2016-03-24 12:53:44 +02:00
settings.scrollToMyPost = parseInt(getSetting(settings, 'scrollToMyPost', 1), 10) === 1;
2014-12-20 17:26:39 -05:00
callback(null, settings);
});
}
function getSetting(settings, key, defaultValue) {
2015-09-11 12:51:10 -04:00
if (settings[key] || settings[key] === 0) {
return settings[key];
} else if (meta.config[key] || meta.config[key] === 0) {
return meta.config[key];
}
return defaultValue;
2015-09-11 12:51:10 -04:00
}
User.saveSettings = function (uid, data, callback) {
2016-02-23 13:34:16 +02:00
if (!data.postsPerPage || parseInt(data.postsPerPage, 10) <= 1 || parseInt(data.postsPerPage, 10) > 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;
2014-03-18 14:11:26 -04:00
2014-04-16 16:47:51 -04:00
plugins.fireHook('action:user.saveSettings', {uid: uid, settings: data});
2014-12-19 17:19:29 -05:00
2015-09-14 16:20:56 -04:00
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),
userLang: data.userLang || meta.config.defaultLang,
followTopicsOnCreate: data.followTopicsOnCreate,
followTopicsOnReply: data.followTopicsOnReply,
sendChatNotifications: data.sendChatNotifications,
sendPostNotifications: data.sendPostNotifications,
restrictChat: data.restrictChat,
topicSearchEnabled: data.topicSearchEnabled,
2016-04-07 11:32:18 -04:00
delayImageLoading: data.delayImageLoading,
2016-08-05 16:45:46 +03:00
homePageRoute : ((data.homePageRoute === 'custom' ? data.homePageCustom : data.homePageRoute) || '').replace(/^\//, ''),
2016-08-29 12:43:32 +03:00
scrollToMyPost: data.scrollToMyPost,
notificationSound: data.notificationSound,
incomingChatSound: data.incomingChatSound,
outgoingChatSound: data.outgoingChatSound
2015-09-14 16:20:56 -04:00
};
if (data.bootswatchSkin) {
settings.bootswatchSkin = data.bootswatchSkin;
}
2014-12-19 17:19:29 -05:00
async.waterfall([
function (next) {
2015-09-14 16:20:56 -04:00
db.setObject('user:' + uid + ':settings', settings, next);
2014-12-19 17:19:29 -05:00
},
function (next) {
2016-09-20 17:46:32 +03:00
User.updateDigestSetting(uid, data.dailyDigestFreq, next);
2014-12-20 17:26:39 -05:00
},
function (next) {
2014-12-19 17:19:29 -05:00
User.getSettings(uid, next);
}
], callback);
};
User.updateDigestSetting = function (uid, dailyDigestFreq, callback) {
2014-12-20 17:26:39 -05:00
async.waterfall([
function (next) {
2014-12-20 17:26:39 -05:00
db.sortedSetsRemove(['digest:day:uids', 'digest:week:uids', 'digest:month:uids'], uid, next);
},
function (next) {
2014-12-20 17:26:39 -05:00
if (['day', 'week', 'month'].indexOf(dailyDigestFreq) !== -1) {
db.sortedSetAdd('digest:' + dailyDigestFreq + ':uids', Date.now(), uid, next);
} else {
next();
}
}
], callback);
2016-09-20 17:46:32 +03:00
};
2014-12-20 17:26:39 -05:00
User.setSetting = function (uid, key, value, callback) {
db.setObjectField('user:' + uid + ':settings', key, value, callback);
};
2014-04-10 20:31:57 +01:00
};