From 5a555d9d82e69e30c9bd316514676bae496c7513 Mon Sep 17 00:00:00 2001 From: Olivia James Date: Thu, 27 Mar 2025 18:18:55 +0000 Subject: [PATCH] feat: add Lesson 10 Loader CSV Files --- .../libraries/src/loaders/loaders.module.ts | 3 +- .../src/loaders/olivia_james_loader.ts | 53 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 lesson_10/libraries/src/loaders/olivia_james_loader.ts diff --git a/lesson_10/libraries/src/loaders/loaders.module.ts b/lesson_10/libraries/src/loaders/loaders.module.ts index 0b2db8214..1f22dbaa0 100644 --- a/lesson_10/libraries/src/loaders/loaders.module.ts +++ b/lesson_10/libraries/src/loaders/loaders.module.ts @@ -2,10 +2,11 @@ import { Module } from '@nestjs/common'; import { AnthonyMaysLoader } from './anthony_mays_loader.js'; import { DylanLaffertysLoader } from './dylan_lafferty_loaders.js'; +import { OliviaJamesLoader } from './olivia_james_loader.js'; export const Loaders = Symbol.for('Loaders'); -const LOADER_PROVIDERS = [AnthonyMaysLoader, DylanLaffertysLoader]; +const LOADER_PROVIDERS = [AnthonyMaysLoader, DylanLaffertysLoader, OliviaJamesLoader]; @Module({ providers: [ diff --git a/lesson_10/libraries/src/loaders/olivia_james_loader.ts b/lesson_10/libraries/src/loaders/olivia_james_loader.ts new file mode 100644 index 000000000..4d4b41f28 --- /dev/null +++ b/lesson_10/libraries/src/loaders/olivia_james_loader.ts @@ -0,0 +1,53 @@ +import csv from 'csv-parser'; +import fs from 'fs'; +import { Credit, MediaItem } from '../models/index.js'; +import { Loader } from './loader.js'; + + +export class OliviaJamesLoader implements Loader { + getLoaderName(): string { + return 'oliviajames'; + } + + + 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 { + const Media = []; + const readable = fs + + + .createReadStream('data/media_items.csv', 'utf-8') + .pipe(csv()); + for await (const row of readable) { + const { id, title, type, year } = row; + Media.push(new MediaItem(id, title, type, year, [])); + } + return Media; + } + + + 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; + } +}