This commit is contained in:
Hongbo Wu 2023-01-19 09:38:21 +08:00
parent 8f9c317dd1
commit 7dbf8662fc
5 changed files with 63 additions and 19 deletions

View file

@ -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

View file

@ -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)

View file

@ -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 = '<html>test html</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(),
},

View file

@ -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: `<html><body>${fakeContent}</body></html>`,
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

View file

@ -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')