Compare commits
16 Commits
9afa0e62f9
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| d7270f8696 | |||
| bd66705eae | |||
| 7fb1d4f1f5 | |||
| 7f129a1b55 | |||
| 3d3a9af9dc | |||
| 90bf31a209 | |||
| 81cc1057b4 | |||
| 9dd02d097d | |||
| 6f754a878b | |||
| e3e4df35e2 | |||
| f3522f6cac | |||
| 745fd213f9 | |||
| dea8c6b7ce | |||
| c1f90c40f2 | |||
| d6fa5efaff | |||
| 4b9ade64c3 |
5
src/helpers/characters/serializeBigInt.ts
Normal file
5
src/helpers/characters/serializeBigInt.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export const serializeBigInt = <T>(data: T): T => {
|
||||||
|
return JSON.parse(
|
||||||
|
JSON.stringify(data, (_, v) => (typeof v === "bigint" ? Number(v) : v)),
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
import { Context } from "elysia";
|
||||||
|
import { mainErrorHandler } from "../../../helpers/error/handler";
|
||||||
|
import { returnReadResponse } from "../../../helpers/callback/httpResponse";
|
||||||
|
import { getAllEpisodeFromSpecificMediaService } from "../services/http/getAllEpisodeFromSpecificMedia.service";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function getAllEpisodeFromSpecificMediaController
|
||||||
|
* @description Controller to handle fetching all episodes associated with a specific media slug.
|
||||||
|
*
|
||||||
|
* @param {Context & { params: { mediaSlug: string } }} ctx
|
||||||
|
* The context object containing the request body.
|
||||||
|
* The params must include:
|
||||||
|
* - mediaSlug: string - The slug of the media to which the episode belongs.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* Request route: GET /episodes/:mediaSlug
|
||||||
|
*
|
||||||
|
* @returns {Promise<Object>}
|
||||||
|
* A response object indicating success or failure.
|
||||||
|
* Return example:
|
||||||
|
* {
|
||||||
|
* success: true,
|
||||||
|
* status: 200,
|
||||||
|
* message: "Episodes fetched successfully.",
|
||||||
|
* data: { ...episodeDetails } // Data returned only if the env run on development mode
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* @throws {Object}
|
||||||
|
* An error response object if validation fails or an error occurs during bulk insert operation.
|
||||||
|
* Return example:
|
||||||
|
* {
|
||||||
|
* success: false,
|
||||||
|
* status: <Status Code>,
|
||||||
|
* message: "<Error Message>",
|
||||||
|
* error: { ...errorDetails } // Additional error details if available and the env run on development mode
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
import { Context } from "elysia";
|
||||||
|
import { mainErrorHandler } from "../../../helpers/error/handler";
|
||||||
|
import { returnReadResponse } from "../../../helpers/callback/httpResponse";
|
||||||
|
import { getEpisodeDetailsService } from "../services/http/getEpisodeDetails.service";
|
||||||
|
|
||||||
|
export interface GetEpisodeDetailsParams {
|
||||||
|
mediaSlug?: string;
|
||||||
|
episode?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function getEpisodeDetailsController
|
||||||
|
* @description Controller to handle fetching episode details based on provided parameters.
|
||||||
|
*
|
||||||
|
* @param {Context & { params: GetEpisodeDetailsParams }} ctx
|
||||||
|
* The context object containing the request body.
|
||||||
|
* The params must include:
|
||||||
|
* - mediaSlug?: string - The slug of the media to which the episode belongs.
|
||||||
|
* - episode?: string - The identifier of the episode.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* Request route: GET /episodes/:mediaSlug/:episode
|
||||||
|
*
|
||||||
|
* @returns {Promise<Object>}
|
||||||
|
* A response object indicating success or failure.
|
||||||
|
* Return example:
|
||||||
|
* {
|
||||||
|
* success: true,
|
||||||
|
* status: 200,
|
||||||
|
* message: "Episode details fetched successfully.",
|
||||||
|
* data: { ...episodeDetails } // Data returned only if the env run on development mode
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* @throws {Object}
|
||||||
|
* An error response object if validation fails or an error occurs during bulk insert operation.
|
||||||
|
* Return example:
|
||||||
|
* {
|
||||||
|
* success: false,
|
||||||
|
* status: <Status Code>,
|
||||||
|
* message: "<Error Message>",
|
||||||
|
* error: { ...errorDetails } // Additional error details if available and the env run on development mode
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
export const getEpisodeDetailsController = async (
|
||||||
|
ctx: Context & { params: GetEpisodeDetailsParams },
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
const result = await getEpisodeDetailsService(ctx.params);
|
||||||
|
return returnReadResponse(
|
||||||
|
ctx.set,
|
||||||
|
200,
|
||||||
|
"Episode details fetched successfully.",
|
||||||
|
result,
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
return mainErrorHandler(ctx.set, error);
|
||||||
|
}
|
||||||
|
};
|
||||||
3
src/modules/episode/episode.model.ts
Normal file
3
src/modules/episode/episode.model.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import { prisma } from "../../utils/databases/prisma/connection";
|
||||||
|
|
||||||
|
export const episodeModel = prisma.episode;
|
||||||
7
src/modules/episode/index.ts
Normal file
7
src/modules/episode/index.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import Elysia from "elysia";
|
||||||
|
import { getAllEpisodeFromSpecificMediaController } from "./controllers/getAllEpisodeFromSpecificMedia.controller";
|
||||||
|
import { getEpisodeDetailsController } from "./controllers/getEpisodeDetails.controller";
|
||||||
|
|
||||||
|
export const episodeModule = new Elysia({ prefix: "/episodes/:mediaSlug" })
|
||||||
|
.get("/", getAllEpisodeFromSpecificMediaController)
|
||||||
|
.get("/:episode", getEpisodeDetailsController);
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
import { AppError } from "../../../../helpers/error/instances/app";
|
||||||
|
import { episodeModel } from "../../episode.model";
|
||||||
|
|
||||||
|
export const getAllEpisodeWithThumbnailLinkRepository = async (
|
||||||
|
serviceReferenceId: string,
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
return await episodeModel.findMany({
|
||||||
|
where: {
|
||||||
|
deletedAt: null,
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
episode: true,
|
||||||
|
videos: {
|
||||||
|
where: {
|
||||||
|
deletedAt: null,
|
||||||
|
serviceId: serviceReferenceId,
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
code: true,
|
||||||
|
service: {
|
||||||
|
select: {
|
||||||
|
endpointThumbnail: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
throw new AppError(500, "Failed to get all episode thumbnails", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
import { serializeBigInt } from "../../../../helpers/characters/serializeBigInt";
|
||||||
|
import { AppError } from "../../../../helpers/error/instances/app";
|
||||||
|
import { episodeModel } from "../../episode.model";
|
||||||
|
|
||||||
|
export const getEpisodeDetailsRepository = async (payload: {
|
||||||
|
mediaId: string;
|
||||||
|
episode: number;
|
||||||
|
}) => {
|
||||||
|
try {
|
||||||
|
const result = await episodeModel.findUnique({
|
||||||
|
where: {
|
||||||
|
mediaId_episode: {
|
||||||
|
mediaId: payload.mediaId,
|
||||||
|
episode: payload.episode,
|
||||||
|
},
|
||||||
|
deletedAt: null,
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
episode: true,
|
||||||
|
name: true,
|
||||||
|
score: true,
|
||||||
|
pictureThumbnail: true,
|
||||||
|
viewed: true,
|
||||||
|
likes: true,
|
||||||
|
updatedAt: true,
|
||||||
|
uploader: {
|
||||||
|
select: {
|
||||||
|
name: true,
|
||||||
|
username: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
videos: {
|
||||||
|
where: {
|
||||||
|
pendingUpload: false,
|
||||||
|
deletedAt: null,
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
code: true,
|
||||||
|
service: {
|
||||||
|
select: {
|
||||||
|
endpointThumbnail: true,
|
||||||
|
endpointVideo: true,
|
||||||
|
endpointDownload: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
media: {
|
||||||
|
select: {
|
||||||
|
slug: true,
|
||||||
|
title: true,
|
||||||
|
_count: {
|
||||||
|
select: {
|
||||||
|
episodes: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return serializeBigInt(result);
|
||||||
|
} catch (error) {
|
||||||
|
throw new AppError(500, "Failed to fetch episode details.", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
import { Prisma } from "@prisma/client";
|
||||||
|
import { AppError } from "../../../../helpers/error/instances/app";
|
||||||
|
import { episodeModel } from "../../episode.model";
|
||||||
|
|
||||||
|
export const updateEpisodeRepository = async (
|
||||||
|
payload: Prisma.EpisodeUncheckedUpdateInput,
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
return await episodeModel.update({
|
||||||
|
where: {
|
||||||
|
id: payload.id as string,
|
||||||
|
},
|
||||||
|
data: payload,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
throw new AppError(500, "Failed to edit episode", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
import { AppError } from "../../../../helpers/error/instances/app";
|
||||||
|
import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder";
|
||||||
|
import { getMediaIdFromSlugRepository } from "../../../media/repositories/GET/getMediaIdFromSlug.repository";
|
||||||
|
import { GetEpisodeDetailsParams } from "../../controllers/getEpisodeDetails.controller";
|
||||||
|
import { getEpisodeDetailsRepository } from "../../repositories/GET/getEpisodeDetails.repository";
|
||||||
|
|
||||||
|
export const getEpisodeDetailsService = async (
|
||||||
|
params: GetEpisodeDetailsParams,
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
if (!params.mediaSlug || !params.episode)
|
||||||
|
throw new AppError(400, "Media slug and episode are required.");
|
||||||
|
|
||||||
|
const mediaId = await getMediaIdFromSlugRepository(params.mediaSlug);
|
||||||
|
if (!mediaId?.id) throw new AppError(404, "Media not found.");
|
||||||
|
|
||||||
|
const result = await getEpisodeDetailsRepository({
|
||||||
|
mediaId: mediaId.id,
|
||||||
|
episode: Number(params.episode),
|
||||||
|
});
|
||||||
|
if (!result) throw new AppError(404, "Episode not found.");
|
||||||
|
|
||||||
|
return result;
|
||||||
|
} catch (error) {
|
||||||
|
ErrorForwarder(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
import { Context } from "elysia";
|
||||||
|
import { mainErrorHandler } from "../../../helpers/error/handler";
|
||||||
|
import { returnWriteResponse } from "../../../helpers/callback/httpResponse";
|
||||||
|
import { updateAllEpisodeThumbnailService } from "../services/http/updateAllEpisodeThumbnail.service";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function updateAllEpisodeThumbnailController
|
||||||
|
* @description Controller to handle the bulk updating of episode thumbnails for all episodes associated with a specific service reference ID.
|
||||||
|
*
|
||||||
|
* @param {Context & { body: { service_reference_id: string } }} ctx
|
||||||
|
* The context object containing the request body.
|
||||||
|
* The body must include:
|
||||||
|
* - service_reference_id: string - The ID of the service to which the episodes belong.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* Request route: PUT /internal/episode/update-thumbnails
|
||||||
|
* Request body:
|
||||||
|
* {
|
||||||
|
* "service_reference_id": "019c0df6-f8fe-7565-82cd-9c29b20232ab"
|
||||||
|
* },
|
||||||
|
*
|
||||||
|
* @returns {Promise<Object>}
|
||||||
|
* A response object indicating success or failure.
|
||||||
|
* Return example:
|
||||||
|
* {
|
||||||
|
* success: true,
|
||||||
|
* status: 204,
|
||||||
|
* message: "Updating {newEpisodeThumbnailsCount} episode thumbnails successfully.",
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* @throws {Object}
|
||||||
|
* An error response object if validation fails or an error occurs during bulk insert operation.
|
||||||
|
* Return example:
|
||||||
|
* {
|
||||||
|
* success: false,
|
||||||
|
* status: <Status Code>,
|
||||||
|
* message: "<Error Message>",
|
||||||
|
* error: { ...errorDetails } // Additional error details if available and the env run on development mode
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
export const updateAllEpisodeThumbnailController = async (
|
||||||
|
ctx: Context & { body: { service_reference_id: string } },
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
const newEpisodeThumbnailsCount = await updateAllEpisodeThumbnailService(
|
||||||
|
ctx.body.service_reference_id,
|
||||||
|
);
|
||||||
|
return returnWriteResponse(
|
||||||
|
ctx.set,
|
||||||
|
204,
|
||||||
|
`Updating ${newEpisodeThumbnailsCount} episode thumbnails successfully.`,
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
return mainErrorHandler(ctx.set, error);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -3,9 +3,11 @@ import { bulkInsertEpisodeController } from "./controllers/bulkInsertEpisode.con
|
|||||||
import { bulkInsertMediaController } from "./controllers/bulkInsertMedia.controller";
|
import { bulkInsertMediaController } from "./controllers/bulkInsertMedia.controller";
|
||||||
import { createVideoServiceInternalController } from "./controllers/createVideoService.controller";
|
import { createVideoServiceInternalController } from "./controllers/createVideoService.controller";
|
||||||
import { bulkInsertVideoController } from "./controllers/bulkInsertVideo.controller";
|
import { bulkInsertVideoController } from "./controllers/bulkInsertVideo.controller";
|
||||||
|
import { updateAllEpisodeThumbnailController } from "./controllers/updateAllEpisodeThumbnail.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)
|
||||||
.post("/episode/bulk-insert", bulkInsertEpisodeController)
|
.post("/episode/bulk-insert", bulkInsertEpisodeController)
|
||||||
|
.put("/episode/update-thumbnails", updateAllEpisodeThumbnailController)
|
||||||
.post("/video/bulk-insert", bulkInsertVideoController)
|
.post("/video/bulk-insert", bulkInsertVideoController)
|
||||||
.post("/video-service", createVideoServiceInternalController);
|
.post("/video-service", createVideoServiceInternalController);
|
||||||
|
|||||||
@ -17,6 +17,7 @@ export const bulkInsertVideoService = async (
|
|||||||
|
|
||||||
for (const videoData of episodeData.videos) {
|
for (const videoData of episodeData.videos) {
|
||||||
const insertedVideo = await bulkInsertVideoRepository({
|
const insertedVideo = await bulkInsertVideoRepository({
|
||||||
|
pendingUpload: false,
|
||||||
episodeId: episodeId.id,
|
episodeId: episodeId.id,
|
||||||
serviceId: videoData.service_id,
|
serviceId: videoData.service_id,
|
||||||
code: videoData.code,
|
code: videoData.code,
|
||||||
|
|||||||
@ -0,0 +1,36 @@
|
|||||||
|
import { AppError } from "../../../../helpers/error/instances/app";
|
||||||
|
import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder";
|
||||||
|
import { updateEpisodeRepository } from "../../../episode/repositories/PUT/updateEpisode.repository";
|
||||||
|
import { getAllEpisodeWithThumbnailLinkRepository } from "../../../episode/repositories/GET/getAllEpisodeWithThumbnailLink.repository";
|
||||||
|
|
||||||
|
export const updateAllEpisodeThumbnailService = async (
|
||||||
|
serviceReferenceId: string,
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
if (!serviceReferenceId)
|
||||||
|
throw new AppError(400, "Service Reference ID is required.");
|
||||||
|
|
||||||
|
const episodesData = await getAllEpisodeWithThumbnailLinkRepository(
|
||||||
|
serviceReferenceId,
|
||||||
|
);
|
||||||
|
|
||||||
|
let updatedThumbnailsCount = 0;
|
||||||
|
for (const episode of episodesData) {
|
||||||
|
if (episode.videos.length === 0) continue;
|
||||||
|
await updateEpisodeRepository({
|
||||||
|
id: episode.id,
|
||||||
|
pictureThumbnail:
|
||||||
|
episode.videos[0].service.endpointThumbnail?.replace(
|
||||||
|
":code:",
|
||||||
|
episode.videos[0].code,
|
||||||
|
) || null,
|
||||||
|
});
|
||||||
|
|
||||||
|
updatedThumbnailsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return updatedThumbnailsCount;
|
||||||
|
} catch (error) {
|
||||||
|
ErrorForwarder(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
20
src/modules/media/controllers/getAllMedia.controller.ts
Normal file
20
src/modules/media/controllers/getAllMedia.controller.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { Context } from "elysia";
|
||||||
|
import { mainErrorHandler } from "../../../helpers/error/handler";
|
||||||
|
import { getAllMediaService } from "../services/http/getAllMedia.service";
|
||||||
|
import { returnReadResponse } from "../../../helpers/callback/httpResponse";
|
||||||
|
|
||||||
|
export const getAllMediaController = async (
|
||||||
|
ctx: Context & { query: { page: string } },
|
||||||
|
) => {
|
||||||
|
try {
|
||||||
|
const mediaData = await getAllMediaService(ctx.query.page);
|
||||||
|
return returnReadResponse(
|
||||||
|
ctx.set,
|
||||||
|
200,
|
||||||
|
"Media fetched successfully",
|
||||||
|
mediaData,
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
return mainErrorHandler(ctx.set, error);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -1,6 +1,7 @@
|
|||||||
import Elysia from "elysia";
|
import Elysia from "elysia";
|
||||||
|
import { getAllMediaController } from "./controllers/getAllMedia.controller";
|
||||||
|
|
||||||
export const mediaModule = new Elysia({ prefix: "/media" }).get(
|
export const mediaModule = new Elysia({ prefix: "/media" }).get(
|
||||||
"/",
|
"/",
|
||||||
() => "Media Module",
|
getAllMediaController,
|
||||||
);
|
);
|
||||||
|
|||||||
17
src/modules/media/repositories/GET/getAllMedia.repository.ts
Normal file
17
src/modules/media/repositories/GET/getAllMedia.repository.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { AppError } from "../../../../helpers/error/instances/app";
|
||||||
|
import { mediaModel } from "../../model";
|
||||||
|
|
||||||
|
export const getAllMediaRepository = async (page: number) => {
|
||||||
|
try {
|
||||||
|
const limit = 10;
|
||||||
|
return await mediaModel.findMany({
|
||||||
|
take: limit,
|
||||||
|
skip: (page - 1) * limit,
|
||||||
|
where: {
|
||||||
|
deletedAt: null,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
throw new AppError(500, "Failed to get all media from repository", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
import { AppError } from "../../../../helpers/error/instances/app";
|
||||||
|
import { mediaModel } from "../../model";
|
||||||
|
|
||||||
|
export const getMediaIdFromSlugRepository = async (slug: string) => {
|
||||||
|
try {
|
||||||
|
return await mediaModel.findUnique({
|
||||||
|
where: { slug },
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
throw new AppError(500, "Failed to fetch media ID from slug.", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
15
src/modules/media/services/http/getAllMedia.service.ts
Normal file
15
src/modules/media/services/http/getAllMedia.service.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder";
|
||||||
|
import { getAllMediaRepository } from "../../repositories/GET/getAllMedia.repository";
|
||||||
|
|
||||||
|
export const getAllMediaService = async (pagination: string) => {
|
||||||
|
try {
|
||||||
|
const page =
|
||||||
|
/^\d+$/.test(pagination) && Number(pagination) > 0
|
||||||
|
? Number(pagination)
|
||||||
|
: 1;
|
||||||
|
|
||||||
|
return getAllMediaRepository(page);
|
||||||
|
} catch (error) {
|
||||||
|
ErrorForwarder(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user