From 713b3552ebd4ed3995264e6d9f10b8606be71aa2 Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Wed, 16 Oct 2024 20:10:45 +0000 Subject: [PATCH 01/12] feat: started work on Xavier's lesson_10 parse CSV files/finished extra credit 1 --- .../libraries/src/loaders/loaders.module.ts | 4 +- .../src/loaders/xavier_cruz_loader.ts | 55 +++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) 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..d454e2dec 100644 --- a/lesson_10/libraries/src/loaders/loaders.module.ts +++ b/lesson_10/libraries/src/loaders/loaders.module.ts @@ -1,10 +1,10 @@ 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..425aef8d6 --- /dev/null +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -0,0 +1,55 @@ +import csv from 'csv-parser'; +import fs from 'fs'; +import { Credit, MediaItem } 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`, + ); + + for (let i = 0; i < mediaItems.length; i++) { + if (i < 100) { + mediaItems[i].addCredit(credits[i] as Credit); //tests pass however people in credits dont match up to the movies?? + } + } + + 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; + } + + //PARSE CSV MANUALLY - Extra Credit + 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; + credits.push({ mediaItemId, name, role }); + } + return credits; + } +} From 78e7b16ed093534df886efead9a45d6daa407058 Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Wed, 16 Oct 2024 23:19:51 +0000 Subject: [PATCH 02/12] feat: manually parsed CSV for credits --- .../src/loaders/xavier_cruz_loader.ts | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts index 425aef8d6..5e0075273 100644 --- a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -1,6 +1,6 @@ import csv from 'csv-parser'; import fs from 'fs'; -import { Credit, MediaItem } from '../models/index.js'; +import { Credit, MediaItem, Role } from '../models/index.js'; import { Loader } from './loader.js'; export class XavierCruzLoader implements Loader { @@ -42,14 +42,32 @@ export class XavierCruzLoader implements Loader { //PARSE CSV MANUALLY - Extra Credit 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; - credits.push({ mediaItemId, name, role }); + const filePath = 'data/credits.csv'; + const fileContents = fs.readFileSync(filePath, 'utf-8'); + + const lines = fileContents.split('\n'); + const newString = lines.slice(1); + const trimmedString = newString; + + for (let i = 0; i < trimmedString.length; i++) { + trimmedString[i] = trimmedString[i].substring( + trimmedString[i].indexOf(',') + 1, + ); } + + // help from ChatGPT - Fixing the roleStr as Role issue + const credits: Credit[] = trimmedString.map((credit) => { + const [mediaItemId, roleStr, name] = credit.split(','); + + const role: Role = roleStr as Role; + + return { + mediaItemId, + role, + name, + }; + }); + return credits; } } From 4ea9f8a7e777e59ae3fbe7120dd9d85c68cc9066 Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Wed, 16 Oct 2024 23:22:25 +0000 Subject: [PATCH 03/12] chore: removed extra variable --- lesson_10/libraries/src/loaders/xavier_cruz_loader.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts index 5e0075273..fc83e4bf6 100644 --- a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -47,18 +47,16 @@ export class XavierCruzLoader implements Loader { const lines = fileContents.split('\n'); const newString = lines.slice(1); - const trimmedString = newString; - for (let i = 0; i < trimmedString.length; i++) { - trimmedString[i] = trimmedString[i].substring( - trimmedString[i].indexOf(',') + 1, - ); + for (let i = 0; i < newString.length; i++) { + newString[i] = newString[i].substring(newString[i].indexOf(',') + 1); } // help from ChatGPT - Fixing the roleStr as Role issue - const credits: Credit[] = trimmedString.map((credit) => { + const credits: Credit[] = newString.map((credit) => { const [mediaItemId, roleStr, name] = credit.split(','); + // cast roleStr to Role type const role: Role = roleStr as Role; return { From 633f562c5d015e8114b2cb090646039dc7c6c9c8 Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Wed, 16 Oct 2024 23:28:13 +0000 Subject: [PATCH 04/12] chore: removed hardcoded 100 and replaced with half of media items length --- lesson_10/libraries/src/loaders/xavier_cruz_loader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts index fc83e4bf6..bcc812e09 100644 --- a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -17,7 +17,7 @@ export class XavierCruzLoader implements Loader { ); for (let i = 0; i < mediaItems.length; i++) { - if (i < 100) { + if (i < mediaItems.length / 2) { mediaItems[i].addCredit(credits[i] as Credit); //tests pass however people in credits dont match up to the movies?? } } From e3db735fa2c12249b7edb5de1cd0be459f1d8385 Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Wed, 16 Oct 2024 23:29:23 +0000 Subject: [PATCH 05/12] chore: removed out of context/resolved comments --- lesson_10/libraries/src/loaders/xavier_cruz_loader.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts index bcc812e09..541b5d7cd 100644 --- a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -18,7 +18,7 @@ export class XavierCruzLoader implements Loader { for (let i = 0; i < mediaItems.length; i++) { if (i < mediaItems.length / 2) { - mediaItems[i].addCredit(credits[i] as Credit); //tests pass however people in credits dont match up to the movies?? + mediaItems[i].addCredit(credits[i] as Credit); } } @@ -26,7 +26,6 @@ export class XavierCruzLoader implements Loader { } async loadMediaItems(): Promise { - // TODO: Implement this method. const mediaItems = []; const readable = fs .createReadStream('data/media_items.csv', 'utf-8') @@ -40,7 +39,6 @@ export class XavierCruzLoader implements Loader { return mediaItems; } - //PARSE CSV MANUALLY - Extra Credit async loadCredits(): Promise { const filePath = 'data/credits.csv'; const fileContents = fs.readFileSync(filePath, 'utf-8'); From 9abb8d6b68c8afa21c93a0c9cec38df82abcd5cb Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Thu, 17 Oct 2024 13:09:26 +0000 Subject: [PATCH 06/12] feat: updated credits to be a class, parsed with new class --- lesson_10/libraries/src/loaders/xavier_cruz_loader.ts | 6 +----- lesson_10/libraries/src/models/credit.ts | 8 +++++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts index 541b5d7cd..9d48a69f4 100644 --- a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -57,11 +57,7 @@ export class XavierCruzLoader implements Loader { // cast roleStr to Role type const role: Role = roleStr as Role; - return { - mediaItemId, - role, - name, - }; + return new Credit(mediaItemId, name, role); }); return credits; diff --git a/lesson_10/libraries/src/models/credit.ts b/lesson_10/libraries/src/models/credit.ts index 608c8e2aa..fb9cee262 100644 --- a/lesson_10/libraries/src/models/credit.ts +++ b/lesson_10/libraries/src/models/credit.ts @@ -1,7 +1,13 @@ import { Role } from './role.js'; -export interface Credit { +export class Credit { mediaItemId: string; name: string; role: Role; + + constructor(mediaItemId: string, name: string, role: Role) { + this.mediaItemId = mediaItemId; + this.name = name; + this.role = role; + } } From ac8ea519f9f6669c511eaa37394913ac43dcd370 Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Thu, 17 Oct 2024 14:31:30 +0000 Subject: [PATCH 07/12] fix: fixed credit class --- lesson_10/libraries/src/models/credit.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lesson_10/libraries/src/models/credit.ts b/lesson_10/libraries/src/models/credit.ts index 9563bf0a2..c90c0f65e 100644 --- a/lesson_10/libraries/src/models/credit.ts +++ b/lesson_10/libraries/src/models/credit.ts @@ -5,10 +5,6 @@ export class Credit { name: string; role: Role; - private mediaItemId: string; - private name: string; - private role: Role; - constructor(mediaItemId: string, name: string, role: Role) { this.mediaItemId = mediaItemId; this.name = name; From 3f6d26839fa67b330d59ec250161e18a34148cff Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Thu, 17 Oct 2024 16:06:08 +0000 Subject: [PATCH 08/12] feat: fixed connecting of credits to mediaItems --- .../libraries/src/loaders/xavier_cruz_loader.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts index 9d48a69f4..a4681ce81 100644 --- a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -16,10 +16,14 @@ export class XavierCruzLoader implements Loader { `Loaded ${credits.length} credits and ${mediaItems.length} media items`, ); + let counter = 0; for (let i = 0; i < mediaItems.length; i++) { if (i < mediaItems.length / 2) { - mediaItems[i].addCredit(credits[i] as Credit); + mediaItems[i].addCredit(credits[counter] as Credit); + counter++; + mediaItems[i].addCredit(credits[counter] as Credit); } + counter++; } return [...mediaItems.values()]; @@ -44,14 +48,16 @@ export class XavierCruzLoader implements Loader { const fileContents = fs.readFileSync(filePath, 'utf-8'); const lines = fileContents.split('\n'); - const newString = lines.slice(1); + const contentByLine = lines.slice(1); - for (let i = 0; i < newString.length; i++) { - newString[i] = newString[i].substring(newString[i].indexOf(',') + 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[] = newString.map((credit) => { + const credits: Credit[] = contentByLine.map((credit) => { const [mediaItemId, roleStr, name] = credit.split(','); // cast roleStr to Role type From 108aca8b56708a72b18b4d0da0c7d0b1cbee3ebc Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Thu, 17 Oct 2024 17:27:30 +0000 Subject: [PATCH 09/12] Revert "feat: updated credits to be a class, parsed with new class" This reverts commit 9abb8d6b68c8afa21c93a0c9cec38df82abcd5cb. --- .../src/loaders/xavier_cruz_loader.ts | 6 +++++- lesson_10/libraries/src/models/credit.ts | 20 +------------------ 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts index a4681ce81..53e53066c 100644 --- a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -63,7 +63,11 @@ export class XavierCruzLoader implements Loader { // cast roleStr to Role type const role: Role = roleStr as Role; - return new Credit(mediaItemId, name, role); + return { + mediaItemId, + role, + name, + }; }); return credits; diff --git a/lesson_10/libraries/src/models/credit.ts b/lesson_10/libraries/src/models/credit.ts index c90c0f65e..608c8e2aa 100644 --- a/lesson_10/libraries/src/models/credit.ts +++ b/lesson_10/libraries/src/models/credit.ts @@ -1,25 +1,7 @@ import { Role } from './role.js'; -export class Credit { +export interface Credit { mediaItemId: string; name: string; role: Role; - - constructor(mediaItemId: string, name: string, role: Role) { - this.mediaItemId = mediaItemId; - this.name = name; - this.role = role; - } - - getMediaItemId(): string { - return this.mediaItemId; - } - - getName(): string { - return this.name; - } - - getRole(): Role { - return this.role; - } } From 0184e037f6ae574c0bac340211b4a1d6ec6aafac Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Thu, 17 Oct 2024 17:31:20 +0000 Subject: [PATCH 10/12] feat: credit.ts matches credit.ts in main --- .../src/loaders/xavier_cruz_loader.ts | 6 +---- lesson_10/libraries/src/models/credit.ts | 26 ++++++++++++++++--- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts index 53e53066c..a4681ce81 100644 --- a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -63,11 +63,7 @@ export class XavierCruzLoader implements Loader { // cast roleStr to Role type const role: Role = roleStr as Role; - return { - mediaItemId, - role, - name, - }; + return new Credit(mediaItemId, name, role); }); return credits; diff --git a/lesson_10/libraries/src/models/credit.ts b/lesson_10/libraries/src/models/credit.ts index 608c8e2aa..cbf3e7ba1 100644 --- a/lesson_10/libraries/src/models/credit.ts +++ b/lesson_10/libraries/src/models/credit.ts @@ -1,7 +1,25 @@ import { Role } from './role.js'; -export interface Credit { - mediaItemId: string; - name: string; - role: Role; +export class Credit { + private mediaItemId: string; + private name: string; + private role: Role; + + constructor(mediaItemId: string, name: string, role: Role) { + this.mediaItemId = mediaItemId; + this.name = name; + this.role = role; + } + + getMediaItemId(): string { + return this.mediaItemId; + } + + getName(): string { + return this.name; + } + + getRole(): Role { + return this.role; + } } From 1315a11825707d2d999fb28eb166d12d278cc0d8 Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Thu, 17 Oct 2024 17:45:14 +0000 Subject: [PATCH 11/12] feat: reworked credit adding to each media item --- .../libraries/src/loaders/xavier_cruz_loader.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts index a4681ce81..f67465f49 100644 --- a/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts +++ b/lesson_10/libraries/src/loaders/xavier_cruz_loader.ts @@ -16,15 +16,15 @@ export class XavierCruzLoader implements Loader { `Loaded ${credits.length} credits and ${mediaItems.length} media items`, ); - let counter = 0; - for (let i = 0; i < mediaItems.length; i++) { - if (i < mediaItems.length / 2) { - mediaItems[i].addCredit(credits[counter] as Credit); - counter++; - mediaItems[i].addCredit(credits[counter] as Credit); + credits.forEach((credit) => { + const mediaItem = mediaItems.find( + (media) => media.getId() === credit.getMediaItemId(), + ); + + if (mediaItem) { + mediaItem.addCredit(credit); } - counter++; - } + }); return [...mediaItems.values()]; } From 629316568eed978eb16a9ca2e43440ccfda8dafd Mon Sep 17 00:00:00 2001 From: XavierCruz5106 Date: Thu, 17 Oct 2024 18:03:43 +0000 Subject: [PATCH 12/12] chore: formatting/organizing imports loaders.modules --- lesson_10/libraries/src/loaders/loaders.module.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lesson_10/libraries/src/loaders/loaders.module.ts b/lesson_10/libraries/src/loaders/loaders.module.ts index d454e2dec..5997b6f7e 100644 --- a/lesson_10/libraries/src/loaders/loaders.module.ts +++ b/lesson_10/libraries/src/loaders/loaders.module.ts @@ -1,6 +1,7 @@ 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.