diff --git a/apps/spin-cycle/src/mailer/mailer.service.ts b/apps/spin-cycle/src/mailer/mailer.service.ts index c92bf39..978e550 100644 --- a/apps/spin-cycle/src/mailer/mailer.service.ts +++ b/apps/spin-cycle/src/mailer/mailer.service.ts @@ -8,8 +8,8 @@ import * as process from 'node:process'; export class MailerService { private readonly logger: Logger = new Logger(MailerService.name); - sendRecommendationMail(spin: SpinEntity, user: UserEntity): Promise { - return this.sendMail([user.email], this.getRecommendationSubject(), this.getRecommendationBody(spin)); + sendRecommendationMail(spin: SpinEntity, user: UserEntity, dateAdded?: string): Promise { + return this.sendMail([user.email], this.getRecommendationSubject(), this.getRecommendationBody(spin, dateAdded)); } sendAdminSignupMail(user: UserEntity): Promise { @@ -38,16 +38,31 @@ export class MailerService { return `Your ${month} ${day} record-mendation from SpinCycle has arrived! 😤`; } - private getRecommendationBody(spin: SpinEntity): string { + private getRecommendationBody(spin: SpinEntity, dateAdded?: string): string { + const addedLine = dateAdded + ? `

This release was added to your collection on ${this.formatDate(dateAdded)}

` + : ''; + return `

Hello there!

Today's randomly selected record from your collection is:

${spin.recordName} by ${spin.artistName}

+ ${addedLine}

View record on Discogs

Happy spinning!

`; } + private formatDate(iso: string): string { + const d = new Date(iso); + if (Number.isNaN(d.getTime())) return iso; + return d.toLocaleDateString(undefined, { + year: 'numeric', + month: 'short', + day: 'numeric', + }); + } + private getClient(): IMailgunClient { return new Mailgun(FormData).client({ username: 'api', diff --git a/apps/spin-cycle/src/worker/worker.service.ts b/apps/spin-cycle/src/worker/worker.service.ts index 7757e6b..c49b998 100644 --- a/apps/spin-cycle/src/worker/worker.service.ts +++ b/apps/spin-cycle/src/worker/worker.service.ts @@ -42,11 +42,11 @@ export class WorkerService { return this.markUserAsAllPlayed(user); } - const { discogsId, artistName, recordName } = nextSpin; + const { discogsId, artistName, recordName, dateAdded } = nextSpin; const releaseSpin: SpinEntity = new SpinEntity(null, user, discogsId, artistName, recordName, new Date()); await Promise.all([ this.spinsService.create(releaseSpin), - this.mailerService.sendRecommendationMail(releaseSpin, user), + this.mailerService.sendRecommendationMail(releaseSpin, user, dateAdded), ]); } diff --git a/libs/shared/src/lib/discogs-response.ts b/libs/shared/src/lib/discogs-response.ts index ff47cb1..53d6ee3 100644 --- a/libs/shared/src/lib/discogs-response.ts +++ b/libs/shared/src/lib/discogs-response.ts @@ -4,6 +4,8 @@ export interface IDiscogsReleases extends IDiscogsResponse { export interface IDiscogsRelease { id: number; + // When the user added this release to their collection + date_added?: string; basic_information: { title: string; resource_url: string; diff --git a/libs/shared/src/lib/dto/release-out.ts b/libs/shared/src/lib/dto/release-out.ts index eb2b036..e43c7c1 100644 --- a/libs/shared/src/lib/dto/release-out.ts +++ b/libs/shared/src/lib/dto/release-out.ts @@ -4,15 +4,18 @@ export class ReleaseOut { discogsId: number; artistName: string; recordName: string; + // ISO string from Discogs indicating when the item was added to the user's collection + dateAdded?: string; - constructor(discogsId: number, artistName: string, recordName: string) { + constructor(discogsId: number, artistName: string, recordName: string, dateAdded?: string) { this.discogsId = discogsId; this.artistName = artistName; this.recordName = recordName; + this.dateAdded = dateAdded; } static fromDiscogsResponse(release: IDiscogsRelease): ReleaseOut { const joinedArtists: string = release.basic_information.artists.map((artist) => artist.name).join(', '); - return new ReleaseOut(release.id, joinedArtists, release.basic_information.title); + return new ReleaseOut(release.id, joinedArtists, release.basic_information.title, release.date_added); } }