From afcd2348e0cf809533fa99878acd542170f611a5 Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Thu, 5 Mar 2026 16:42:08 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20perf:=20cache=20banners=20with=20Re?= =?UTF-8?q?dis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/redis/key.ts | 7 +++++++ .../services/getActiveHeroBanner.service.ts | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/config/redis/key.ts diff --git a/src/config/redis/key.ts b/src/config/redis/key.ts new file mode 100644 index 0000000..52ad1c9 --- /dev/null +++ b/src/config/redis/key.ts @@ -0,0 +1,7 @@ +export const redisKey = [ + { + name: "HERO_BANNER", + description: "Key for caching active hero banner data", + key: `${process.env.APP_NAME}:system:banner`, + }, +]; diff --git a/src/modules/heroBanner/services/getActiveHeroBanner.service.ts b/src/modules/heroBanner/services/getActiveHeroBanner.service.ts index 475c210..47ec2cf 100644 --- a/src/modules/heroBanner/services/getActiveHeroBanner.service.ts +++ b/src/modules/heroBanner/services/getActiveHeroBanner.service.ts @@ -1,10 +1,13 @@ +import { redisKey } from "../../../config/redis/key"; import { AppError } from "../../../helpers/error/instances/app"; import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; +import { redis } from "../../../utils/databases/redis/connection"; import { findSystemPreferenceService } from "../../systemPreference/services/internal/findSystemPreference.service"; import { findAllActiveHeroBannerRepository } from "../repositories/GET/findAllActiveHeroBanner.repository"; export const getActiveHeroBannerService = async () => { try { + // Check if Hero Banner is enabled in system preferences const isHeroBannerEnabled = await findSystemPreferenceService( "HERO_BANNER_ENABLED", "boolean", @@ -12,7 +15,19 @@ export const getActiveHeroBannerService = async () => { if (!isHeroBannerEnabled) throw new AppError(403, "Hero Banner is disabled"); - return await findAllActiveHeroBannerRepository(); + // Try to get active banners from Redis cache + const cachedBanners = await redis.get( + `${redisKey.filter((key) => key.name === "HERO_BANNER")[0].key}`, + ); + if (cachedBanners) return JSON.parse(cachedBanners); + + // If not in cache, fetch from database and cache the result + const activeBanners = await findAllActiveHeroBannerRepository(); + await redis.set( + `${redisKey.filter((key) => key.name === "HERO_BANNER")[0].key}`, + JSON.stringify(activeBanners), + ); + return activeBanners; } catch (error) { ErrorForwarder(error); }