diff --git a/packages/auth/src/Domain/Email/OfflineSubscriptionTokenCreated.ts b/packages/auth/src/Domain/Email/OfflineSubscriptionTokenCreated.ts new file mode 100644 index 000000000..380b72cf0 --- /dev/null +++ b/packages/auth/src/Domain/Email/OfflineSubscriptionTokenCreated.ts @@ -0,0 +1,9 @@ +import { html } from './offline-subscription-token-created.html' + +export function getSubject(): string { + return 'Access to your Standard Notes Subscription Dashboard' +} + +export function getBody(email: string, offlineSubscriptionDashboardUrl: string): string { + return html(email, offlineSubscriptionDashboardUrl) +} diff --git a/packages/auth/src/Domain/Email/UserSignedIn.ts b/packages/auth/src/Domain/Email/UserSignedIn.ts index 5ed724400..62f2a06ca 100644 --- a/packages/auth/src/Domain/Email/UserSignedIn.ts +++ b/packages/auth/src/Domain/Email/UserSignedIn.ts @@ -5,11 +5,5 @@ export function getSubject(email: string): string { } export function getBody(email: string, device: string, browser: string, date: Date): string { - const body = html - - return body - .replace('%%EMAIL%%', email) - .replace('%%DEVICE%%', device) - .replace('%%BROWSER%%', browser) - .replace('%%TIME_AND_DATE%%', date.toLocaleString()) + return html(email, device, browser, date.toLocaleString()) } diff --git a/packages/auth/src/Domain/Email/offline-subscription-token-created.html.ts b/packages/auth/src/Domain/Email/offline-subscription-token-created.html.ts new file mode 100644 index 000000000..6e7497ba4 --- /dev/null +++ b/packages/auth/src/Domain/Email/offline-subscription-token-created.html.ts @@ -0,0 +1,24 @@ +export const html = (userEmail: string, offlineSubscriptionDashboardUrl: string) => `
+
+
+
+

+
+ Access your Standard Notes Subscription Dashboard, +
+

+
Registered as ${userEmail}
+
+
+
Link to your subscription dashboard: ${offlineSubscriptionDashboardUrl}
+
+
+

+ Get help any time by visiting our Help page + or by replying directly to this email. +

+
+
+
+
` diff --git a/packages/auth/src/Domain/Email/user-signed-in.html.ts b/packages/auth/src/Domain/Email/user-signed-in.html.ts index 1a20ea10e..9dc369a78 100644 --- a/packages/auth/src/Domain/Email/user-signed-in.html.ts +++ b/packages/auth/src/Domain/Email/user-signed-in.html.ts @@ -1,15 +1,15 @@ -export const html = ` +export const html = (email: string, device: string, browser: string, timeAndDate: string) => `

Hello,

-

We've detected a new sign-in to your account %%EMAIL%%.

+

We've detected a new sign-in to your account ${email}

- Device type: %%DEVICE%% + Device type: ${device}

- Browser type: %%BROWSER%% + Browser type: ${browser}

- Time and date: %%TIME_AND_DATE%% + Time and date: ${timeAndDate}

