Files
NodeBB/src/user/settings.js

172 lines
6.9 KiB
JavaScript
Raw Normal View History

'use strict';
const validator = require('validator');
2019-07-16 20:44:00 -04:00
const meta = require('../meta');
const db = require('../database');
const plugins = require('../plugins');
const notifications = require('../notifications');
const languages = require('../languages');
module.exports = function (User) {
2019-07-16 20:44:00 -04:00
User.getSettings = async function (uid) {
2018-11-12 00:20:44 -05:00
if (parseInt(uid, 10) <= 0) {
2019-07-16 20:44:00 -04:00
return await onSettingsLoaded(0, {});
}
2021-02-03 23:59:08 -07:00
let settings = await db.getObject(`user:${uid}:settings`);
2019-07-16 20:44:00 -04:00
settings = settings || {};
settings.uid = uid;
return await onSettingsLoaded(uid, settings);
};
2019-07-16 20:44:00 -04:00
User.getMultipleUserSettings = async function (uids) {
2014-04-16 17:38:34 -04:00
if (!Array.isArray(uids) || !uids.length) {
2019-07-16 20:44:00 -04:00
return [];
2014-04-16 17:38:34 -04:00
}
2021-02-03 23:59:08 -07:00
const keys = uids.map(uid => `user:${uid}:settings`);
2019-07-16 20:44:00 -04:00
let settings = await db.getObjects(keys);
2021-02-04 00:01:39 -07:00
settings = settings.map((userSettings, index) => {
2019-07-16 20:44:00 -04:00
userSettings = userSettings || {};
userSettings.uid = uids[index];
return userSettings;
});
return await Promise.all(settings.map(s => onSettingsLoaded(s.uid, s)));
2014-04-16 17:38:34 -04:00
};
2019-07-16 20:44:00 -04:00
async function onSettingsLoaded(uid, settings) {
const data = await plugins.hooks.fire('filter:user.getSettings', { uid: uid, settings: settings });
2019-07-16 20:44:00 -04:00
settings = data.settings;
const defaultTopicsPerPage = meta.config.topicsPerPage;
const defaultPostsPerPage = meta.config.postsPerPage;
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;
2021-02-04 02:07:29 -07:00
settings.topicsPerPage = Math.min(
meta.config.maxTopicsPerPage,
settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : defaultTopicsPerPage,
defaultTopicsPerPage
);
settings.postsPerPage = Math.min(
meta.config.maxPostsPerPage,
settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : defaultPostsPerPage,
defaultPostsPerPage
);
2019-07-16 20:44:00 -04:00
settings.userLang = settings.userLang || meta.config.defaultLang || 'en-GB';
settings.acpLang = settings.acpLang || settings.userLang;
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.upvoteNotifFreq = getSetting(settings, 'upvoteNotifFreq', 'all');
settings.restrictChat = parseInt(getSetting(settings, 'restrictChat', 0), 10) === 1;
settings.topicSearchEnabled = parseInt(getSetting(settings, 'topicSearchEnabled', 0), 10) === 1;
settings.updateUrlWithPostIndex = parseInt(getSetting(settings, 'updateUrlWithPostIndex', 1), 10) === 1;
settings.bootswatchSkin = validator.escape(String(settings.bootswatchSkin || ''));
settings.homePageRoute = validator.escape(String(settings.homePageRoute || '')).replace(/&#x2F;/g, '/');
2019-07-16 20:44:00 -04:00
settings.scrollToMyPost = parseInt(getSetting(settings, 'scrollToMyPost', 1), 10) === 1;
settings.categoryWatchState = getSetting(settings, 'categoryWatchState', 'notwatching');
const notificationTypes = await notifications.getAllNotificationTypes();
2021-02-04 00:01:39 -07:00
notificationTypes.forEach((notificationType) => {
2019-07-16 20:44:00 -04:00
settings[notificationType] = getSetting(settings, notificationType, 'notification');
});
return settings;
2014-12-20 17:26:39 -05:00
}
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
}
2019-07-16 20:44:00 -04:00
User.saveSettings = async function (uid, data) {
2019-09-15 02:14:51 -04:00
const maxPostsPerPage = meta.config.maxPostsPerPage || 20;
2021-02-04 02:07:29 -07:00
if (
!data.postsPerPage ||
parseInt(data.postsPerPage, 10) <= 1 ||
parseInt(data.postsPerPage, 10) > maxPostsPerPage
) {
2021-02-03 23:59:08 -07:00
throw new Error(`[[error:invalid-pagination-value, 2, ${maxPostsPerPage}]]`);
2016-02-23 13:34:16 +02:00
}
2019-07-16 20:44:00 -04:00
const maxTopicsPerPage = meta.config.maxTopicsPerPage || 20;
2021-02-04 02:07:29 -07:00
if (
!data.topicsPerPage ||
parseInt(data.topicsPerPage, 10) <= 1 ||
parseInt(data.topicsPerPage, 10) > maxTopicsPerPage
) {
2021-02-03 23:59:08 -07:00
throw new Error(`[[error:invalid-pagination-value, 2, ${maxTopicsPerPage}]]`);
}
const languageCodes = await languages.listCodes();
if (data.userLang && !languageCodes.includes(data.userLang)) {
throw new Error('[[error:invalid-language]]');
}
if (data.acpLang && !languageCodes.includes(data.acpLang)) {
throw new Error('[[error:invalid-language]]');
}
data.userLang = data.userLang || meta.config.defaultLang;
2014-03-18 14:11:26 -04:00
plugins.hooks.fire('action:user.saveSettings', { uid: uid, settings: data });
2014-12-19 17:19:29 -05:00
2019-07-16 20:44:00 -04:00
const settings = {
2015-09-14 16:20:56 -04:00
showemail: data.showemail,
showfullname: data.showfullname,
openOutgoingLinksInNewTab: data.openOutgoingLinksInNewTab,
dailyDigestFreq: data.dailyDigestFreq || 'off',
usePagination: data.usePagination,
2017-10-12 13:03:43 -04:00
topicsPerPage: Math.min(data.topicsPerPage, parseInt(maxTopicsPerPage, 10) || 20),
postsPerPage: Math.min(data.postsPerPage, parseInt(maxPostsPerPage, 10) || 20),
2015-09-14 16:20:56 -04:00
userLang: data.userLang || meta.config.defaultLang,
2018-02-12 17:12:18 -05:00
acpLang: data.acpLang || meta.config.defaultLang,
2015-09-14 16:20:56 -04:00
followTopicsOnCreate: data.followTopicsOnCreate,
followTopicsOnReply: data.followTopicsOnReply,
restrictChat: data.restrictChat,
topicSearchEnabled: data.topicSearchEnabled,
updateUrlWithPostIndex: data.updateUrlWithPostIndex,
2017-02-18 01:27:46 -07:00
homePageRoute: ((data.homePageRoute === 'custom' ? data.homePageCustom : data.homePageRoute) || '').replace(/^\//, ''),
2016-08-29 12:43:32 +03:00
scrollToMyPost: data.scrollToMyPost,
upvoteNotifFreq: data.upvoteNotifFreq,
bootswatchSkin: data.bootswatchSkin,
categoryWatchState: data.categoryWatchState,
categoryTopicSort: data.categoryTopicSort,
topicPostSort: data.topicPostSort,
2015-09-14 16:20:56 -04:00
};
2019-07-16 20:44:00 -04:00
const notificationTypes = await notifications.getAllNotificationTypes();
2021-02-04 00:01:39 -07:00
notificationTypes.forEach((notificationType) => {
2019-07-16 20:44:00 -04:00
if (data[notificationType]) {
settings[notificationType] = data[notificationType];
}
});
const result = await plugins.hooks.fire('filter:user.saveSettings', { uid: uid, settings: settings, data: data });
2021-02-03 23:59:08 -07:00
await db.setObject(`user:${uid}:settings`, result.settings);
2019-07-16 20:44:00 -04:00
await User.updateDigestSetting(uid, data.dailyDigestFreq);
return await User.getSettings(uid);
};
2019-07-16 20:44:00 -04:00
User.updateDigestSetting = async function (uid, dailyDigestFreq) {
await db.sortedSetsRemove(['digest:day:uids', 'digest:week:uids', 'digest:month:uids'], uid);
if (['day', 'week', 'month'].includes(dailyDigestFreq)) {
2021-02-03 23:59:08 -07:00
await db.sortedSetAdd(`digest:${dailyDigestFreq}:uids`, Date.now(), uid);
2019-07-16 20:44:00 -04:00
}
2016-09-20 17:46:32 +03:00
};
2014-12-20 17:26:39 -05:00
2019-07-16 20:44:00 -04:00
User.setSetting = async function (uid, key, value) {
2018-11-12 00:20:44 -05:00
if (parseInt(uid, 10) <= 0) {
2019-07-16 20:44:00 -04:00
return;
2016-12-02 17:05:46 +03:00
}
2021-02-03 23:59:08 -07:00
await db.setObjectField(`user:${uid}:settings`, key, value);
};
2014-04-10 20:31:57 +01:00
};