From 6a45e46c5500a7de3e6b726c64ce53951ff8a2db Mon Sep 17 00:00:00 2001 From: Xavier Cruz <68714224+XavierCruz5106@users.noreply.github.com> Date: Thu, 17 Oct 2024 14:05:53 -0400 Subject: [PATCH] feat: added Xavier's CSV loader (#331) * feat: started work on Xavier's lesson_10 parse CSV files/finished extra credit 1 * feat: manually parsed CSV for credits * chore: removed extra variable * chore: removed hardcoded 100 and replaced with half of media items length * chore: removed out of context/resolved comments * feat: updated credits to be a class, parsed with new class * fix: fixed credit class * feat: fixed connecting of credits to mediaItems * Revert "feat: updated credits to be a class, parsed with new class" This reverts commit 9abb8d6b68c8afa21c93a0c9cec38df82abcd5cb. * feat: credit.ts matches credit.ts in main * feat: reworked credit adding to each media item * chore: formatting/organizing imports loaders.modules --- .../libraries/src/loaders/loaders.module.ts | 3 +- .../src/loaders/xavier_cruz_loader.ts | 71 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 lesson_10/libraries/src/loaders/xavier_cruz_loader.ts diff --git a/lesson_10/libraries/src/loaders/loaders.module.ts b/lesson_10/libraries/src/loaders/loaders.module.ts index fe823555e..5997b6f7e 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 { AnthonyMaysLoader } from './anthony_mays_loader.js'; +import { XavierCruzLoader } from './xavier_cruz_loader.js'; export const Loaders = Symbol.for('Loaders'); // Add your quiz provider here. -const LOADER_PROVIDERS = [AnthonyMaysLoader]; +const LOADER_PROVIDERS = [AnthonyMaysLoader, XavierCruzLoader]; @Module({ providers: [ diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts new file mode 100644 index 000000000..f67465f49 --- /dev/null +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -0,0 +1,71 @@ +import csv from 'csv-parser'; +import fs from 'fs'; +import { Credit, MediaItem, Role } from '../models/index.js'; +import { Loader } from './loader.js'; + +export class XavierCruzLoader implements Loader { + getLoaderName(): string { + return 'xaviercruz'; + } + + async loadData(): Promise { + const credits = await this.loadCredits(); + const mediaItems = await this.loadMediaItems(); + + console.log( + `Loaded ${credits.length} credits and ${mediaItems.length} media items`, + ); + + credits.forEach((credit) => { + const mediaItem = mediaItems.find( + (media) => media.getId() === credit.getMediaItemId(), + ); + + if (mediaItem) { + mediaItem.addCredit(credit); + } + }); + + return [...mediaItems.values()]; + } + + async loadMediaItems(): Promise { + 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 filePath = 'data/credits.csv'; + const fileContents = fs.readFileSync(filePath, 'utf-8'); + + const lines = fileContents.split('\n'); + const contentByLine = lines.slice(1); + + for (let i = 0; i < contentByLine.length; i++) { + contentByLine[i] = contentByLine[i].substring( + contentByLine[i].indexOf(',') + 1, + ); + } + + // help from ChatGPT - Fixing the roleStr as Role issue + const credits: Credit[] = contentByLine.map((credit) => { + const [mediaItemId, roleStr, name] = credit.split(','); + + // cast roleStr to Role type + const role: Role = roleStr as Role; + + return new Credit(mediaItemId, name, role); + }); + + return credits; + } +}