From f70749f50f7632cb4d340706c1c4d094dc74f68b Mon Sep 17 00:00:00 2001 From: Ezra Nyabuti Date: Thu, 27 Mar 2025 17:36:04 +0000 Subject: [PATCH 1/5] feat: adds Ezra's media items and credits loader --- .../src/loaders/ezra_nyabuti_loaders.ts | 46 +++++++++++++++++++ .../libraries/src/loaders/loaders.module.ts | 7 ++- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts diff --git a/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts b/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts new file mode 100644 index 000000000..80b046667 --- /dev/null +++ b/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts @@ -0,0 +1,46 @@ +import csv from 'csv-parser'; +import fs from 'fs'; +import { Credit, MediaItem } from '../models/index.js'; +import { Loader } from './loader.js'; + +export class EzraNyabutiLoaders implements Loader { + getLoaderName(): string { + return 'ezranyabuti'; + } + + async loadData(): Promise { + const credits = await this.loadCredits(); + const mediaItems = await this.loadMediaItems(); + + console.log( + `Loaded ${credits.length} credits and ${mediaItems.length} media items`, + ); + + return [...mediaItems.values()]; + } + + async loadMediaItems(): Promise { + // TODO: Implement this method. + const mediaItems = []; + const readable = fs + .createReadStream('data/media_items.csv', 'utf-8') + .pipe(csv()); + for await (const row of readable) { + const { id, type, title, year } = row; + mediaItems.push(new MediaItem(id, title, type, year, [])); + } + 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, role, name } = row; + credits.push(new Credit(media_item_id, name, role)); + } + return credits; + } +} diff --git a/lesson_10/libraries/src/loaders/loaders.module.ts b/lesson_10/libraries/src/loaders/loaders.module.ts index 0b2db8214..bd4c0550d 100644 --- a/lesson_10/libraries/src/loaders/loaders.module.ts +++ b/lesson_10/libraries/src/loaders/loaders.module.ts @@ -3,9 +3,14 @@ import { Module } from '@nestjs/common'; import { AnthonyMaysLoader } from './anthony_mays_loader.js'; import { DylanLaffertysLoader } from './dylan_lafferty_loaders.js'; +import { EzraNyabutiLoaders } from './ezra_nyabuti_loaders.js'; export const Loaders = Symbol.for('Loaders'); -const LOADER_PROVIDERS = [AnthonyMaysLoader, DylanLaffertysLoader]; +const LOADER_PROVIDERS = [ + AnthonyMaysLoader, + DylanLaffertysLoader, + EzraNyabutiLoaders, +]; @Module({ providers: [ From b12d5a30dfe7a35d6edd0160eed15dd68b03dcd4 Mon Sep 17 00:00:00 2001 From: Ezra Nyabuti Date: Fri, 28 Mar 2025 02:51:44 +0000 Subject: [PATCH 2/5] feat: enhance Ezra's loader to associate credits with media items --- .../libraries/src/loaders/ezra_nyabuti_loaders.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts b/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts index 80b046667..a72dc7d2e 100644 --- a/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts +++ b/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts @@ -11,6 +11,19 @@ export class EzraNyabutiLoaders implements Loader { async loadData(): Promise { const credits = await this.loadCredits(); const mediaItems = await this.loadMediaItems(); + const mediaMap = new Map(); + mediaItems.forEach((mediaItem) => + mediaMap.set(mediaItem.getId(), mediaItem), + ); + credits.forEach((credit) => { + const mediaItem = mediaMap.get(credit.getMediaItemId()); + if (mediaItem) { + mediaItem.addCredit(credit); + } + }); + for (const mediaItem of mediaItems) { + console.log(mediaItem); + } console.log( `Loaded ${credits.length} credits and ${mediaItems.length} media items`, From 38320c340522f0b449408d02b63adc850e07ce31 Mon Sep 17 00:00:00 2001 From: Ezra Nyabuti Date: Fri, 28 Mar 2025 13:47:15 +0000 Subject: [PATCH 3/5] feat: add Ezra's loader to the loaders module --- lesson_10/libraries/src/loaders/loaders.module.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lesson_10/libraries/src/loaders/loaders.module.ts b/lesson_10/libraries/src/loaders/loaders.module.ts index b85b85314..fd1ced20f 100644 --- a/lesson_10/libraries/src/loaders/loaders.module.ts +++ b/lesson_10/libraries/src/loaders/loaders.module.ts @@ -4,11 +4,13 @@ import { AnthonyMaysLoader } from './anthony_mays_loader.js'; import { DylanLaffertysLoader } from './dylan_lafferty_loaders.js'; import { MercedesMathewsLoader } from './mercedes_mathews_loader.js'; +import { EzraNyabutiLoaders } from './ezra_nyabuti_loaders.js'; export const Loaders = Symbol.for('Loaders'); const LOADER_PROVIDERS = [ AnthonyMaysLoader, DylanLaffertysLoader, + EzraNyabutiLoaders, MercedesMathewsLoader, ]; From a99b136001bd31e5b215a1cd52c8c64111689e13 Mon Sep 17 00:00:00 2001 From: Ezra Nyabuti Date: Fri, 28 Mar 2025 13:52:49 +0000 Subject: [PATCH 4/5] feat: add Ezra's loader to the loaders module --- lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts | 1 - lesson_10/libraries/src/loaders/loaders.module.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts b/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts index a72dc7d2e..765149cec 100644 --- a/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts +++ b/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts @@ -33,7 +33,6 @@ export class EzraNyabutiLoaders implements Loader { } async loadMediaItems(): Promise { - // TODO: Implement this method. const mediaItems = []; const readable = fs .createReadStream('data/media_items.csv', 'utf-8') diff --git a/lesson_10/libraries/src/loaders/loaders.module.ts b/lesson_10/libraries/src/loaders/loaders.module.ts index fd1ced20f..c32eaad6b 100644 --- a/lesson_10/libraries/src/loaders/loaders.module.ts +++ b/lesson_10/libraries/src/loaders/loaders.module.ts @@ -2,9 +2,9 @@ import { Module } from '@nestjs/common'; import { AnthonyMaysLoader } from './anthony_mays_loader.js'; import { DylanLaffertysLoader } from './dylan_lafferty_loaders.js'; +import { EzraNyabutiLoaders } from './ezra_nyabuti_loaders.js'; import { MercedesMathewsLoader } from './mercedes_mathews_loader.js'; -import { EzraNyabutiLoaders } from './ezra_nyabuti_loaders.js'; export const Loaders = Symbol.for('Loaders'); const LOADER_PROVIDERS = [ From 8ff8d623cf38b3f31fa913167f51d8874c1c9892 Mon Sep 17 00:00:00 2001 From: Ezra Nyabuti Date: Fri, 28 Mar 2025 20:01:01 +0000 Subject: [PATCH 5/5] refactor: remove unnecessary console logs from Ezra's loader --- lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts b/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts index 765149cec..db7dcc53a 100644 --- a/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts +++ b/lesson_10/libraries/src/loaders/ezra_nyabuti_loaders.ts @@ -21,13 +21,6 @@ export class EzraNyabutiLoaders implements Loader { mediaItem.addCredit(credit); } }); - for (const mediaItem of mediaItems) { - console.log(mediaItem); - } - - console.log( - `Loaded ${credits.length} credits and ${mediaItems.length} media items`, - ); return [...mediaItems.values()]; }