Browse Source

feat(workspace): replace workspace invite created event with email requested

Karol Sójko 2 years ago
parent
commit
61c1cfff4b

+ 1 - 0
.pnp.cjs

@@ -3324,6 +3324,7 @@ const RAW_RUNTIME_STATE =
           ["@sentry/node", "npm:7.19.0"],\
           ["@standardnotes/api", "npm:1.19.0"],\
           ["@standardnotes/common", "workspace:packages/common"],\
+          ["@standardnotes/domain-core", "workspace:packages/domain-core"],\
           ["@standardnotes/domain-events", "workspace:packages/domain-events"],\
           ["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
           ["@standardnotes/models", "npm:1.28.0"],\

+ 0 - 7
packages/domain-events/src/Domain/Event/WorkspaceInviteCreatedEvent.ts

@@ -1,7 +0,0 @@
-import { DomainEventInterface } from './DomainEventInterface'
-import { WorkspaceInviteCreatedEventPayload } from './WorkspaceInviteCreatedEventPayload'
-
-export interface WorkspaceInviteCreatedEvent extends DomainEventInterface {
-  type: 'WORKSPACE_INVITE_CREATED'
-  payload: WorkspaceInviteCreatedEventPayload
-}

+ 0 - 6
packages/domain-events/src/Domain/Event/WorkspaceInviteCreatedEventPayload.ts

@@ -1,6 +0,0 @@
-export interface WorkspaceInviteCreatedEventPayload {
-  inviterUuid: string
-  inviteeEmail: string
-  inviteUuid: string
-  workspaceUuid: string
-}

+ 0 - 2
packages/domain-events/src/Domain/index.ts

@@ -94,8 +94,6 @@ export * from './Event/WebSocketMessageRequestedEvent'
 export * from './Event/WebSocketMessageRequestedEventPayload'
 export * from './Event/WorkspaceInviteAcceptedEvent'
 export * from './Event/WorkspaceInviteAcceptedEventPayload'
-export * from './Event/WorkspaceInviteCreatedEvent'
-export * from './Event/WorkspaceInviteCreatedEventPayload'
 
 export * from './Handler/DomainEventHandlerInterface'
 export * from './Handler/DomainEventMessageHandlerInterface'

+ 1 - 1
packages/workspace/jest.config.js

@@ -7,6 +7,6 @@ module.exports = {
   transform: {
     ...tsjPreset.transform,
   },
-  coveragePathIgnorePatterns: ['/Bootstrap/', '/InversifyExpressUtils/'],
+  coveragePathIgnorePatterns: ['/Bootstrap/', '/InversifyExpressUtils/', '/Domain/Email/', '/Domain/Event'],
   setupFilesAfterEnv: ['./test-setup.ts'],
 }

+ 1 - 0
packages/workspace/package.json

@@ -26,6 +26,7 @@
     "@sentry/node": "^7.19.0",
     "@standardnotes/api": "^1.19.0",
     "@standardnotes/common": "workspace:*",
+    "@standardnotes/domain-core": "workspace:^",
     "@standardnotes/domain-events": "workspace:^",
     "@standardnotes/domain-events-infra": "workspace:^",
     "@standardnotes/models": "^1.26.0",

+ 9 - 0
packages/workspace/src/Domain/Email/WorkspaceInviteCreated.ts

@@ -0,0 +1,9 @@
+import { html } from './workspace-invite-created.html'
+
+export function getSubject(): string {
+  return 'You have been invited to a Standard Notes workspace'
+}
+
+export function getBody(inviteUuid: string): string {
+  return html(inviteUuid)
+}

+ 11 - 0
packages/workspace/src/Domain/Email/workspace-invite-created.html.ts

@@ -0,0 +1,11 @@
+export const html = (inviteUuid: string) => `<p>Hello,</p>
+<p>We are happy to inform that you have been invited to a shared workspace in Standard Notes.</p>
+<p>
+  Please
+  <a href='https://app.standardnotes.com/?accept_workspace_invite=${inviteUuid}'>accept the invitation</a>
+  to see the shared content.
+</p>
+<p>
+  Thanks,
+  <br>SN</br>
+</p>`

+ 0 - 92
packages/workspace/src/Domain/Event/DomainEventFactory.spec.ts

@@ -1,92 +0,0 @@
-import 'reflect-metadata'
-
-import { TimerInterface } from '@standardnotes/time'
-
-import { DomainEventFactory } from './DomainEventFactory'
-
-describe('DomainEventFactory', () => {
-  let timer: TimerInterface
-
-  const createFactory = () => new DomainEventFactory(timer)
-
-  beforeEach(() => {
-    timer = {} as jest.Mocked<TimerInterface>
-    timer.getTimestampInMicroseconds = jest.fn().mockReturnValue(1)
-    timer.getUTCDate = jest.fn().mockReturnValue(new Date(1))
-  })
-
-  it('should create a WEB_SOCKET_MESSAGE_REQUESTED event', () => {
-    expect(
-      createFactory().createWebSocketMessageRequestedEvent({
-        userUuid: '1-2-3',
-        message: 'foobar',
-      }),
-    ).toEqual({
-      createdAt: expect.any(Date),
-      meta: {
-        correlation: {
-          userIdentifier: '1-2-3',
-          userIdentifierType: 'uuid',
-        },
-        origin: 'workspace',
-      },
-      payload: {
-        userUuid: '1-2-3',
-        message: 'foobar',
-      },
-      type: 'WEB_SOCKET_MESSAGE_REQUESTED',
-    })
-  })
-
-  it('should create a WORKSPACE_INVITE_ACCEPTED event', () => {
-    expect(
-      createFactory().createWorkspaceInviteAcceptedEvent({
-        inviterUuid: '1-2-3',
-        inviteeUuid: '2-3-4',
-        workspaceUuid: 'w-1-2-3',
-      }),
-    ).toEqual({
-      createdAt: expect.any(Date),
-      meta: {
-        correlation: {
-          userIdentifier: '2-3-4',
-          userIdentifierType: 'uuid',
-        },
-        origin: 'workspace',
-      },
-      payload: {
-        inviterUuid: '1-2-3',
-        inviteeUuid: '2-3-4',
-        workspaceUuid: 'w-1-2-3',
-      },
-      type: 'WORKSPACE_INVITE_ACCEPTED',
-    })
-  })
-
-  it('should create a WORKSPACE_INVITE_CREATED event', () => {
-    expect(
-      createFactory().createWorkspaceInviteCreatedEvent({
-        inviterUuid: '1-2-3',
-        inviteeEmail: 'test@test.te',
-        inviteUuid: 'i-1-2-3',
-        workspaceUuid: 'w-1-2-3',
-      }),
-    ).toEqual({
-      createdAt: expect.any(Date),
-      meta: {
-        correlation: {
-          userIdentifier: '1-2-3',
-          userIdentifierType: 'uuid',
-        },
-        origin: 'workspace',
-      },
-      payload: {
-        inviterUuid: '1-2-3',
-        inviteeEmail: 'test@test.te',
-        inviteUuid: 'i-1-2-3',
-        workspaceUuid: 'w-1-2-3',
-      },
-      type: 'WORKSPACE_INVITE_CREATED',
-    })
-  })
-})

+ 12 - 11
packages/workspace/src/Domain/Event/DomainEventFactory.ts

@@ -1,8 +1,8 @@
 import {
   DomainEventService,
+  EmailRequestedEvent,
   WebSocketMessageRequestedEvent,
   WorkspaceInviteAcceptedEvent,
-  WorkspaceInviteCreatedEvent,
 } from '@standardnotes/domain-events'
 import { TimerInterface } from '@standardnotes/time'
 import { inject, injectable } from 'inversify'
@@ -49,21 +49,22 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
     }
   }
 
