From 02ad14d38244584641bd04c1a542f17557cccd2c Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Tue, 3 Mar 2026 21:47:07 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20add=20helper=20to=20detect?= =?UTF-8?q?=20system=20preference?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/systemPreference/index.tsx | 12 +++++ .../internal/findSystemPreference.service.ts | 47 +++++++++++++++++++ .../findSystemPreference.repository.ts | 15 ++++++ 3 files changed, 74 insertions(+) create mode 100644 src/modules/systemPreference/index.tsx create mode 100644 src/modules/systemPreference/services/internal/findSystemPreference.service.ts create mode 100644 src/modules/systemPreference/services/repositories/findSystemPreference.repository.ts diff --git a/src/modules/systemPreference/index.tsx b/src/modules/systemPreference/index.tsx new file mode 100644 index 0000000..b153922 --- /dev/null +++ b/src/modules/systemPreference/index.tsx @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..6ba278e --- /dev/null +++ b/src/modules/systemPreference/services/internal/findSystemPreference.service.ts @@ -0,0 +1,47 @@ +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 new file mode 100644 index 0000000..6023cab --- /dev/null +++ b/src/modules/systemPreference/services/repositories/findSystemPreference.repository.ts @@ -0,0 +1,15 @@ +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); + } +};