diff --git a/packages/inbound-email-handler/src/axios-handler.ts b/packages/inbound-email-handler/src/axios-handler.ts index 7af57daa9..706d11047 100644 --- a/packages/inbound-email-handler/src/axios-handler.ts +++ b/packages/inbound-email-handler/src/axios-handler.ts @@ -5,5 +5,6 @@ export class AxiosHandler extends NewsletterHandler { super() this.senderRegex = /<.+@axios.com>/ this.urlRegex = /View in browser at (.*)<\/a>/ + this.defaultUrl = 'https://axios.com' } } diff --git a/packages/inbound-email-handler/src/bloomberg-handler.ts b/packages/inbound-email-handler/src/bloomberg-handler.ts index d3dad1961..a60736461 100644 --- a/packages/inbound-email-handler/src/bloomberg-handler.ts +++ b/packages/inbound-email-handler/src/bloomberg-handler.ts @@ -3,7 +3,8 @@ import { NewsletterHandler } from './newsletter' export class BloombergHandler extends NewsletterHandler { constructor() { super() - this.senderRegex = /<.+@mail.bloombergbusiness.com>/ + this.senderRegex = /<.+@mail.bloomberg.*.com>/ this.urlRegex = // this.urlRegex = /Read on the Web<\/a>/ + this.defaultUrl = 'https://golangweekly.com/' } } diff --git a/packages/inbound-email-handler/src/newsletter.ts b/packages/inbound-email-handler/src/newsletter.ts index ccbb4ba2b..98b8d84e9 100644 --- a/packages/inbound-email-handler/src/newsletter.ts +++ b/packages/inbound-email-handler/src/newsletter.ts @@ -12,6 +12,7 @@ const CONFIRMATION_CODE_PATTERN = /^\\(#\\d+\\)/ export class NewsletterHandler { protected senderRegex = /NEWSLETTER_SENDER_REGEX/ protected urlRegex = /NEWSLETTER_URL_REGEX/ + protected defaultUrl = 'NEWSLETTER_DEFAULT_URL' isNewsletter(_rawUrl: string, from: string): boolean { // Axios newsletter is from @@ -19,7 +20,7 @@ export class NewsletterHandler { return re.test(from) } - getNewsletterUrl(rawUrl: string, html: string): string | undefined { + getNewsletterUrl(_rawUrl: string, html: string): string | undefined { // get newsletter url from html const matches = html.match(this.urlRegex) if (matches) { @@ -53,13 +54,8 @@ export class NewsletterHandler { throw new Error('invalid newsletter email') } - const url = this.getNewsletterUrl(rawUrl, html) - console.log('url', url) - if (!url) { - console.log('invalid newsletter url', url) - throw new Error('invalid newsletter url') - } - + // fallback to default url if newsletter url does not exist + const url = this.getNewsletterUrl(rawUrl, html) || this.defaultUrl const author = this.getAuthor(from) const message = { diff --git a/packages/inbound-email-handler/src/substack-handler.ts b/packages/inbound-email-handler/src/substack-handler.ts index ac0e54d1b..02530c30b 100644 --- a/packages/inbound-email-handler/src/substack-handler.ts +++ b/packages/inbound-email-handler/src/substack-handler.ts @@ -1,10 +1,18 @@ import { NewsletterHandler } from './newsletter' +import addressparser from 'addressparser' export class SubstackHandler extends NewsletterHandler { + constructor() { + super() + this.defaultUrl = 'https://www.substack.com/' + } + getNewsletterUrl(rawUrl: string, _html: string): string | undefined { // raw SubStack newsletter url is like - // we need to get the real url - return rawUrl.slice(1, -1) + // we need to get the real url from the raw url + return addressparser(rawUrl).length > 0 + ? addressparser(rawUrl)[0].name + : undefined } isNewsletter(rawUrl: string, _from: string): boolean { diff --git a/packages/inbound-email-handler/test/newsletter.test.ts b/packages/inbound-email-handler/test/newsletter.test.ts index 3cd6d7824..bda334237 100644 --- a/packages/inbound-email-handler/test/newsletter.test.ts +++ b/packages/inbound-email-handler/test/newsletter.test.ts @@ -30,9 +30,20 @@ describe('Newsletter email test', () => { expect(getNewsletterHandler('', from)).to.be.instanceof(AxiosHandler) }) - it('should return BloombergHandler when email is from Bloomberg', () => { - const from = 'From: Bloomberg ' - expect(getNewsletterHandler('', from)).to.be.instanceof(BloombergHandler) + context('when email is from Bloomberg', () => { + it('should return BloombergHandler when email is from Bloomberg Business', () => { + const from = 'From: Bloomberg ' + expect(getNewsletterHandler('', from)).to.be.instanceof( + BloombergHandler + ) + }) + + it('should return BloombergHandler when email is from Bloomberg View', () => { + const from = 'From: Bloomberg ' + expect(getNewsletterHandler('', from)).to.be.instanceof( + BloombergHandler + ) + }) }) it('should return GolangHandler when email is from Golang Weekly', () => {