Implemented a merge utility function for object updates in database.js to handle array merging correctly, enhancing cache update logic for improved data integrity.
All checks were successful
farmcontrol/farmcontrol-api/pipeline/head This commit looks good

This commit is contained in:
Tom Butcher 2026-07-26 15:00:37 +01:00
parent c710f46a6f
commit 8423db2858

View File

@ -37,6 +37,13 @@ cacheLogger.level = config.server.logLevel;
const CACHE_TTL_SECONDS = parseInt(config.database.redis.cacheTtl || '30', 10); const CACHE_TTL_SECONDS = parseInt(config.database.redis.cacheTtl || '30', 10);
const mergeObjectUpdates = (target, source) =>
_.mergeWith(target, source, (objValue, srcValue) => {
if (Array.isArray(objValue) || Array.isArray(srcValue)) {
return srcValue;
}
});
export const retrieveObjectCache = async ({ model, id, populate = [] }) => { export const retrieveObjectCache = async ({ model, id, populate = [] }) => {
if (!model || !id) return undefined; if (!model || !id) return undefined;
@ -79,13 +86,13 @@ export const updateObjectCache = async ({ model, id, object, populate = [] }) =>
for (const key of matchingKeys) { for (const key of matchingKeys) {
logger.trace('Updating object cache:', key); logger.trace('Updating object cache:', key);
const cachedObject = (await redisServer.getKey(key)) || {}; const cachedObject = (await redisServer.getKey(key)) || {};
const mergedObject = _.merge(cachedObject, object); const mergedObject = mergeObjectUpdates(cachedObject, object);
await redisServer.setKey(key, mergedObject, CACHE_TTL_SECONDS); await redisServer.setKey(key, mergedObject, CACHE_TTL_SECONDS);
mergedObjects.push(mergedObject); mergedObjects.push(mergedObject);
} }
const cacheObject = (await redisServer.getKey(cacheKey)) || {}; const cacheObject = (await redisServer.getKey(cacheKey)) || {};
const mergedObject = _.merge(cacheObject, object); const mergedObject = mergeObjectUpdates(cacheObject, object);
await redisServer.setKey(cacheKey, mergedObject, CACHE_TTL_SECONDS); await redisServer.setKey(cacheKey, mergedObject, CACHE_TTL_SECONDS);
cacheLogger.trace('Updated object cache:', { cacheLogger.trace('Updated object cache:', {