diff --git a/prisma/dbml/schema.dbml b/prisma/dbml/schema.dbml index 524cbfe..5cede02 100644 --- a/prisma/dbml/schema.dbml +++ b/prisma/dbml/schema.dbml @@ -257,6 +257,7 @@ Table users { create_languages languages [not null] user_create_email email_system_accounts [not null] user_emails email_system_histories [not null] + user_hero_banner hero_banner [not null] sys_notifications system_notifications [not null] sys_logs system_logs [not null] } @@ -492,6 +493,22 @@ Table email_system_histories { updatedAt DateTime [default: `now()`, not null] } +Table hero_banner { + id String [pk] + isClickable Boolean [not null, default: false] + title String + description String + buttonContent String + buttonLink String + imageUrl String + startDate DateTime [not null] + endDate DateTime [not null] + createdAt DateTime [default: `now()`, not null] + updatedAt DateTime [default: `now()`, not null] + creatorId String [not null] + createdBy users [not null] +} + Table system_preferences { id String [pk] key String [not null] @@ -761,6 +778,8 @@ Ref: email_system_accounts.createdBy > users.id Ref: email_system_histories.userRelated > users.id +Ref: hero_banner.creatorId > users.id + Ref: system_notifications.createdBy > users.id Ref: system_logs.relatedUser > users.id \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index d907814..5e1d9ba 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -564,7 +564,7 @@ model HeroBanner { imageUrl String? @db.Text startDate DateTime endDate DateTime - createdAt DateTime @default(now()) + createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt creatorId String @db.Uuid createdBy User @relation("UserHeroBanner", fields: [creatorId], references: [id]) diff --git a/src/modules/internal/controllers/createHeroBanner.controller.ts b/src/modules/internal/controllers/createHeroBanner.controller.ts new file mode 100644 index 0000000..9e8b18f --- /dev/null +++ b/src/modules/internal/controllers/createHeroBanner.controller.ts @@ -0,0 +1,24 @@ +import { Context } from "elysia"; +import { mainErrorHandler } from "../../../helpers/error/handler"; +import { createHeroBannerService } from "../services/http/createHeroBanner.service"; + +export interface CreateHeroBannerRequestBody { + isClickable?: boolean; + title?: string; + description?: string; + buttonContent?: string; + buttonLink?: string; + imageUrl?: string; + startDate: string; + endDate: string; +} + +export const createHeroBannerController = async ( + ctx: Context & { body: CreateHeroBannerRequestBody }, +) => { + try { + return await createHeroBannerService(ctx.body); + } catch (error) { + return mainErrorHandler(ctx.set, error); + } +}; diff --git a/src/modules/internal/index.ts b/src/modules/internal/index.ts index 4e9b58c..e7291ed 100644 --- a/src/modules/internal/index.ts +++ b/src/modules/internal/index.ts @@ -5,6 +5,7 @@ import { createVideoServiceInternalController } from "./controllers/createVideoS import { bulkInsertVideoController } from "./controllers/bulkInsertVideo.controller"; import { updateAllEpisodeThumbnailController } from "./controllers/updateAllEpisodeThumbnail.controller"; import { purgeUnusedSessionController } from "./controllers/purgeUnusedSession.controller"; +import { createHeroBannerController } from "./controllers/createHeroBanner.controller"; export const internalModule = new Elysia({ prefix: "/internal" }) .post("/media/bulk-insert", bulkInsertMediaController) @@ -12,4 +13,5 @@ export const internalModule = new Elysia({ prefix: "/internal" }) .put("/episode/update-thumbnails", updateAllEpisodeThumbnailController) .post("/video/bulk-insert", bulkInsertVideoController) .post("/video-service", createVideoServiceInternalController) - .post("/user-session/purge-unused", purgeUnusedSessionController); + .post("/user-session/purge-unused", purgeUnusedSessionController) + .post("/hero-banner", createHeroBannerController); diff --git a/src/modules/internal/repositories/insertHeroBanner.repository.ts b/src/modules/internal/repositories/insertHeroBanner.repository.ts new file mode 100644 index 0000000..c6b7d35 --- /dev/null +++ b/src/modules/internal/repositories/insertHeroBanner.repository.ts @@ -0,0 +1,21 @@ +import { Prisma } from "@prisma/client"; +import { AppError } from "../../../helpers/error/instances/app"; +import { prisma } from "../../../utils/databases/prisma/connection"; +import { generateUUIDv7 } from "../../../helpers/databases/uuidv7"; +import { SystemAccountId } from "../../../config/account/system"; + +export const insertHeroBannerRepository = async ( + payload: Omit, +) => { + try { + return await prisma.heroBanner.create({ + data: { + id: generateUUIDv7(), + creatorId: SystemAccountId, + ...payload, + }, + }); + } catch (error) { + throw new AppError(500, "Failed to insert hero banner", error); + } +}; diff --git a/src/modules/internal/services/http/createHeroBanner.service.ts b/src/modules/internal/services/http/createHeroBanner.service.ts new file mode 100644 index 0000000..d1a8f2a --- /dev/null +++ b/src/modules/internal/services/http/createHeroBanner.service.ts @@ -0,0 +1,13 @@ +import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; +import { CreateHeroBannerRequestBody } from "../../controllers/createHeroBanner.controller"; +import { insertHeroBannerRepository } from "../../repositories/insertHeroBanner.repository"; + +export const createHeroBannerService = async ( + payload: CreateHeroBannerRequestBody, +) => { + try { + return await insertHeroBannerRepository(payload); + } catch (error) { + ErrorForwarder(error); + } +};