all files / src/user/ settings.js

58.02% Statements 47/81
35.94% Branches 23/64
38.89% Functions 7/18
58.02% Lines 47/81
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166          29×       29× 29×       29×                                                       29× 29×       29×   29× 29×   29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29× 29×   29×       464× 461×     461×                                                                                                                                            
 
'use strict';
 
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) {
		Iif (!parseInt(uid, 10)) {
			return onSettingsLoaded(0, {}, callback);
		}
 
		db.getObject('user:' + uid + ':settings', function(err, settings) {
			Iif (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) {
			Iif (err) {
				return callback(err);
			}
 
			settings = data.settings;
 
			var defaultTopicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20;
			var defaultPostsPerPage = parseInt(meta.config.postsPerPage, 10) || 20;
 
			settings.showemail = parseInt(getSetting(settings, 'showemail', 0), 10) === 1;
			settings.showfullname = parseInt(getSetting(settings, 'showfullname', 0), 10) === 1;
			settings.openOutgoingLinksInNewTab = parseInt(getSetting(settings, 'openOutgoingLinksInNewTab', 0), 10) === 1;
			settings.dailyDigestFreq = getSetting(settings, 'dailyDigestFreq', 'off');
			settings.usePagination = parseInt(getSetting(settings, 'usePagination', 0), 10) === 1;
			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.notificationSounds = parseInt(getSetting(settings, 'notificationSounds', 0), 10) === 1;
			settings.userLang = settings.userLang || meta.config.defaultLang || 'en_GB';
			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;
			settings.restrictChat = parseInt(getSetting(settings, 'restrictChat', 0), 10) === 1;
			settings.topicSearchEnabled = parseInt(getSetting(settings, 'topicSearchEnabled', 0), 10) === 1;
			settings.delayImageLoading = parseInt(getSetting(settings, 'delayImageLoading', 1), 10) === 1;
			settings.bootswatchSkin = settings.bootswatchSkin || 'default';
			settings.scrollToMyPost = parseInt(getSetting(settings, 'scrollToMyPost', 1), 10) === 1;
 
			callback(null, settings);
		});
	}
 
	function getSetting(settings, key, defaultValue) {
		if (settings[key] || settings[key] === 0) {
			return settings[key];
		} else Iif (meta.config[key] || meta.config[key] === 0) {
			return meta.config[key];
		}
		return defaultValue;
	}
 
	User.saveSettings = function(uid, data, callback) {
		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;
 
		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,
			delayImageLoading: data.delayImageLoading,
			groupTitle: data.groupTitle,
			homePageRoute: (data.homePageCustom || data.homePageRoute || '').replace(/^\//, ''),
			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);
	};
};