feat: add internal endpoint to create banner

This commit is contained in:
2026-03-02 22:09:33 +07:00
parent 90655dcf92
commit 960493f414
6 changed files with 81 additions and 2 deletions

View File

@ -257,6 +257,7 @@ Table users {
create_languages languages [not null] create_languages languages [not null]
user_create_email email_system_accounts [not null] user_create_email email_system_accounts [not null]
user_emails email_system_histories [not null] user_emails email_system_histories [not null]
user_hero_banner hero_banner [not null]
sys_notifications system_notifications [not null] sys_notifications system_notifications [not null]
sys_logs system_logs [not null] sys_logs system_logs [not null]
} }
@ -492,6 +493,22 @@ Table email_system_histories {
updatedAt DateTime [default: `now()`, not null] 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 { Table system_preferences {
id String [pk] id String [pk]
key String [not null] key String [not null]
@ -761,6 +778,8 @@ Ref: email_system_accounts.createdBy > users.id
Ref: email_system_histories.userRelated > users.id Ref: email_system_histories.userRelated > users.id
Ref: hero_banner.creatorId > users.id
Ref: system_notifications.createdBy > users.id Ref: system_notifications.createdBy > users.id
Ref: system_logs.relatedUser > users.id Ref: system_logs.relatedUser > users.id

View File

@ -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);
}
};

View File

@ -5,6 +5,7 @@ import { createVideoServiceInternalController } from "./controllers/createVideoS
import { bulkInsertVideoController } from "./controllers/bulkInsertVideo.controller"; import { bulkInsertVideoController } from "./controllers/bulkInsertVideo.controller";
import { updateAllEpisodeThumbnailController } from "./controllers/updateAllEpisodeThumbnail.controller"; import { updateAllEpisodeThumbnailController } from "./controllers/updateAllEpisodeThumbnail.controller";
import { purgeUnusedSessionController } from "./controllers/purgeUnusedSession.controller"; import { purgeUnusedSessionController } from "./controllers/purgeUnusedSession.controller";
import { createHeroBannerController } from "./controllers/createHeroBanner.controller";
export const internalModule = new Elysia({ prefix: "/internal" }) export const internalModule = new Elysia({ prefix: "/internal" })
.post("/media/bulk-insert", bulkInsertMediaController) .post("/media/bulk-insert", bulkInsertMediaController)
@ -12,4 +13,5 @@ export const internalModule = new Elysia({ prefix: "/internal" })
.put("/episode/update-thumbnails", updateAllEpisodeThumbnailController) .put("/episode/update-thumbnails", updateAllEpisodeThumbnailController)
.post("/video/bulk-insert", bulkInsertVideoController) .post("/video/bulk-insert", bulkInsertVideoController)
.post("/video-service", createVideoServiceInternalController) .post("/video-service", createVideoServiceInternalController)
.post("/user-session/purge-unused", purgeUnusedSessionController); .post("/user-session/purge-unused", purgeUnusedSessionController)
.post("/hero-banner", createHeroBannerController);

View File

@ -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<Prisma.HeroBannerCreateInput, "id" | "createdBy">,
) => {
try {
return await prisma.heroBanner.create({
data: {
id: generateUUIDv7(),
creatorId: SystemAccountId,
...payload,
},
});
} catch (error) {
throw new AppError(500, "Failed to insert hero banner", error);
}
};

View File

@ -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);
}
};