From 9ae81d73943659fdfe9bf2b47d3b895b4efa2509 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 8 Mar 2022 14:00:35 -0800 Subject: [PATCH 1/6] Add extra debugging on newsletter save errors --- packages/api/src/services/save_email.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/api/src/services/save_email.ts b/packages/api/src/services/save_email.ts index dbb0a8ed5..7fddd9558 100644 --- a/packages/api/src/services/save_email.ts +++ b/packages/api/src/services/save_email.ts @@ -86,11 +86,14 @@ export const saveEmail = async ( savedAt: new Date(), archivedAt: null, }) + console.log('save matched email article record', result) + } else { await ctx.pubsub.pageCreated(saverId, url, input.originalContent) await kx.transaction(async (tx) => { const articleRecord = await ctx.models.article.create(articleToSave, tx) + console.log('save new email article record', articleRecord) result = await ctx.models.userArticle.create( { @@ -102,6 +105,8 @@ export const saveEmail = async ( }, tx ) + + console.log('save new email result', result) }) } From b982bf34d6095ed22d32f00d568548ecfe9ed609 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 8 Mar 2022 14:43:10 -0800 Subject: [PATCH 2/6] SetClaims on userArticle create/update in saveEmail --- packages/api/src/services/save_email.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/api/src/services/save_email.ts b/packages/api/src/services/save_email.ts index 7fddd9558..842f303ae 100644 --- a/packages/api/src/services/save_email.ts +++ b/packages/api/src/services/save_email.ts @@ -9,6 +9,7 @@ import { import normalizeUrl from 'normalize-url' import { kx } from '../datalayer/knex_config' import { UserArticleData } from '../datalayer/links/model' +import { setClaims } from '../datalayer/helpers' export type SaveContext = { pubsub: PubsubClient @@ -82,16 +83,21 @@ export const saveEmail = async ( if (matchedUserArticleRecord) { await ctx.pubsub.pageCreated(saverId, url, input.originalContent) - result = await ctx.models.userArticle.update(matchedUserArticleRecord.id, { - savedAt: new Date(), - archivedAt: null, - }) - console.log('save matched email article record', result) + await kx.transaction(async (tx) => { + await setClaims(tx, saverId) + result = await ctx.models.userArticle.update(matchedUserArticleRecord.id, { + savedAt: new Date(), + archivedAt: null, + }) + }) + console.log('save matched email article record', result, matchedUserArticleRecord) } else { await ctx.pubsub.pageCreated(saverId, url, input.originalContent) await kx.transaction(async (tx) => { + await setClaims(tx, saverId) + const articleRecord = await ctx.models.article.create(articleToSave, tx) console.log('save new email article record', articleRecord) From 26dadab4aa4942cc484e7ca96516d8a6c4c025ff Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 8 Mar 2022 15:10:01 -0800 Subject: [PATCH 3/6] rm debug, we dont need to set claims on create --- packages/api/src/services/save_email.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/api/src/services/save_email.ts b/packages/api/src/services/save_email.ts index 842f303ae..132f136fb 100644 --- a/packages/api/src/services/save_email.ts +++ b/packages/api/src/services/save_email.ts @@ -85,22 +85,16 @@ export const saveEmail = async ( await kx.transaction(async (tx) => { await setClaims(tx, saverId) - result = await ctx.models.userArticle.update(matchedUserArticleRecord.id, { savedAt: new Date(), archivedAt: null, }) }) - console.log('save matched email article record', result, matchedUserArticleRecord) } else { await ctx.pubsub.pageCreated(saverId, url, input.originalContent) await kx.transaction(async (tx) => { - await setClaims(tx, saverId) - const articleRecord = await ctx.models.article.create(articleToSave, tx) - console.log('save new email article record', articleRecord) - result = await ctx.models.userArticle.create( { userId: saverId, From 354fe36dd593a3767e106eb160273d4c19051c2e Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 8 Mar 2022 15:17:11 -0800 Subject: [PATCH 4/6] Add a test for save email --- packages/api/test/services/save_email.test.ts | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 packages/api/test/services/save_email.test.ts diff --git a/packages/api/test/services/save_email.test.ts b/packages/api/test/services/save_email.test.ts new file mode 100644 index 000000000..586a60dab --- /dev/null +++ b/packages/api/test/services/save_email.test.ts @@ -0,0 +1,58 @@ +import 'mocha' +import { expect } from 'chai' +import 'chai/register-should' +import { + createTestUser, + deleteTestUser, +} from '../db' +import { SaveContext, saveEmail } from '../../src/services/save_email' +import { getRepository } from 'typeorm' +import { Link } from '../../src/entity/link' +import { initModels } from '../../src/server' +import { kx } from '../../src/datalayer/knex_config' +import { createPubSubClient } from '../../src/datalayer/pubsub' + +describe('saveEmail', () => { + const username = 'fakeUser' + after(async () => { + await deleteTestUser(username) + }) + + it('doesnt fail if saved twice', async () => { + const user = await createTestUser(username) + const ctx: SaveContext = { + models: initModels(kx, false), + pubsub: createPubSubClient(), + } + + await saveEmail(ctx, user.id, { + originalContent: 'fake content', + url: 'https://example.com', + title: 'fake title', + author: 'fake author', + }) + + // This ensures row level security doesnt prevent + // resaving the same URL + const secondResult = await saveEmail(ctx, user.id, { + originalContent: 'fake content', + url: 'https://example.com', + title: 'fake title', + author: 'fake author', + }) + expect(secondResult).to.not.be.undefined + + const links = await getRepository(Link).find({ + where: { + user: user, + }, + relations: ['page'], + }) + + expect(links.length).to.equal(1) + expect(links[0].page.url).to.equal('https://example.com') + expect(links[0].page.title).to.equal('fake title') + expect(links[0].page.author).to.equal('fake author') + expect(links[0].page.content).to.contain('fake content') + }).timeout(10000) +}) From e8fca4a7a95fb9d1df93daee74cc487c304007e2 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 8 Mar 2022 15:20:24 -0800 Subject: [PATCH 5/6] Remove debug line --- packages/api/src/services/save_email.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/api/src/services/save_email.ts b/packages/api/src/services/save_email.ts index 132f136fb..887916c5b 100644 --- a/packages/api/src/services/save_email.ts +++ b/packages/api/src/services/save_email.ts @@ -105,8 +105,6 @@ export const saveEmail = async ( }, tx ) - - console.log('save new email result', result) }) } From c45c408c14a3e204fd0c03119861a92fdcac2b6e Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 8 Mar 2022 15:27:05 -0800 Subject: [PATCH 6/6] Fix formatting --- packages/api/src/services/save_email.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/api/src/services/save_email.ts b/packages/api/src/services/save_email.ts index 887916c5b..306657c19 100644 --- a/packages/api/src/services/save_email.ts +++ b/packages/api/src/services/save_email.ts @@ -85,10 +85,13 @@ export const saveEmail = async ( await kx.transaction(async (tx) => { await setClaims(tx, saverId) - result = await ctx.models.userArticle.update(matchedUserArticleRecord.id, { - savedAt: new Date(), - archivedAt: null, - }) + result = await ctx.models.userArticle.update( + matchedUserArticleRecord.id, + { + savedAt: new Date(), + archivedAt: null, + } + ) }) } else { await ctx.pubsub.pageCreated(saverId, url, input.originalContent)