From a6b2c77bd15717bec18bd3cb98ab11bff2892231 Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Tue, 3 Mar 2026 21:25:59 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=94=20feat:=20add=20option=20to=20disa?= =?UTF-8?q?ble=20banner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/dbml/schema.dbml | 2 +- .../migration.sql | 8 +++++ prisma/schema.prisma | 2 +- prisma/seed/index.ts | 2 ++ prisma/seed/systemPreference.seed.ts | 35 +++++++++++++++++++ .../services/getActiveHeroBanner.service.ts | 5 +++ 6 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 prisma/migrations/20260303101939_make_system_preference_id_unique/migration.sql create mode 100644 prisma/seed/systemPreference.seed.ts diff --git a/prisma/dbml/schema.dbml b/prisma/dbml/schema.dbml index c2ea06e..05bab02 100644 --- a/prisma/dbml/schema.dbml +++ b/prisma/dbml/schema.dbml @@ -513,7 +513,7 @@ Table hero_banner { Table system_preferences { id String [pk] - key String [not null] + key String [unique, not null] value String [not null] description String [not null] deletedAt DateTime diff --git a/prisma/migrations/20260303101939_make_system_preference_id_unique/migration.sql b/prisma/migrations/20260303101939_make_system_preference_id_unique/migration.sql new file mode 100644 index 0000000..f9cb54e --- /dev/null +++ b/prisma/migrations/20260303101939_make_system_preference_id_unique/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[key]` on the table `system_preferences` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "system_preferences_key_key" ON "system_preferences"("key"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 06d52de..a19bb18 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -575,7 +575,7 @@ model HeroBanner { model SystemPreference { id String @id @db.Uuid - key String @db.VarChar(225) + key String @db.VarChar(225) @unique value String @db.VarChar(225) description String @db.Text deletedAt DateTime? diff --git a/prisma/seed/index.ts b/prisma/seed/index.ts index 7478bfb..cebe591 100644 --- a/prisma/seed/index.ts +++ b/prisma/seed/index.ts @@ -1,4 +1,5 @@ import { prisma } from "../../src/utils/databases/prisma/connection"; +import { systemPreferenceSeed } from "./systemPreference.seed"; import { userRoleSeed } from "./userRole.seed"; import { userSystemSeed } from "./userSystem.seed"; @@ -8,6 +9,7 @@ async function main() { const userSystemSeedResult = await userSystemSeed(); await userRoleSeed(userSystemSeedResult.id); + await systemPreferenceSeed(); console.log("🌳 All seeds completed"); } diff --git a/prisma/seed/systemPreference.seed.ts b/prisma/seed/systemPreference.seed.ts new file mode 100644 index 0000000..b7038bb --- /dev/null +++ b/prisma/seed/systemPreference.seed.ts @@ -0,0 +1,35 @@ +import { Prisma } from "@prisma/client"; +import { generateUUIDv7 } from "../../src/helpers/databases/uuidv7"; +import { prisma } from "../../src/utils/databases/prisma/connection"; + +export const systemPreferenceSeed = async () => { + const preferences: Prisma.SystemPreferenceUpsertArgs["create"][] = [ + { + id: generateUUIDv7(), + key: "REGISTRATION_ENABLED", + value: process.env.ENABLE_REGISTRATION === "true" ? "true" : "false", + description: "Enable or disable user registration", + }, + { + id: generateUUIDv7(), + key: "HERO_BANNER_ENABLED", + value: process.env.ENABLE_HERO_BANNER === "true" ? "true" : "false", + description: "Enable or disable hero banner feature", + }, + ]; + + await prisma.$transaction(async (tx) => { + return await Promise.all( + preferences.map( + async (pref) => + await tx.systemPreference.upsert({ + where: { + key: pref.key, + }, + update: pref, + create: pref, + }), + ), + ); + }); +}; diff --git a/src/modules/heroBanner/services/getActiveHeroBanner.service.ts b/src/modules/heroBanner/services/getActiveHeroBanner.service.ts index b6093c9..135a7c6 100644 --- a/src/modules/heroBanner/services/getActiveHeroBanner.service.ts +++ b/src/modules/heroBanner/services/getActiveHeroBanner.service.ts @@ -1,8 +1,13 @@ +import { AppError } from "../../../helpers/error/instances/app"; import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; import { findAllActiveHeroBannerRepository } from "../repositories/GET/findAllActiveHeroBanner.repository"; export const getActiveHeroBannerService = async () => { try { + const isHeroBannerEnabled = process.env.ENABLE_HERO_BANNER === "true"; + if (!isHeroBannerEnabled) + throw new AppError(403, "Hero Banner is disabled"); + return await findAllActiveHeroBannerRepository(); } catch (error) { ErrorForwarder(error);