refactor: create genre module in bulk insert media

This commit is contained in:
2026-07-01 11:39:34 +07:00
parent 107582dd32
commit 7a63b43c9f
2 changed files with 43 additions and 3 deletions

View File

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

View File

@ -4,20 +4,24 @@ import {getContentReferenceAPI} from "../../../../config/apis/jikan/media.refere
import {bulkInsertMediaCharacterRepository} from "../../repositories/bulkInsertMediaCharacter.repository"; import {bulkInsertMediaCharacterRepository} from "../../repositories/bulkInsertMediaCharacter.repository";
import {MediaFullInfoResponse} from "../../types/mediaFullInfo.type"; import {MediaFullInfoResponse} from "../../types/mediaFullInfo.type";
import {MediaCharacters} from "../../types/mediaCharacters"; import {MediaCharacters} from "../../types/mediaCharacters";
import {bulkInsertMediaGenreRepository} from "../../repositories/bulkInsertMediaGenre.repository";
export const bulkInsertAnimeService = async (malId: number) => { export const bulkInsertAnimeService = async (malId: number) => {
try { try {
const {baseURL, getMediaFullInfo, getMediaCharacters} = getContentReferenceAPI(malId); const {baseURL, getMediaFullInfo, getMediaCharacters} = getContentReferenceAPI(malId);
const mediaFullInfo = (await fetch(baseURL + getMediaFullInfo).then((res) => res.json())) as MediaFullInfoResponse; const mediaFullInfo = (await fetch(baseURL + getMediaFullInfo).then((res) => res.json())) as MediaFullInfoResponse;
// Inserting Media and Producers (Producer, Studio, Licensor)
const insertedMedia = await InsertMediaRepository({ const insertedMedia = await InsertMediaRepository({
payload: mediaFullInfo.data, payload: mediaFullInfo.data,
}); });
// Inserting Characters, Staff, and Voice Actors
// await bulkInsertMediaCharacterRepository(insertedMedia.mal_id)
const mediaChar = await fetch(baseURL + getMediaCharacters).then((res) => res.json()) as MediaCharacters; 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; return insertedMedia.id;
} catch (error) { } catch (error) {