feat: allow for caching of specific config versions

fix: cached settings access
This commit is contained in:
Sérgio Salgado 2022-10-18 17:18:08 +01:00
parent c003cc81f8
commit e919a54c87

View file

@ -55,30 +55,64 @@ 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 (!versionId && !!needsSettingsReload[operatorId]) {
logger.debug('Fetching and caching a new latest config value, as a reload was requested')
return newSettingsLoader.loadLatest()
.then(settings => {
settingsCache.set(operatorId, settings)
settingsCache.set(`${operatorId}-latest`, settings)
delete needsSettingsReload[operatorId]
req.settings = settings
})
.then(() => next())
.catch(next)
}
if (!versionId && operatorSettings) {
logger.debug('Fetching the latest config value from cache')
req.settings = operatorSettings
return next()
}
if (!versionId && !operatorSettings) {
logger.debug('Fetching the latest config version because there\'s no cached value')
return newSettingsLoader.loadLatest()
.then(settings => {
settingsCache.set(`${operatorId}-latest`, settings)
req.settings = settings
})
.then(() => next())
.catch(next)
}
} catch (e) {
logger.error(e)
}
newSettingsLoader.load(versionId)
.then(settings => { req.settings = settings })
.then(() => next())
.catch(next)
}
module.exports = populateSettings