If this was you, please disregard this email. If it wasn't you, we recommend signing into your account and diff --git a/packages/auth/src/Domain/Event/DomainEventFactory.ts b/packages/auth/src/Domain/Event/DomainEventFactory.ts index c7a8dbce0..d49b8536d 100644 --- a/packages/auth/src/Domain/Event/DomainEventFactory.ts +++ b/packages/auth/src/Domain/Event/DomainEventFactory.ts @@ -6,7 +6,6 @@ import { UserEmailChangedEvent, UserRegisteredEvent, UserRolesChangedEvent, - OfflineSubscriptionTokenCreatedEvent, EmailBackupRequestedEvent, CloudBackupRequestedEvent, ListedAccountRequestedEvent, @@ -290,24 +289,6 @@ export class DomainEventFactory implements DomainEventFactoryInterface { } } - createOfflineSubscriptionTokenCreatedEvent(token: string, email: string): OfflineSubscriptionTokenCreatedEvent { - return { - type: 'OFFLINE_SUBSCRIPTION_TOKEN_CREATED', - createdAt: this.timer.getUTCDate(), - meta: { - correlation: { - userIdentifier: email, - userIdentifierType: 'email', - }, - origin: DomainEventService.Auth, - }, - payload: { - token, - email, - }, - } - } - createUserRegisteredEvent(dto: { userUuid: string email: string diff --git a/packages/auth/src/Domain/Event/DomainEventFactoryInterface.ts b/packages/auth/src/Domain/Event/DomainEventFactoryInterface.ts index 6e06e6fdd..621cf61b7 100644 --- a/packages/auth/src/Domain/Event/DomainEventFactoryInterface.ts +++ b/packages/auth/src/Domain/Event/DomainEventFactoryInterface.ts @@ -6,7 +6,6 @@ import { UserRegisteredEvent, UserRolesChangedEvent, UserEmailChangedEvent, - OfflineSubscriptionTokenCreatedEvent, EmailBackupRequestedEvent, ListedAccountRequestedEvent, UserDisabledSessionUserAgentLoggingEvent, @@ -56,7 +55,6 @@ export interface DomainEventFactoryInterface { }): AccountDeletionRequestedEvent createUserRolesChangedEvent(userUuid: string, email: string, currentRoles: RoleName[]): UserRolesChangedEvent createUserEmailChangedEvent(userUuid: string, fromEmail: string, toEmail: string): UserEmailChangedEvent - createOfflineSubscriptionTokenCreatedEvent(token: string, email: string): OfflineSubscriptionTokenCreatedEvent createUserDisabledSessionUserAgentLoggingEvent(dto: { userUuid: Uuid email: string diff --git a/packages/auth/src/Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken.spec.ts b/packages/auth/src/Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken.spec.ts index e29a4cecd..80a07fc55 100644 --- a/packages/auth/src/Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken.spec.ts +++ b/packages/auth/src/Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken.spec.ts @@ -5,7 +5,7 @@ import { TimerInterface } from '@standardnotes/time' import { OfflineSubscriptionTokenRepositoryInterface } from '../../Auth/OfflineSubscriptionTokenRepositoryInterface' import { CreateOfflineSubscriptionToken } from './CreateOfflineSubscriptionToken' -import { DomainEventPublisherInterface, OfflineSubscriptionTokenCreatedEvent } from '@standardnotes/domain-events' +import { DomainEventPublisherInterface, EmailRequestedEvent } from '@standardnotes/domain-events' import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface' import { OfflineUserSubscriptionRepositoryInterface } from '../../Subscription/OfflineUserSubscriptionRepositoryInterface' import { OfflineUserSubscription } from '../../Subscription/OfflineUserSubscription' @@ -47,9 +47,9 @@ describe('CreateOfflineSubscriptionToken', () => { domainEventPublisher.publish = jest.fn() domainEventFactory = {} as jest.Mocked - domainEventFactory.createOfflineSubscriptionTokenCreatedEvent = jest + domainEventFactory.createEmailRequestedEvent = jest .fn() - .mockReturnValue({} as jest.Mocked) + .mockReturnValue({} as jest.Mocked) timer = {} as jest.Mocked timer.convertStringDateToMicroseconds = jest.fn().mockReturnValue(1) @@ -71,10 +71,7 @@ describe('CreateOfflineSubscriptionToken', () => { expiresAt: 1, }) - expect(domainEventFactory.createOfflineSubscriptionTokenCreatedEvent).toHaveBeenCalledWith( - 'random-string', - 'test@test.com', - ) + expect(domainEventFactory.createEmailRequestedEvent).toHaveBeenCalled() expect(domainEventPublisher.publish).toHaveBeenCalled() }) @@ -91,7 +88,7 @@ describe('CreateOfflineSubscriptionToken', () => { }) expect(offlineSubscriptionTokenRepository.save).not.toHaveBeenCalled() - expect(domainEventFactory.createOfflineSubscriptionTokenCreatedEvent).not.toHaveBeenCalled() + expect(domainEventFactory.createEmailRequestedEvent).not.toHaveBeenCalled() expect(domainEventPublisher.publish).not.toHaveBeenCalled() }) @@ -110,7 +107,7 @@ describe('CreateOfflineSubscriptionToken', () => { }) expect(offlineSubscriptionTokenRepository.save).not.toHaveBeenCalled() - expect(domainEventFactory.createOfflineSubscriptionTokenCreatedEvent).not.toHaveBeenCalled() + expect(domainEventFactory.createEmailRequestedEvent).not.toHaveBeenCalled() expect(domainEventPublisher.publish).not.toHaveBeenCalled() }) @@ -129,7 +126,7 @@ describe('CreateOfflineSubscriptionToken', () => { }) expect(offlineSubscriptionTokenRepository.save).not.toHaveBeenCalled() - expect(domainEventFactory.createOfflineSubscriptionTokenCreatedEvent).not.toHaveBeenCalled() + expect(domainEventFactory.createEmailRequestedEvent).not.toHaveBeenCalled() expect(domainEventPublisher.publish).not.toHaveBeenCalled() }) }) diff --git a/packages/auth/src/Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken.ts b/packages/auth/src/Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken.ts index a13a95b55..d65888d71 100644 --- a/packages/auth/src/Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken.ts +++ b/packages/auth/src/Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken.ts @@ -1,4 +1,5 @@ import { DomainEventPublisherInterface } from '@standardnotes/domain-events' +import { EmailLevel } from '@standardnotes/domain-core' import { CryptoNode } from '@standardnotes/sncrypto-node' import { TimerInterface } from '@standardnotes/time' import { inject, injectable } from 'inversify' @@ -6,6 +7,7 @@ import { Logger } from 'winston' import TYPES from '../../../Bootstrap/Types' import { OfflineSubscriptionTokenRepositoryInterface } from '../../Auth/OfflineSubscriptionTokenRepositoryInterface' +import { getBody, getSubject } from '../../Email/OfflineSubscriptionTokenCreated' import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface' import { OfflineUserSubscriptionRepositoryInterface } from '../../Subscription/OfflineUserSubscriptionRepositoryInterface' import { UseCaseInterface } from '../UseCaseInterface' @@ -62,7 +64,13 @@ export class CreateOfflineSubscriptionToken implements UseCaseInterface { await this.offlineSubscriptionTokenRepository.save(offlineSubscriptionToken) await this.domainEventPublisher.publish( - this.domainEventFactory.createOfflineSubscriptionTokenCreatedEvent(token, dto.userEmail), + this.domainEventFactory.createEmailRequestedEvent({ + body: getBody(dto.userEmail, `https://standardnotes.com/dashboard/offline?subscription_token=${token}`), + level: EmailLevel.LEVELS.System, + subject: getSubject(), + messageIdentifier: 'OFFLINE_SUBSCRIPTION_ACCESS', + userEmail: dto.userEmail, + }), ) return { diff --git a/packages/domain-events/src/Domain/Event/OfflineSubscriptionTokenCreatedEvent.ts b/packages/domain-events/src/Domain/Event/OfflineSubscriptionTokenCreatedEvent.ts deleted file mode 100644 index 443079118..000000000 --- a/packages/domain-events/src/Domain/Event/OfflineSubscriptionTokenCreatedEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { DomainEventInterface } from './DomainEventInterface' - -import { OfflineSubscriptionTokenCreatedEventPayload } from './OfflineSubscriptionTokenCreatedEventPayload' - -export interface OfflineSubscriptionTokenCreatedEvent extends DomainEventInterface { - type: 'OFFLINE_SUBSCRIPTION_TOKEN_CREATED' - payload: OfflineSubscriptionTokenCreatedEventPayload -} diff --git a/packages/domain-events/src/Domain/Event/OfflineSubscriptionTokenCreatedEventPayload.ts b/packages/domain-events/src/Domain/Event/OfflineSubscriptionTokenCreatedEventPayload.ts deleted file mode 100644 index 34395bdd1..000000000 --- a/packages/domain-events/src/Domain/Event/OfflineSubscriptionTokenCreatedEventPayload.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface OfflineSubscriptionTokenCreatedEventPayload { - token: string - email: string -} diff --git a/packages/domain-events/src/Domain/index.ts b/packages/domain-events/src/Domain/index.ts index 767acf9e4..0c84acd89 100644 --- a/packages/domain-events/src/Domain/index.ts +++ b/packages/domain-events/src/Domain/index.ts @@ -50,8 +50,6 @@ export * from './Event/ListedAccountRequestedEvent' export * from './Event/ListedAccountRequestedEventPayload' export * from './Event/MuteEmailsSettingChangedEvent' export * from './Event/MuteEmailsSettingChangedEventPayload' -export * from './Event/OfflineSubscriptionTokenCreatedEvent' -export * from './Event/OfflineSubscriptionTokenCreatedEventPayload' export * from './Event/OneDriveBackupFailedEvent' export * from './Event/OneDriveBackupFailedEventPayload' export * from './Event/PaymentFailedEvent'