refactor #25
@ -1,3 +1,4 @@
|
|||||||
{
|
{
|
||||||
"parser": "typescript"
|
"parser": "typescript",
|
||||||
|
"printWidth": 120
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,62 +1,23 @@
|
|||||||
import { Context } from "elysia";
|
import { Context, Static } from "elysia";
|
||||||
import { mainErrorHandler } from "../../../helpers/error/handler";
|
import { mainErrorHandler } from "../../../helpers/error/handler";
|
||||||
import { bulkInsertEpisodeService } from "../services/http/bulkInsertEpisode.service";
|
import { bulkInsertEpisodeService } from "../services/http/bulkInsertEpisode.service";
|
||||||
import { returnWriteResponse } from "../../../helpers/callback/httpResponse";
|
import { returnWriteResponse } from "../../../helpers/callback/httpResponse";
|
||||||
|
import { bulkInsertEpisodeSchema } from "../schemas/bulkInsertEpisode.schema";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @function bulkInsertMediaController
|
* Perform bulk insert of episodes for a specific media.
|
||||||
* @description Perform bulk insert of episodes for a specific media. This operation fetches episode data from external sources and inserts them into the database. The page parameter is optional; if not provided, the first page of episodes will be fetched.
|
* This operation fetches episode data from external sources and inserts them into the database.
|
||||||
*
|
*
|
||||||
* @param {Context & { body: { media_mal_id: number }; query: { page?: number } }} ctx
|
* See OpenAPI documentation for request/response schema.
|
||||||
* The context object containing the request body.
|
|
||||||
* The body must include:
|
|
||||||
* - media_mal_id: number - The MyAnimeList ID of the media for which episodes will be inserted.
|
|
||||||
* The query may include:
|
|
||||||
* - page?: number - (Optional) The page number of episodes to fetch and insert. If not provided, defaults to the first page.
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* Request route: POST /internal/episode/bulk-insert
|
|
||||||
* Request body:
|
|
||||||
* {
|
|
||||||
* "media_mal_id": 12345
|
|
||||||
* }
|
|
||||||
* Query parameter:
|
|
||||||
* ?page=2 (Optional, specifies the page number of episodes to fetch and insert)
|
|
||||||
*
|
|
||||||
* @returns {Promise<Object>}
|
|
||||||
* A response object indicating success or failure.
|
|
||||||
* Return example:
|
|
||||||
* {
|
|
||||||
* success: true,
|
|
||||||
* status: 201,
|
|
||||||
* message: "Bulk insert episode operation completed successfully",
|
|
||||||
* data: { ...bulkInsertResult } // 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 bulkInsertEpisodeController = async (
|
export const bulkInsertEpisodeController = async (ctx: {
|
||||||
ctx: Context & { body: { media_mal_id: number }; query: { page?: number } },
|
set: Context["set"];
|
||||||
) => {
|
body: Static<typeof bulkInsertEpisodeSchema.body>;
|
||||||
|
query: Static<typeof bulkInsertEpisodeSchema.query>;
|
||||||
|
}) => {
|
||||||
try {
|
try {
|
||||||
const bulkInsertResult = await bulkInsertEpisodeService(
|
const bulkInsertResult = await bulkInsertEpisodeService(ctx.body.media_mal_id, ctx.query.page);
|
||||||
ctx.body.media_mal_id,
|
return returnWriteResponse(ctx.set, 201, "Bulk insert episode operation completed successfully", bulkInsertResult);
|
||||||
ctx.query.page,
|
|
||||||
);
|
|
||||||
return returnWriteResponse(
|
|
||||||
ctx.set,
|
|
||||||
201,
|
|
||||||
"Bulk insert episode operation completed successfully",
|
|
||||||
bulkInsertResult,
|
|
||||||
);
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return mainErrorHandler(ctx.set, err);
|
return mainErrorHandler(ctx.set, err);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,6 @@ import { bulkInsertMediaSchema } from "../schemas/bulkInsertMedia.schema";
|
|||||||
export const bulkInsertMediaController = async (ctx: {
|
export const bulkInsertMediaController = async (ctx: {
|
||||||
set: Context["set"];
|
set: Context["set"];
|
||||||
body: Static<typeof bulkInsertMediaSchema.body>;
|
body: Static<typeof bulkInsertMediaSchema.body>;
|
||||||
query: Static<typeof bulkInsertMediaSchema.query>;
|
|
||||||
}) => {
|
}) => {
|
||||||
try {
|
try {
|
||||||
const bulkInsertResult = await bulkInsertAnimeService(ctx.body.mal_id);
|
const bulkInsertResult = await bulkInsertAnimeService(ctx.body.mal_id);
|
||||||
|
|||||||
@ -7,13 +7,14 @@ import { updateAllEpisodeThumbnailController } from "./controllers/updateAllEpis
|
|||||||
import { purgeUnusedSessionController } from "./controllers/purgeUnusedSession.controller";
|
import { purgeUnusedSessionController } from "./controllers/purgeUnusedSession.controller";
|
||||||
import { createHeroBannerController } from "./controllers/createHeroBanner.controller";
|
import { createHeroBannerController } from "./controllers/createHeroBanner.controller";
|
||||||
import { bulkInsertMediaSchema } from "./schemas/bulkInsertMedia.schema";
|
import { bulkInsertMediaSchema } from "./schemas/bulkInsertMedia.schema";
|
||||||
|
import { bulkInsertEpisodeSchema } from "./schemas/bulkInsertEpisode.schema";
|
||||||
|
|
||||||
export const internalModule = new Elysia({
|
export const internalModule = new Elysia({
|
||||||
prefix: "/internal",
|
prefix: "/internal",
|
||||||
tags: ["Internal"],
|
tags: ["Internal"],
|
||||||
})
|
})
|
||||||
.post("/media/bulk-insert", bulkInsertMediaController, bulkInsertMediaSchema)
|
.post("/media/bulk-insert", bulkInsertMediaController, bulkInsertMediaSchema)
|
||||||
.post("/episode/bulk-insert", bulkInsertEpisodeController)
|
.post("/episode/bulk-insert", bulkInsertEpisodeController, bulkInsertEpisodeSchema)
|
||||||
.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)
|
||||||
|
|||||||
73
src/modules/internal/schemas/bulkInsertEpisode.schema.ts
Normal file
73
src/modules/internal/schemas/bulkInsertEpisode.schema.ts
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
import { t } from "elysia";
|
||||||
|
import { AppRouteSchema } from "../../../helpers/types/AppRouteSchema";
|
||||||
|
|
||||||
|
export const bulkInsertEpisodeSchema = {
|
||||||
|
body: t.Object({
|
||||||
|
media_mal_id: t.Number({
|
||||||
|
description: "The MyAnimeList ID of the media for which episodes will be inserted",
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
query: t.Object({
|
||||||
|
page: t.Optional(
|
||||||
|
t.Number({
|
||||||
|
description: "Episode page number to fetch",
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
detail: {
|
||||||
|
summary: "Bulk insert episodes for a media",
|
||||||
|
description:
|
||||||
|
"Perform bulk insert of episodes for a specific media. This operation fetches episode data from external sources and inserts them into the database. The page parameter is optional; if not provided, the first page of episodes will be fetched.",
|
||||||
|
responses: {
|
||||||
|
201: {
|
||||||
|
description:
|
||||||
|
"Bulk insert episode operation completed successfully (Data returned only if the env run on development mode)",
|
||||||
|
content: {
|
||||||
|
"application/json": {
|
||||||
|
schema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
success: { type: "boolean", default: true },
|
||||||
|
status: { type: "integer", default: 201 },
|
||||||
|
message: {
|
||||||
|
type: "string",
|
||||||
|
default: "Bulk insert episode operation completed successfully",
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
pagination: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
last_visible_page: { type: "integer", default: 1 },
|
||||||
|
has_next_page: { type: "boolean", default: false },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
type: "array",
|
||||||
|
items: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
mal_id: { type: "integer", default: 1 },
|
||||||
|
url: { type: "string", default: "https://myanimelist.net/anime/1" },
|
||||||
|
title: { type: "string", default: "Example Episode Title" },
|
||||||
|
title_japanese: { type: "string", default: "例のエピソードタイトル" },
|
||||||
|
title_romanji: { type: "string", default: "Rei no Episōdo Taitoru" },
|
||||||
|
aired: { type: "string", format: "date-time", default: "2022-01-01T00:00:00.000Z" },
|
||||||
|
score: { type: "number", default: 8.5 },
|
||||||
|
filler: { type: "boolean", default: false },
|
||||||
|
recap: { type: "boolean", default: false },
|
||||||
|
forum_url: { type: "string", default: "https://myanimelist.net/forum/1" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} satisfies AppRouteSchema;
|
||||||
@ -8,13 +8,6 @@ export const bulkInsertMediaSchema = {
|
|||||||
"The MyAnimeList ID of the media for which episodes will be inserted",
|
"The MyAnimeList ID of the media for which episodes will be inserted",
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
query: t.Object({
|
|
||||||
page: t.Optional(
|
|
||||||
t.Number({
|
|
||||||
description: "Episode page number to fetch",
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
detail: {
|
detail: {
|
||||||
summary: "Bulk insert media",
|
summary: "Bulk insert media",
|
||||||
description:
|
description:
|
||||||
|
|||||||
Reference in New Issue
Block a user