diff --git a/src/modules/internal/repositories/bulkInsertMediaGenre.repository.ts b/src/modules/internal/repositories/bulkInsertMediaGenre.repository.ts new file mode 100644 index 0000000..f4043fe --- /dev/null +++ b/src/modules/internal/repositories/bulkInsertMediaGenre.repository.ts @@ -0,0 +1,36 @@ +import {AppError} from "../../../helpers/error/instances/app"; +import {MediaFullInfoResponse} from "../types/mediaFullInfo.type"; +import {prisma} from "../../../utils/databases/prisma/connection"; +import slugify from "slugify"; + +export const bulkInsertMediaGenreRepository = async (mediaData: MediaFullInfoResponse, mediaId: string) => { + try { + await prisma.$transaction(async (tx) => { + const createdGenres = await tx.genre.createManyAndReturn({ + data: mediaData.data.genres.map((genre) => ({ + name: genre.name, + mal_id: genre.mal_id, + slug: slugify(genre.name, { + lower: true, + strict: true, + }) + })), + skipDuplicates: true, + select: { + mal_id: true, + id: true + } + }) + + await tx.mediaGenre.createMany({ + data: createdGenres.map((genre) => ({ + media_id: mediaId, + genre_id: genre.id + })), + skipDuplicates: true + }) + }) + } catch (error) { + throw new AppError(500, "Failed to bulk insert media genre", error); + } +}; \ No newline at end of file diff --git a/src/modules/internal/services/http/bulkInsertAnime.service.ts b/src/modules/internal/services/http/bulkInsertAnime.service.ts index 518be7b..608dffa 100644 --- a/src/modules/internal/services/http/bulkInsertAnime.service.ts +++ b/src/modules/internal/services/http/bulkInsertAnime.service.ts @@ -4,20 +4,24 @@ import {getContentReferenceAPI} from "../../../../config/apis/jikan/media.refere import {bulkInsertMediaCharacterRepository} from "../../repositories/bulkInsertMediaCharacter.repository"; import {MediaFullInfoResponse} from "../../types/mediaFullInfo.type"; import {MediaCharacters} from "../../types/mediaCharacters"; +import {bulkInsertMediaGenreRepository} from "../../repositories/bulkInsertMediaGenre.repository"; export const bulkInsertAnimeService = async (malId: number) => { try { const {baseURL, getMediaFullInfo, getMediaCharacters} = getContentReferenceAPI(malId); const mediaFullInfo = (await fetch(baseURL + getMediaFullInfo).then((res) => res.json())) as MediaFullInfoResponse; + // Inserting Media and Producers (Producer, Studio, Licensor) const insertedMedia = await InsertMediaRepository({ payload: mediaFullInfo.data, }); - - // await bulkInsertMediaCharacterRepository(insertedMedia.mal_id) + // Inserting Characters, Staff, and Voice Actors const mediaChar = await fetch(baseURL + getMediaCharacters).then((res) => res.json()) as MediaCharacters; - return await bulkInsertMediaCharacterRepository(insertedMedia.id, mediaChar.data); + await bulkInsertMediaCharacterRepository(insertedMedia.id, mediaChar.data); + + // Inserting Genres and Demographics + await bulkInsertMediaGenreRepository(mediaFullInfo, insertedMedia.id) return insertedMedia.id; } catch (error) {