diff --git a/packages/api/src/events/user/user_created.ts b/packages/api/src/events/user/user_created.ts index 2f1460770..da6bbea76 100644 --- a/packages/api/src/events/user/user_created.ts +++ b/packages/api/src/events/user/user_created.ts @@ -10,6 +10,7 @@ import { IntercomClient } from '../../utils/intercom' import { createPubSubClient } from '../../datalayer/pubsub' import { env } from '../../env' import { analytics } from '../../utils/analytics' +import { addPopularReadsForNewUser } from '../../services/popular_reads' @EventSubscriber() export class FollowOmnivoreUser implements EntitySubscriberInterface { @@ -114,3 +115,17 @@ export class PublishNewUserEvent implements EntitySubscriberInterface { ) } } + +@EventSubscriber() +export class AddPopularReadsToNewUser + implements EntitySubscriberInterface +{ + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + listenTo() { + return Profile + } + + async afterInsert(event: InsertEvent): Promise { + await addPopularReadsForNewUser(event.entity.user.id) + } +} diff --git a/packages/api/src/services/popular_reads.ts b/packages/api/src/services/popular_reads.ts index efc00a926..fef94277a 100644 --- a/packages/api/src/services/popular_reads.ts +++ b/packages/api/src/services/popular_reads.ts @@ -19,6 +19,12 @@ type PopularRead = { originalHtml: string } +interface AddPopularReadResult { + pageId?: string + name: string + status: ArticleSavingRequestStatus +} + const popularRead = (key: string): PopularRead | undefined => { const metadata = popularReads.find((pr) => pr.key === key) if (!metadata) { @@ -88,6 +94,35 @@ export const addPopularRead = async ( return pageId } +const addPopularReads = async ( + userId: string, + ...names: string[] +): Promise => { + const results: AddPopularReadResult[] = [] + for (const name of names) { + const pageId = await addPopularRead(userId, name) + results.push({ + pageId, + name, + status: pageId + ? ArticleSavingRequestStatus.Succeeded + : ArticleSavingRequestStatus.Failed, + }) + } + return results +} + +export const addPopularReadsForNewUser = async ( + userId: string +): Promise => { + await addPopularReads( + userId, + 'omnivore_get_started', + 'power_read_it_later', + 'omnivore_organize' + ) +} + const popularReads = [ { key: 'omnivore_get_started', diff --git a/packages/api/test/routers/auth.test.ts b/packages/api/test/routers/auth.test.ts index 9dfb301ee..7e1f1eaa5 100644 --- a/packages/api/test/routers/auth.test.ts +++ b/packages/api/test/routers/auth.test.ts @@ -14,6 +14,8 @@ import { } from '../../src/utils/auth' import sinonChai from 'sinon-chai' import chai, { expect } from 'chai' +import { searchPages } from '../../src/elastic/pages' +import { createPendingUserToken } from '../../src/routers/auth/jwt_helpers' chai.use(sinonChai) @@ -546,4 +548,54 @@ describe('auth router', () => { }) }) }) + + describe('create account', () => { + const createAccountRequest = ( + bio: string, + name: string, + username: string, + pendingUserAuth: string + ): supertest.Test => { + return request + .post(`${route}/create-account`) + .set('Cookie', [`pendingUserAuth=${pendingUserAuth}`]) + .send({ + name, + bio, + username, + }) + } + + context('when inputs are valid and user not exists', () => { + let name = 'test_user' + let username = 'test_user' + + after(async () => { + await deleteTestUser(username) + }) + + it('adds popular reads to the library', async () => { + const pendingUserToken = await createPendingUserToken({ + sourceUserId: 'test_source_user_id', + email: 'test_user@omnivore.app', + provider: 'APPLE', + name, + username, + }) + await createAccountRequest( + '', + name, + username, + pendingUserToken! + ).expect(200) + const user = await getRepository(User).findOneBy({ name }) + const [popularReads, count] = (await searchPages({}, user?.id!)) || [ + [], + 0, + ] + + expect(count).to.eql(3) + }) + }) + }) })