IO-3166-Global-Notifications-Part-2 - Checkpoint
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
const applyIOHelpers = ({ app, api, io, logger }) => {
|
||||
const getBodyshopRoom = (bodyshopID) => `bodyshop-broadcast-room:${bodyshopID}`;
|
||||
// Global Bodyshop Room
|
||||
const getBodyshopRoom = (bodyshopId) => `bodyshop-broadcast-room:${bodyshopId}`;
|
||||
|
||||
// Messaging - conversation specific room to handle detailed messages when the user has a conversation open.
|
||||
const getBodyshopConversationRoom = ({bodyshopId, conversationId}) =>
|
||||
const getBodyshopConversationRoom = ({ bodyshopId, conversationId }) =>
|
||||
`bodyshop-conversation-room:${bodyshopId}:${conversationId}`;
|
||||
|
||||
const ioHelpersAPI = {
|
||||
|
||||
@@ -1,3 +1,39 @@
|
||||
const { GET_BODYSHOP_BY_ID } = require("../graphql-client/queries");
|
||||
const client = require("../graphql-client/graphql-client").client;
|
||||
|
||||
const BODYSHOP_CACHE_TTL = 3600; // 1 hour
|
||||
|
||||
/**
|
||||
* Generate a cache key for a bodyshop
|
||||
* @param bodyshopId
|
||||
* @returns {`bodyshop-cache:${string}`}
|
||||
*/
|
||||
const getBodyshopCacheKey = (bodyshopId) => `bodyshop-cache:${bodyshopId}`;
|
||||
|
||||
/**
|
||||
* Fetch bodyshop data from the database
|
||||
* @param bodyshopId
|
||||
* @param logger
|
||||
* @returns {Promise<*>}
|
||||
*/
|
||||
const fetchBodyshopFromDB = async (bodyshopId, logger) => {
|
||||
try {
|
||||
const response = await client.request(GET_BODYSHOP_BY_ID, { id: bodyshopId });
|
||||
const bodyshop = response.bodyshops_by_pk;
|
||||
if (!bodyshop) {
|
||||
throw new Error(`Bodyshop with ID ${bodyshopId} not found`);
|
||||
}
|
||||
return bodyshop; // Return the full object as-is
|
||||
} catch (error) {
|
||||
logger.log("fetch-bodyshop-from-db", "ERROR", "redis", null, {
|
||||
bodyshopId,
|
||||
error: error?.message,
|
||||
stack: error?.stack
|
||||
});
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Apply Redis helper functions
|
||||
* @param pubClient
|
||||
@@ -234,6 +270,71 @@ const applyRedisHelpers = ({ pubClient, app, logger }) => {
|
||||
}
|
||||
};
|
||||
|
||||
// Get bodyshop data from Redis or fetch from DB if missing
|
||||
const getBodyshopFromRedis = async (bodyshopId) => {
|
||||
const key = getBodyshopCacheKey(bodyshopId);
|
||||
try {
|
||||
// Check if data exists in Redis
|
||||
const cachedData = await pubClient.get(key);
|
||||
if (cachedData) {
|
||||
return JSON.parse(cachedData); // Parse and return the full object
|
||||
}
|
||||
|
||||
// Cache miss: fetch from DB
|
||||
const bodyshopData = await fetchBodyshopFromDB(bodyshopId, logger);
|
||||
|
||||
// Store in Redis as a single JSON string
|
||||
const jsonData = JSON.stringify(bodyshopData);
|
||||
await pubClient.set(key, jsonData);
|
||||
await pubClient.expire(key, BODYSHOP_CACHE_TTL);
|
||||
|
||||
logger.log("bodyshop-cache-miss", "DEBUG", "redis", null, {
|
||||
bodyshopId,
|
||||
action: "Fetched from DB and cached"
|
||||
});
|
||||
|
||||
return bodyshopData; // Return the full object
|
||||
} catch (error) {
|
||||
logger.log("get-bodyshop-from-redis", "ERROR", "redis", null, {
|
||||
bodyshopId,
|
||||
error: error.message
|
||||
});
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
// Update or invalidate bodyshop data in Redis
|
||||
const updateOrInvalidateBodyshopFromRedis = async (bodyshopId, values = null) => {
|
||||
const key = getBodyshopCacheKey(bodyshopId);
|
||||
try {
|
||||
if (!values) {
|
||||
// Invalidate cache by deleting the key
|
||||
await pubClient.del(key);
|
||||
logger.log("bodyshop-cache-invalidate", "DEBUG", "api", "redis", {
|
||||
bodyshopId,
|
||||
action: "Cache invalidated"
|
||||
});
|
||||
} else {
|
||||
// Update cache with the full provided values
|
||||
const jsonData = JSON.stringify(values);
|
||||
await pubClient.set(key, jsonData);
|
||||
await pubClient.expire(key, BODYSHOP_CACHE_TTL);
|
||||
logger.log("bodyshop-cache-update", "DEBUG", "api", "redis", {
|
||||
bodyshopId,
|
||||
action: "Cache updated",
|
||||
values
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
logger.log("update-or-invalidate-bodyshop-from-redis", "ERROR", "api", "redis", {
|
||||
bodyshopId,
|
||||
values,
|
||||
error: error.message
|
||||
});
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
const api = {
|
||||
setSessionData,
|
||||
getSessionData,
|
||||
@@ -251,7 +352,9 @@ const applyRedisHelpers = ({ pubClient, app, logger }) => {
|
||||
removeUserSocketMapping,
|
||||
getUserSocketMappingByBodyshop,
|
||||
getUserSocketMapping,
|
||||
refreshUserSocketTTL
|
||||
refreshUserSocketTTL,
|
||||
getBodyshopFromRedis,
|
||||
updateOrInvalidateBodyshopFromRedis
|
||||
};
|
||||
|
||||
Object.assign(module.exports, api);
|
||||
|
||||
Reference in New Issue
Block a user