From e92d99662172c99efe9b3f6503b4ac240794c48c Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Fri, 29 May 2026 14:07:40 +0700 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20update=20hero?= =?UTF-8?q?=20banner=20code=20for=20new=20schema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GET/findAllActiveHeroBanner.repository.ts | 57 ------------------- .../showHeroBannerToHomePage.repository.ts | 43 ++++++++++++++ .../services/getActiveHeroBanner.service.ts | 38 ++----------- src/modules/systemPreference/index.tsx | 12 ---- .../internal/findSystemPreference.service.ts | 47 --------------- .../findSystemPreference.repository.ts | 15 ----- 6 files changed, 47 insertions(+), 165 deletions(-) delete mode 100644 src/modules/heroBanner/repositories/GET/findAllActiveHeroBanner.repository.ts create mode 100644 src/modules/heroBanner/repositories/READ/showHeroBannerToHomePage.repository.ts delete mode 100644 src/modules/systemPreference/index.tsx delete mode 100644 src/modules/systemPreference/services/internal/findSystemPreference.service.ts delete mode 100644 src/modules/systemPreference/services/repositories/findSystemPreference.repository.ts diff --git a/src/modules/heroBanner/repositories/GET/findAllActiveHeroBanner.repository.ts b/src/modules/heroBanner/repositories/GET/findAllActiveHeroBanner.repository.ts deleted file mode 100644 index cb6cfb9..0000000 --- a/src/modules/heroBanner/repositories/GET/findAllActiveHeroBanner.repository.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { AppError } from "../../../../helpers/error/instances/app"; -import { prisma } from "../../../../utils/databases/prisma/connection"; - -export const findAllActiveHeroBannerRepository = async (userId?: string) => { - try { - return await prisma.heroBanner.findMany({ - where: { - startDate: { - lte: new Date(), - }, - endDate: { - gte: new Date(), - }, - }, - orderBy: [ - { - orderPriority: "asc", - }, - { - startDate: "asc", - }, - ], - select: { - orderPriority: true, - imageUrl: true, - media: { - select: { - id: true, - title: true, - slug: true, - pictureLarge: true, - synopsis: true, - genres: { - select: { - slug: true, - name: true, - }, - }, - _count: { - select: { - inCollections: { - where: { - collection: { - ownerId: userId, - }, - }, - }, - }, - }, - }, - }, - }, - }); - } catch (error) { - throw new AppError(500, "Failed to fetch active hero banners", error); - } -}; diff --git a/src/modules/heroBanner/repositories/READ/showHeroBannerToHomePage.repository.ts b/src/modules/heroBanner/repositories/READ/showHeroBannerToHomePage.repository.ts new file mode 100644 index 0000000..548a44e --- /dev/null +++ b/src/modules/heroBanner/repositories/READ/showHeroBannerToHomePage.repository.ts @@ -0,0 +1,43 @@ +import { AppError } from "../../../../helpers/error/instances/app"; +import { prisma } from "../../../../utils/databases/prisma/connection"; + +export const showHeroBannerToHomePageRepository = async () => { + try { + return await prisma.homeMediaBanner.findMany({ + where: { + start_show: { + lte: new Date(), + }, + end_show: { + gte: new Date(), + }, + }, + orderBy: { + priority: "asc", + created_at: "desc", + }, + select: { + id: true, + media: { + select: { + title: true, + synopsis: true, + large_image_url: true, + genres: { + select: { + genre: { + select: { + name: true, + slug: true, + }, + }, + }, + }, + }, + }, + }, + }); + } catch (error) { + throw new AppError(500, "Error fetching hero banner data", error); + } +}; diff --git a/src/modules/heroBanner/services/getActiveHeroBanner.service.ts b/src/modules/heroBanner/services/getActiveHeroBanner.service.ts index 047d57a..7e7a2c3 100644 --- a/src/modules/heroBanner/services/getActiveHeroBanner.service.ts +++ b/src/modules/heroBanner/services/getActiveHeroBanner.service.ts @@ -1,44 +1,14 @@ import { AppError } from "../../../helpers/error/instances/app"; import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; -import { tokenValidationService } from "../../auth/services/http/tokenValidation.service"; -import { findSystemPreferenceService } from "../../systemPreference/services/internal/findSystemPreference.service"; -import { findAllActiveHeroBannerRepository } from "../repositories/GET/findAllActiveHeroBanner.repository"; +import { showHeroBannerToHomePageRepository } from "../repositories/READ/showHeroBannerToHomePage.repository"; export const getActiveHeroBannerService = async ({ cookie }: { cookie?: string }) => { try { - const userId = cookie ? (await tokenValidationService(cookie)).user.id : undefined; + const isHeroBannerEnabled = process.env.ENABLE_HERO_BANNER === "true"; - // Check if Hero Banner is enabled in system preferences - const isHeroBannerEnabled = await findSystemPreferenceService("HERO_BANNER_ENABLED", "boolean"); - if (!isHeroBannerEnabled) throw new AppError(403, "Hero Banner is disabled"); + if (!isHeroBannerEnabled) throw new AppError(403, "Hero banner feature is disabled"); - // Don’t implement caching just yet; implement collection caching first, then implement banner caching. - // Please note that currently, a database query is still required to check the collections. - // // 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(userId); - const constructedBanners = activeBanners.map((banner) => ({ - id: banner.media.id, - title: banner.media.title, - slug: banner.media.slug, - imageUrl: banner.imageUrl || banner.media.pictureLarge, - synopsis: banner.media.synopsis, - genres: banner.media.genres.map((genre) => ({ - slug: genre.slug, - name: genre.name, - })), - isInCollection: banner.media._count.inCollections > 0, - })); - - // await redis.set( - // `${redisKey.filter((key) => key.name === "HERO_BANNER")[0].key}`, - // JSON.stringify(constructedBanners), - // ); - - return constructedBanners; + return await showHeroBannerToHomePageRepository(); } catch (error) { ErrorForwarder(error); } diff --git a/src/modules/systemPreference/index.tsx b/src/modules/systemPreference/index.tsx deleted file mode 100644 index b153922..0000000 --- a/src/modules/systemPreference/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import Elysia, { Context } from "elysia"; -import { returnWriteResponse } from "../../helpers/callback/httpResponse"; - -export const systemPreferenceModule = new Elysia({ - prefix: "/system-preference", -}).get("/", (ctx: Context) => { - return returnWriteResponse( - ctx.set, - 200, - "System Preference module is up and running", - ); -}); diff --git a/src/modules/systemPreference/services/internal/findSystemPreference.service.ts b/src/modules/systemPreference/services/internal/findSystemPreference.service.ts deleted file mode 100644 index 6ba278e..0000000 --- a/src/modules/systemPreference/services/internal/findSystemPreference.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { AppError } from "../../../../helpers/error/instances/app"; -import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; -import { redis } from "../../../../utils/databases/redis/connection"; -import { findSystemPreferenceRepository } from "../repositories/findSystemPreference.repository"; - -export const findSystemPreferenceService = async ( - key: string, - type: "boolean" | "string" | "number" = "string", -) => { - try { - // First, check if the system preference is exists in redis cache - const cachedValue = await redis.get( - `${process.env.APP_NAME}:configs:${key}`, - ); - - if (!cachedValue) { - // If not exists in cache, fetch from database. If found, return the value and set it to cache, if not found, throw an error - const systemPreference = await findSystemPreferenceRepository(key); - if (!systemPreference) - throw new AppError(404, "System preference not found"); - - // and set it to cache for future requests - await redis.set( - `${process.env.APP_NAME}:configs:${key}`, - systemPreference.value, - ); - - // Return the value from database - return parseValue(systemPreference.value, type); - } else { - return parseValue(cachedValue, type); - } - } catch (error) { - ErrorForwarder(error, 500, "Failed to find system preference"); - } -}; - -const parseValue = (value: string, type: "boolean" | "string" | "number") => { - switch (type) { - case "boolean": - return value === "true"; - case "number": - return Number(value); - default: - return value; - } -}; diff --git a/src/modules/systemPreference/services/repositories/findSystemPreference.repository.ts b/src/modules/systemPreference/services/repositories/findSystemPreference.repository.ts deleted file mode 100644 index 6023cab..0000000 --- a/src/modules/systemPreference/services/repositories/findSystemPreference.repository.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AppError } from "../../../../helpers/error/instances/app"; -import { prisma } from "../../../../utils/databases/prisma/connection"; - -export const findSystemPreferenceRepository = async (key: string) => { - try { - return await prisma.systemPreference.findUnique({ - where: { - key, - deletedAt: null, - }, - }); - } catch (error) { - throw new AppError(500, "Failed to find system preference", error); - } -};