diff --git a/packages/api/src/resolvers/recent_emails/index.ts b/packages/api/src/resolvers/recent_emails/index.ts index a6ab31e19..3eb685544 100644 --- a/packages/api/src/resolvers/recent_emails/index.ts +++ b/packages/api/src/resolvers/recent_emails/index.ts @@ -12,10 +12,7 @@ import { getRepository } from '../../entity/utils' import { ReceivedEmail } from '../../entity/received_email' import { saveNewsletterEmail } from '../../services/save_newsletter_email' import { NewsletterEmail } from '../../entity/newsletter_email' -import { v4 as uuid } from 'uuid' - -const FAKE_URL_PREFIX = 'https://omnivore.app/no_url?q=' -const generateUniqueUrl = () => FAKE_URL_PREFIX + uuid() +import { generateUniqueUrl, parseEmailAddress } from '../../utils/parser' export const recentEmailsResolver = authorized< RecentEmailsSuccess, @@ -98,7 +95,7 @@ export const markEmailAsItemResolver = authorized< text: recentEmail.text, content: recentEmail.html, url: generateUniqueUrl(), - author: '', + author: parseEmailAddress(recentEmail.from).name, receivedEmailId: recentEmail.id, }, newsletterEmail diff --git a/packages/api/src/services/save_newsletter_email.ts b/packages/api/src/services/save_newsletter_email.ts index 4be80572b..bc4bcbfd2 100644 --- a/packages/api/src/services/save_newsletter_email.ts +++ b/packages/api/src/services/save_newsletter_email.ts @@ -12,6 +12,7 @@ import { NewsletterEmail } from '../entity/newsletter_email' import { fetchFavicon } from '../utils/parser' import { updatePage } from '../elastic/pages' import { isBase64Image } from '../utils/helpers' +import { updateReceivedEmail } from './received_emails' export interface NewsletterMessage { from: string @@ -63,6 +64,9 @@ export const saveNewsletterEmail = async ( return false } + // update received email type + await updateReceivedEmail(data.receivedEmailId, 'article') + if (!page.siteIcon || isBase64Image(page.siteIcon)) { // fetch favicon if not already set or is a base64 image const favicon = await fetchFavicon(page.url) diff --git a/packages/api/test/routers/emails.test.ts b/packages/api/test/routers/emails.test.ts index ef6229126..21486c5e5 100644 --- a/packages/api/test/routers/emails.test.ts +++ b/packages/api/test/routers/emails.test.ts @@ -11,12 +11,19 @@ import { request } from '../util' import * as parser from '../../src/utils/parser' import * as sendNotification from '../../src/utils/sendNotification' import * as sendEmail from '../../src/utils/sendEmail' +import { getRepository } from '../../src/entity/utils' +import { ReceivedEmail } from '../../src/entity/received_email' describe('Emails Router', () => { const newsletterEmail = 'fakeUser@omnivore.app' + const from = 'fake from' + const subject = 'fake subject' + const text = 'fake text' + const to = newsletterEmail let user: User let token: string + let receivedEmail: ReceivedEmail before(async () => { // create test user and login @@ -24,6 +31,15 @@ describe('Emails Router', () => { await createTestNewsletterEmail(user, newsletterEmail) token = process.env.PUBSUB_VERIFICATION_TOKEN! + receivedEmail = await getRepository(ReceivedEmail).save({ + user: { id: user.id }, + from, + to, + subject, + text, + html: '', + type: 'non-article', + }) }) after(async () => { @@ -33,11 +49,7 @@ describe('Emails Router', () => { }) describe('forward', () => { - const from = 'from@omnivore.app' - const to = newsletterEmail - const subject = 'test subject' const html = 'test html' - const text = 'test text' beforeEach(async () => { sinon.replace( @@ -61,7 +73,14 @@ describe('Emails Router', () => { const data = { message: { data: Buffer.from( - JSON.stringify({ from, to, subject, html, text }) + JSON.stringify({ + from, + to, + subject, + html, + text, + receivedEmailId: receivedEmail.id, + }) ).toString('base64'), publishTime: new Date().toISOString(), }, @@ -83,7 +102,14 @@ describe('Emails Router', () => { const data = { message: { data: Buffer.from( - JSON.stringify({ from, to, subject, html, text }) + JSON.stringify({ + from, + to, + subject, + html, + text, + receivedEmailId: receivedEmail.id, + }) ).toString('base64'), publishTime: new Date().toISOString(), }, diff --git a/packages/api/test/services/save_newsletter_email.test.ts b/packages/api/test/services/save_newsletter_email.test.ts index 9295024a3..3de0be158 100644 --- a/packages/api/test/services/save_newsletter_email.test.ts +++ b/packages/api/test/services/save_newsletter_email.test.ts @@ -12,15 +12,19 @@ import { getPageByParam } from '../../src/elastic/pages' import nock from 'nock' import { getRepository } from '../../src/entity/utils' import { Subscription } from '../../src/entity/subscription' +import { ReceivedEmail } from '../../src/entity/received_email' describe('saveNewsletterEmail', () => { const fakeContent = 'fake content' const title = 'fake title' const author = 'fake author' + const from = 'fake from' + const text = 'fake text' let user: User let newsletterEmail: NewsletterEmail let ctx: SaveContext + let receivedEmail: ReceivedEmail before(async () => { user = await createTestUser('fakeUser') @@ -30,6 +34,15 @@ describe('saveNewsletterEmail', () => { refresh: true, uid: user.id, } + receivedEmail = await getRepository(ReceivedEmail).save({ + user: { id: user.id }, + from, + to: newsletterEmail.address, + subject: title, + text, + html: '', + type: 'non-article', + }) }) after(async () => { @@ -42,14 +55,14 @@ describe('saveNewsletterEmail', () => { await saveNewsletterEmail( { - from: 'fake from', - text: 'fake text', + from, + text, email: newsletterEmail.address, content: `${fakeContent}`, url, title, author, - receivedEmailId: '', + receivedEmailId: receivedEmail.id, }, newsletterEmail, ctx @@ -66,6 +79,12 @@ describe('saveNewsletterEmail', () => { newsletterEmail: { id: newsletterEmail.id }, }) expect(subscriptions).not.to.be.empty + + // check if the received email was updated + const updatedReceivedEmail = await getRepository(ReceivedEmail).findOneBy({ + id: receivedEmail.id, + }) + expect(updatedReceivedEmail?.type).to.equal('article') }) it('should adds a Newsletter label to that page', async () => { @@ -82,9 +101,9 @@ describe('saveNewsletterEmail', () => { url, title, author, - from: 'fake from', - text: 'fake text', - receivedEmailId: '', + from, + text, + receivedEmailId: receivedEmail.id, }, newsletterEmail, ctx diff --git a/packages/inbound-email-handler/src/index.ts b/packages/inbound-email-handler/src/index.ts index b987178eb..5b214b1dd 100644 --- a/packages/inbound-email-handler/src/index.ts +++ b/packages/inbound-email-handler/src/index.ts @@ -133,8 +133,6 @@ export const inboundEmailHandler = Sentry.GCPFunction.wrapHttpFunction( if (newsletterMessage) { await publishMessage(NEWSLETTER_EMAIL_RECEIVED_TOPIC, { ...newsletterMessage, - text, - from, receivedEmailId, }) return res.status(200).send('newsletter received')