-  createWorkspaceInviteCreatedEvent(dto: {
-    inviterUuid: string
-    inviteeEmail: string
-    inviteUuid: string
-    workspaceUuid: string
-  }): WorkspaceInviteCreatedEvent {
+  createEmailRequestedEvent(dto: {
+    userEmail: string
+    messageIdentifier: string
+    level: string
+    body: string
+    subject: string
+  }): EmailRequestedEvent {
     return {
-      type: 'WORKSPACE_INVITE_CREATED',
+      type: 'EMAIL_REQUESTED',
       createdAt: this.timer.getUTCDate(),
       meta: {
         correlation: {
-          userIdentifier: dto.inviterUuid,
-          userIdentifierType: 'uuid',
+          userIdentifier: dto.userEmail,
+          userIdentifierType: 'email',
         },
-        origin: DomainEventService.Workspace,
+        origin: DomainEventService.Auth,
       },
       payload: dto,
     }

+ 8 - 7
packages/workspace/src/Domain/Event/DomainEventFactoryInterface.ts

@@ -1,17 +1,18 @@
 import { JSONString } from '@standardnotes/common'
 import {
+  EmailRequestedEvent,
   WebSocketMessageRequestedEvent,
   WorkspaceInviteAcceptedEvent,
-  WorkspaceInviteCreatedEvent,
 } from '@standardnotes/domain-events'
 
 export interface DomainEventFactoryInterface {
-  createWorkspaceInviteCreatedEvent(dto: {
-    inviterUuid: string
-    inviteeEmail: string
-    inviteUuid: string
-    workspaceUuid: string
-  }): WorkspaceInviteCreatedEvent
+  createEmailRequestedEvent(dto: {
+    userEmail: string
+    messageIdentifier: string
+    level: string
+    body: string
+    subject: string
+  }): EmailRequestedEvent
   createWorkspaceInviteAcceptedEvent(dto: {
     inviterUuid: string
     inviteeUuid: string

+ 8 - 5
packages/workspace/src/Domain/UseCase/InviteToWorkspace/InviteToWorkspace.ts

@@ -1,8 +1,10 @@
 import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
 import { TimerInterface } from '@standardnotes/time'
+import { EmailLevel } from '@standardnotes/domain-core'
 import { inject, injectable } from 'inversify'
 
 import TYPES from '../../../Bootstrap/Types'
+import { getBody, getSubject } from '../../Email/WorkspaceInviteCreated'
 import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface'
 import { WorkspaceInvite } from '../../Invite/WorkspaceInvite'
 import { WorkspaceInviteRepositoryInterface } from '../../Invite/WorkspaceInviteRepositoryInterface'
@@ -36,11 +38,12 @@ export class InviteToWorkspace implements UseCaseInterface {
     invite = await this.workspaceInviteRepository.save(invite)
 
     await this.domainEventPublisher.publish(
-      this.domainEventFactory.createWorkspaceInviteCreatedEvent({
-        inviterUuid: dto.inviterUuid,
-        inviteeEmail: dto.inviteeEmail,
-        workspaceUuid: dto.workspaceUuid,
-        inviteUuid: invite.uuid,
+      this.domainEventFactory.createEmailRequestedEvent({
+        body: getBody(invite.uuid),
+        subject: getSubject(),
+        level: EmailLevel.LEVELS.System,
+        messageIdentifier: 'WORKSPACE_INVITE_CREATED',
+        userEmail: dto.inviteeEmail,
       }),
     )
 

+ 1 - 0
yarn.lock

@@ -2535,6 +2535,7 @@ __metadata:
     "@sentry/node": "npm:^7.19.0"
     "@standardnotes/api": "npm:^1.19.0"
     "@standardnotes/common": "workspace:*"
+    "@standardnotes/domain-core": "workspace:^"
     "@standardnotes/domain-events": "workspace:^"
     "@standardnotes/domain-events-infra": "workspace:^"
     "@standardnotes/models": "npm:^1.26.0"