diff --git a/lib/middlewares/populateSettings.js b/lib/middlewares/populateSettings.js index ae4893bd..5f36fa69 100644 --- a/lib/middlewares/populateSettings.js +++ b/lib/middlewares/populateSettings.js @@ -55,30 +55,54 @@ const populateSettings = function (req, res, next) { } try { - const operatorSettings = settingsCache.get(operatorId) - if (!versionId && (!operatorSettings || !!needsSettingsReload[operatorId])) { + // Priority of configs to retrieve + // 1. Machine is in the middle of a transaction and has the config-version header set, fetch that config from cache or database, depending on whether it exists in cache + // 2. The operator settings changed, so we must update the cache + // 3. There's a cached config, send the cached value + // 4. There's no cached config, cache and send the latest config + + if (versionId) { + const cachedVersionedSettings = settingsCache.get(`${operatorId}-v${versionId}`) + + if (!cachedVersionedSettings) { + logger.debug('Fetching a specific config version cached value') + return newSettingsLoader.load(versionId) + .then(settings => { + settingsCache.set(`${operatorId}-v${versionId}`, settings) + req.settings = settings + }) + .then(() => next()) + .catch(next) + } + + logger.debug('Fetching and caching a specific config version') + req.settings = cachedVersionedSettings + return next() + } + + const operatorSettings = settingsCache.get(`${operatorId}-latest`) + + if (!!needsSettingsReload[operatorId] || !operatorSettings) { + !!needsSettingsReload[operatorId] + ? logger.debug('Fetching and caching a new latest config value, as a reload was requested') + : logger.debug('Fetching the latest config version because there\'s no cached value') + return newSettingsLoader.loadLatest() .then(settings => { - settingsCache.set(operatorId, settings) - delete needsSettingsReload[operatorId] + settingsCache.set(`${operatorId}-latest`, settings) + if (!!needsSettingsReload[operatorId]) delete needsSettingsReload[operatorId] req.settings = settings }) .then(() => next()) .catch(next) } - - if (!versionId && operatorSettings) { - req.settings = operatorSettings - return next() - } + + logger.debug('Fetching the latest config value from cache') + req.settings = operatorSettings + return next() } catch (e) { logger.error(e) } - - newSettingsLoader.load(versionId) - .then(settings => { req.settings = settings }) - .then(() => next()) - .catch(next) } module.exports = populateSettings