diff --git a/lesson_10/libraries/src/loaders/chelsea_ogbonnia_loader.ts b/lesson_10/libraries/src/loaders/chelsea_ogbonnia_loader.ts new file mode 100644 index 000000000..b2fa6b3ff --- /dev/null +++ b/lesson_10/libraries/src/loaders/chelsea_ogbonnia_loader.ts @@ -0,0 +1,86 @@ +import csv from 'csv-parser'; +import fs from 'fs'; +import { Credit, MediaItem, MediaType } from '../models/index.js'; +import { Loader } from './loader.js'; + +export class ChelseaOgbonniaLoader implements Loader { + getLoaderName(): string { + return 'chesleaogbonnia'; + } + + async loadData(): Promise { + const credits = await this.loadCredits(); + const mediaItems = await this.loadMediaItems(); + + const creditsMap: Record = {}; + + credits.forEach((credit) => { + const mediaItemId = credit.getMediaItemId(); + if (!creditsMap[mediaItemId]) { + creditsMap[mediaItemId] = []; + } + creditsMap[mediaItemId].push(credit); + }); + + mediaItems.forEach((mediaItem) => { + const mediaItemId = mediaItem.getId(); + const associatedCredits = creditsMap[mediaItemId] || []; + + associatedCredits.forEach((credit) => mediaItem.addCredit(credit)); + }); + + console.log( + `Loaded ${credits.length} credits and ${mediaItems.length} media items`, + ); + + return mediaItems; + } + + async loadMediaItems(): Promise { + const mediaItems: MediaItem[] = []; + const readable = fs + .createReadStream('data/media_items.csv', 'utf-8') + .pipe(csv()); + + for await (const row of readable) { + const { id, type, title, year } = row; + let mediaType: MediaType | undefined; + switch (type) { + case 'movie': + mediaType = MediaType.Movie; + break; + case 'tv_show': + mediaType = MediaType.TVShow; + break; + case 'documentary': + mediaType = MediaType.Documentary; + break; + default: + throw new Error(`Unknown media type: ${type}`); + } + const releaseYear = Number(year); + const mediaItem = new MediaItem( + String(id), + title, + mediaType, + releaseYear, + [], + ); + mediaItems.push(mediaItem); + } + return mediaItems; + } + + async loadCredits(): Promise { + const credits = []; + const readable = fs + .createReadStream('data/credits.csv', 'utf-8') + .pipe(csv()); + for await (const row of readable) { + const { media_item_id: mediaItemId, role, name } = row; + const credit = new Credit(mediaItemId, name, role); + credits.push(credit); + } + return credits; + } +} diff --git a/lesson_10/libraries/src/loaders/loaders.module.ts b/lesson_10/libraries/src/loaders/loaders.module.ts index 3aa5f6608..8ae8b53e0 100644 --- a/lesson_10/libraries/src/loaders/loaders.module.ts +++ b/lesson_10/libraries/src/loaders/loaders.module.ts @@ -1,10 +1,11 @@ import { Module } from '@nestjs/common'; import { AngelicaCastilloLoader } from './angelica_castillo_loader.js'; -import { HummadTanweerLoader } from './hummad_tanweer_loader.js'; import { AnthonyMaysLoader } from './anthony_mays_loader.js'; +import { ChelseaOgbonniaLoader } from './chelsea_ogbonnia_loader.js'; import { DavidSmithLoader } from './david_smith_loader.js'; import { DwightBlueLoader } from './dwight_blue_loader.js'; +import { HummadTanweerLoader } from './hummad_tanweer_loader.js'; import { JamesCapparellLoader } from './james_capparell_loader.js'; import { JosephCaballeroLoader } from './joseph_caballero_loader.js'; import { KimberleeHaldaneLoader } from './kimberlee_haldane_loader.js'; @@ -22,6 +23,7 @@ export const Loaders = Symbol.for('Loaders'); const LOADER_PROVIDERS = [ AngelicaCastilloLoader, AnthonyMaysLoader, + ChelseaOgbonniaLoader, DavidSmithLoader, DwightBlueLoader, HummadTanweerLoader,