From c1f90c40f283757cfb18a72a75a45f54d3b969b8 Mon Sep 17 00:00:00 2001 From: Vivy Bot Date: Wed, 4 Feb 2026 23:31:12 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20add=20endpoint=20to=20get?= =?UTF-8?q?=20all=20episodes=20by=20media?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tAllEpisodeFromSpecificMedia.controller.ts | 22 +++++++++++++++++++ src/modules/episode/index.ts | 7 ++++++ .../GET/getAllEpisodeFromMedia.repository.ts | 22 +++++++++++++++++++ .../getAllEpisodeFromSpecificMedia.service.ts | 16 ++++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 src/modules/episode/controllers/getAllEpisodeFromSpecificMedia.controller.ts create mode 100644 src/modules/episode/index.ts create mode 100644 src/modules/episode/repositories/GET/getAllEpisodeFromMedia.repository.ts create mode 100644 src/modules/episode/services/http/getAllEpisodeFromSpecificMedia.service.ts diff --git a/src/modules/episode/controllers/getAllEpisodeFromSpecificMedia.controller.ts b/src/modules/episode/controllers/getAllEpisodeFromSpecificMedia.controller.ts new file mode 100644 index 0000000..6388a85 --- /dev/null +++ b/src/modules/episode/controllers/getAllEpisodeFromSpecificMedia.controller.ts @@ -0,0 +1,22 @@ +import { Context } from "elysia"; +import { mainErrorHandler } from "../../../helpers/error/handler"; +import { returnReadResponse } from "../../../helpers/callback/httpResponse"; +import { getAllEpisodeFromSpecificMediaService } from "../services/http/getAllEpisodeFromSpecificMedia.service"; + +export const getAllEpisodeFromSpecificMediaController = async ( + ctx: Context & { params: { mediaSlug: string } }, +) => { + try { + const episodesData = await getAllEpisodeFromSpecificMediaService( + ctx.params.mediaSlug, + ); + return returnReadResponse( + ctx.set, + 200, + "Episodes fetched successfully", + episodesData, + ); + } catch (error) { + return mainErrorHandler(ctx.set, error); + } +}; diff --git a/src/modules/episode/index.ts b/src/modules/episode/index.ts new file mode 100644 index 0000000..1c8b22d --- /dev/null +++ b/src/modules/episode/index.ts @@ -0,0 +1,7 @@ +import Elysia from "elysia"; +import { getAllEpisodeFromSpecificMediaController } from "./controllers/getAllEpisodeFromSpecificMedia.controller"; + +export const episodeModule = new Elysia({ prefix: "/episodes/:mediaSlug" }).get( + "/", + getAllEpisodeFromSpecificMediaController, +); diff --git a/src/modules/episode/repositories/GET/getAllEpisodeFromMedia.repository.ts b/src/modules/episode/repositories/GET/getAllEpisodeFromMedia.repository.ts new file mode 100644 index 0000000..d3a46a5 --- /dev/null +++ b/src/modules/episode/repositories/GET/getAllEpisodeFromMedia.repository.ts @@ -0,0 +1,22 @@ +import { AppError } from "../../../../helpers/error/instances/app"; +import { mediaModel } from "../../../media/model"; + +export const getAllEpisodeFromMediaRepository = async (mediaSlug: string) => { + try { + return mediaModel.findUnique({ + where: { slug: mediaSlug }, + select: { + episodes: { + select: { + id: true, + name: true, + episode: true, + pictureThumbnail: true, + }, + }, + }, + }); + } catch (error) { + throw new AppError(500, "Failed to fetch episodes from media", error); + } +}; diff --git a/src/modules/episode/services/http/getAllEpisodeFromSpecificMedia.service.ts b/src/modules/episode/services/http/getAllEpisodeFromSpecificMedia.service.ts new file mode 100644 index 0000000..8512412 --- /dev/null +++ b/src/modules/episode/services/http/getAllEpisodeFromSpecificMedia.service.ts @@ -0,0 +1,16 @@ +import { AppError } from "../../../../helpers/error/instances/app"; +import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; +import { getAllEpisodeFromMediaRepository } from "../../repositories/GET/getAllEpisodeFromMedia.repository"; + +export const getAllEpisodeFromSpecificMediaService = async ( + mediaSlug: string, +) => { + try { + const mediaData = await getAllEpisodeFromMediaRepository(mediaSlug); + if (!mediaData) + throw new AppError(404, `Media with slug ${mediaSlug} not found`); + return mediaData.episodes; + } catch (error) { + ErrorForwarder(error); + } +};