diff --git a/src/modules/internal/repositories/insertHeroBanner.repository.ts b/src/modules/internal/repositories/insertHeroBanner.repository.ts index c6b7d35..6d93541 100644 --- a/src/modules/internal/repositories/insertHeroBanner.repository.ts +++ b/src/modules/internal/repositories/insertHeroBanner.repository.ts @@ -1,12 +1,12 @@ -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"; +import { Static } from "elysia"; +import { createHeroBannerSchema } from "../schemas/createHeroBanner.schema"; +import { Prisma } from "@prisma/client"; -export const insertHeroBannerRepository = async ( - payload: Omit, -) => { +export const insertHeroBannerRepository = async (payload: Static) => { try { return await prisma.heroBanner.create({ data: { @@ -16,6 +16,9 @@ export const insertHeroBannerRepository = async ( }, }); } catch (error) { + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2002") { + throw new AppError(400, "A hero banner with the order priority already exists", error); + } throw new AppError(500, "Failed to insert hero banner", error); } }; diff --git a/src/modules/internal/schemas/createHeroBanner.schema.ts b/src/modules/internal/schemas/createHeroBanner.schema.ts index 376bd2a..d9c9363 100644 --- a/src/modules/internal/schemas/createHeroBanner.schema.ts +++ b/src/modules/internal/schemas/createHeroBanner.schema.ts @@ -3,45 +3,18 @@ import { AppRouteSchema } from "../../../helpers/types/AppRouteSchema"; export const createHeroBannerSchema = { body: t.Object({ - isClickable: t.Optional( - t.Boolean({ - description: "Indicates whether the hero banner is clickable", - }), - ), - title: t.Optional( - t.String({ - description: "The title of the hero banner", - }), - ), - tags: t.Array(t.String(), { - description: "An array of tags associated with the hero banner", - }), - description: t.Optional( - t.String({ - description: "A brief description of the hero banner", - }), - ), - buttonContent: t.Optional( - t.String({ - description: "The text content of the button on the hero banner", - }), - ), - buttonLink: t.Optional( - t.String({ - description: "The URL that the button on the hero banner links to", - }), + orderPriority: t.Optional( + t.Number({ description: "The priority order of the hero banner. Lower numbers indicate higher priority." }), ), + mediaId: t.String({ description: "The ID of the media associated with the hero banner" }), imageUrl: t.Optional( t.String({ - description: "The URL of the image used in the hero banner", + description: + "The URL of the image used in the hero banner. If not provided, a thumbnail image of the media will be used.", }), ), - startDate: t.String({ - description: "The start date for the hero banner in ISO 8601 format", - }), - endDate: t.String({ - description: "The end date for the hero banner in ISO 8601 format", - }), + startDate: t.Date({ description: "The start date for the hero banner in ISO 8601 format" }), + endDate: t.Date({ description: "The end date for the hero banner in ISO 8601 format" }), }), detail: { summary: "Create a new hero banner", @@ -64,17 +37,16 @@ export const createHeroBannerSchema = { "The created hero banner object. This field is returned only if the environment is running in development mode.", properties: { id: { type: "string", description: "The ID of the created hero banner" }, - isClickable: { type: "boolean", description: "Indicates whether the hero banner is clickable" }, - title: { type: "string", description: "The title of the hero banner" }, - tags: { - type: "array", - items: { type: "string" }, - description: "An array of tags associated with the hero banner", + orderPriority: { + type: "number", + description: "The priority order of the hero banner. Lower numbers indicate higher priority.", + }, + mediaId: { type: "string", description: "The ID of the media associated with the hero banner" }, + imageUrl: { + type: "string", + description: + "The URL of the image used in the hero banner. If not provided, a thumbnail image of the media will be used.", }, - description: { type: "string", description: "A brief description of the hero banner" }, - buttonContent: { type: "string", description: "The text content of the button on the hero banner" }, - buttonLink: { type: "string", description: "The URL that the button on the hero banner links to" }, - imageUrl: { type: "string", description: "The URL of the image used in the hero banner" }, startDate: { type: "string", format: "date-time", diff --git a/src/modules/internal/services/http/createHeroBanner.service.ts b/src/modules/internal/services/http/createHeroBanner.service.ts index d1a8f2a..045d284 100644 --- a/src/modules/internal/services/http/createHeroBanner.service.ts +++ b/src/modules/internal/services/http/createHeroBanner.service.ts @@ -1,10 +1,9 @@ +import { Static } from "elysia"; import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; -import { CreateHeroBannerRequestBody } from "../../controllers/createHeroBanner.controller"; import { insertHeroBannerRepository } from "../../repositories/insertHeroBanner.repository"; +import { createHeroBannerSchema } from "../../schemas/createHeroBanner.schema"; -export const createHeroBannerService = async ( - payload: CreateHeroBannerRequestBody, -) => { +export const createHeroBannerService = async (payload: Static) => { try { return await insertHeroBannerRepository(payload); } catch (error) {