diff --git a/server/api/controller/settings.js b/server/api/controller/settings.js index 786ca162..a377dcf2 100644 --- a/server/api/controller/settings.js +++ b/server/api/controller/settings.js @@ -8,6 +8,7 @@ const config = require('../../config') const pkg = require('../../../package.json') const generateKeyPair = promisify(crypto.generateKeyPair) const log = require('../../log') +const locales = require('../../../locales/index') let defaultHostname @@ -57,51 +58,53 @@ const settingsController = { settingsController.settings = defaultSettings return } + if (settingsController.settings.initialized) return + settingsController.settings.initialized = true + // initialize instance settings from db + // note that this is done only once when the server starts + // and not for each request const Setting = require('../models/setting') - if (!settingsController.settings.initialized) { - // initialize instance settings from db - // note that this is done only once when the server starts - // and not for each request (it's a kind of cache)! - const settings = await Setting.findAll() - settingsController.settings.initialized = true - settingsController.settings = defaultSettings - settings.forEach(s => { - if (s.is_secret) { - settingsController.secretSettings[s.key] = s.value - } else { - settingsController.settings[s.key] = s.value + const settings = await Setting.findAll() + settingsController.settings = defaultSettings + settings.forEach(s => { + if (s.is_secret) { + settingsController.secretSettings[s.key] = s.value + } else { + settingsController.settings[s.key] = s.value + } + }) + + // add pub/priv instance key if needed + if (!settingsController.settings.publicKey) { + log.info('Instance priv/pub key not found, generating....') + const { publicKey, privateKey } = await generateKeyPair('rsa', { + modulusLength: 4096, + publicKeyEncoding: { + type: 'spki', + format: 'pem' + }, + privateKeyEncoding: { + type: 'pkcs8', + format: 'pem' } }) - // add pub/priv instance key if needed - if (!settingsController.settings.publicKey) { - log.info('Instance priv/pub key not found, generating....') - const { publicKey, privateKey } = await generateKeyPair('rsa', { - modulusLength: 4096, - publicKeyEncoding: { - type: 'spki', - format: 'pem' - }, - privateKeyEncoding: { - type: 'pkcs8', - format: 'pem' - } - }) + await settingsController.set('publicKey', publicKey) + await settingsController.set('privateKey', privateKey, true) + } - await settingsController.set('publicKey', publicKey) - await settingsController.set('privateKey', privateKey, true) - } - - // initialize user_locale - if (config.user_locale && fs.existsSync(path.resolve(config.user_locale))) { - const user_locale = fs.readdirSync(path.resolve(config.user_locale)) - user_locale.forEach(async f => { - log.info(`Loading user locale ${f}`) - const locale = path.basename(f, '.js') - settingsController.user_locale[locale] = - (await require(path.resolve(config.user_locale, f))).default - }) - } + // initialize user_locale + if (config.user_locale && fs.existsSync(path.resolve(config.user_locale))) { + const user_locales_files = fs.readdirSync(path.resolve(config.user_locale)) + user_locales_files.forEach( f => { + const locale = path.basename(f ,'.json') + if (locales[locale]) { + log.info(`Adding custom locale ${locale}`) + settingsController.user_locale[locale] = require(path.resolve(config.user_locale, f)).default + } else { + log.warning(`Unknown custom user locale: ${locale} [valid locales are ${locales}]`) + } + }) } }, diff --git a/server/helpers.js b/server/helpers.js index 767d64b2..5d72055d 100644 --- a/server/helpers.js +++ b/server/helpers.js @@ -3,8 +3,6 @@ const settingsController = require('./api/controller/settings') const acceptLanguage = require('accept-language') const express = require('express') const dayjs = require('dayjs') -const timezone = require('dayjs/plugin/timezone') -dayjs.extend(timezone) const config = require('./config') const log = require('./log') @@ -64,25 +62,22 @@ module.exports = { }, async initSettings (req, res, next) { - await settingsController.load() // initialize settings - req.settings = settingsController.settings - req.secretSettings = settingsController.secretSettings + req.settings = { ...settingsController.settings } - req.settings.baseurl = config.baseurl || req.protocol + '://' + req.headers.host - req.settings.hostname = new URL.URL(req.settings.baseurl).hostname + req.settings.baseurl = config.baseurl + req.settings.hostname = config.hostname req.settings.title = req.settings.title || config.title req.settings.description = req.settings.description || config.description req.settings.version = pkg.version // select locale based on cookie and accept-language header - const acceptedLanguages = req.headers['accept-language'] acceptLanguage.languages(Object.keys(locales)) - req.settings.locale = acceptLanguage.get(acceptedLanguages) + req.acceptedLocale = acceptLanguage.get(req.headers['accept-language']) + // set locale and user locale - req.settings.user_locale = settingsController.user_locale[req.settings.locale] - dayjs.locale(req.settings.locale) - dayjs.tz.setDefault(req.settings.instance_timezone) + req.user_locale = settingsController.user_locale[req.acceptedLocale] + dayjs.locale(req.acceptedLocale) next() }, diff --git a/server/initialize.server.js b/server/initialize.server.js index 754781b0..e94d149a 100644 --- a/server/initialize.server.js +++ b/server/initialize.server.js @@ -1,7 +1,16 @@ + export default function () { - function start (nuxt) { + async function start (nuxt) { const log = require('../server/log') const config = require('../server/config') + const settingsController = require('./api/controller/settings') + const dayjs = require('dayjs') + const timezone = require('dayjs/plugin/timezone') + dayjs.extend(timezone) + + await settingsController.load() + dayjs.tz.setDefault(settingsController.settings.instance_timezone) + let TaskManager if (!config.firstrun) { TaskManager = require('../server/taskManager').TaskManager