diff --git a/packages/api/src/entity/received_email.ts b/packages/api/src/entity/received_email.ts index df8a5c705..b68289989 100644 --- a/packages/api/src/entity/received_email.ts +++ b/packages/api/src/entity/received_email.ts @@ -33,6 +33,9 @@ export class ReceivedEmail { @Column('text') html!: string + @Column('text') + type!: 'article' | 'non-article' + @CreateDateColumn({ default: () => 'CURRENT_TIMESTAMP' }) createdAt!: Date diff --git a/packages/api/src/routers/svc/emails.ts b/packages/api/src/routers/svc/emails.ts index 6c865224b..acad80358 100644 --- a/packages/api/src/routers/svc/emails.ts +++ b/packages/api/src/routers/svc/emails.ts @@ -15,6 +15,7 @@ import { } from '../../utils/parser' import { saveEmail } from '../../services/save_email' import { buildLogger } from '../../utils/logger' +import { saveReceivedEmail } from '../../services/received_emails' interface ForwardEmailMessage { from: string @@ -91,6 +92,17 @@ export function emailsServiceRouter() { url: generateUniqueUrl(), originalContent: data.html || data.text, }) + + await saveReceivedEmail( + data.from, + data.to, + data.subject, + data.text, + data.html, + user.id, + 'article' + ) + res.status(200).send('Article') return } @@ -103,6 +115,15 @@ export function emailsServiceRouter() { }, }) + await saveReceivedEmail( + data.from, + data.to, + data.subject, + data.text, + data.html, + user.id + ) + // forward non-newsletter emails to the registered email address const result = await sendEmail({ from: env.sender.message, diff --git a/packages/api/src/services/received_emails.ts b/packages/api/src/services/received_emails.ts index 272c8ff26..e1df663d4 100644 --- a/packages/api/src/services/received_emails.ts +++ b/packages/api/src/services/received_emails.ts @@ -7,7 +7,8 @@ export const saveReceivedEmail = async ( subject: string, text: string, html: string, - userId: string + userId: string, + type: 'article' | 'non-article' = 'non-article' ): Promise => { return getRepository(ReceivedEmail).save({ from, @@ -15,6 +16,7 @@ export const saveReceivedEmail = async ( subject, text, html, + type, user: { id: userId }, }) } diff --git a/packages/api/src/services/save_newsletter_email.ts b/packages/api/src/services/save_newsletter_email.ts index e81806ec1..a9e4bcda8 100644 --- a/packages/api/src/services/save_newsletter_email.ts +++ b/packages/api/src/services/save_newsletter_email.ts @@ -13,8 +13,10 @@ import { NewsletterEmail } from '../entity/newsletter_email' import { fetchFavicon } from '../utils/parser' import { updatePage } from '../elastic/pages' import { isBase64Image } from '../utils/helpers' +import { saveReceivedEmail } from './received_emails' export interface NewsletterMessage { + from: string email: string content: string url: string @@ -23,6 +25,7 @@ export interface NewsletterMessage { unsubMailTo?: string unsubHttpUrl?: string newsletterEmail?: NewsletterEmail + text: string } // Returns true if the link was created successfully. Can still fail to @@ -65,9 +68,29 @@ export const saveNewsletterEmail = async ( const page = await saveEmail(saveCtx, input) if (!page) { console.log('newsletter not created:', input) + + await saveReceivedEmail( + data.from, + data.email, + data.title, + data.text, + data.content, + newsletterEmail.user.id + ) + return false } + await saveReceivedEmail( + data.from, + data.email, + data.title, + data.text, + data.content, + newsletterEmail.user.id, + '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/db/migrations/0107.do.received_emails.sql b/packages/db/migrations/0107.do.received_emails.sql index e87966bd9..a75dbc385 100755 --- a/packages/db/migrations/0107.do.received_emails.sql +++ b/packages/db/migrations/0107.do.received_emails.sql @@ -12,6 +12,7 @@ CREATE TABLE omnivore.received_emails ( subject text NOT NULL DEFAULT '', "text" text NOT NULL, html text NOT NULL DEFAULT '', + "type" text NOT NULL, created_at timestamptz NOT NULL DEFAULT current_timestamp, updated_at timestamptz NOT NULL DEFAULT current_timestamp ); diff --git a/packages/inbound-email-handler/src/index.ts b/packages/inbound-email-handler/src/index.ts index 67d38694d..143365e92 100644 --- a/packages/inbound-email-handler/src/index.ts +++ b/packages/inbound-email-handler/src/index.ts @@ -87,10 +87,11 @@ export const inboundEmailHandler = Sentry.GCPFunction.wrapHttpFunction( title: subject, }) if (newsletterMessage) { - await publishMessage( - NEWSLETTER_EMAIL_RECEIVED_TOPIC, - newsletterMessage - ) + await publishMessage(NEWSLETTER_EMAIL_RECEIVED_TOPIC, { + ...newsletterMessage, + text, + from, + }) return res.status(200).send('newsletter received') }