InviteToWorkspace.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
  2. import { TimerInterface } from '@standardnotes/time'
  3. import { EmailLevel } from '@standardnotes/domain-core'
  4. import { inject, injectable } from 'inversify'
  5. import TYPES from '../../../Bootstrap/Types'
  6. import { getBody, getSubject } from '../../Email/WorkspaceInviteCreated'
  7. import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface'
  8. import { WorkspaceInvite } from '../../Invite/WorkspaceInvite'
  9. import { WorkspaceInviteRepositoryInterface } from '../../Invite/WorkspaceInviteRepositoryInterface'
  10. import { WorkspaceInviteStatus } from '../../Invite/WorkspaceInviteStatus'
  11. import { UseCaseInterface } from '../UseCaseInterface'
  12. import { InviteToWorkspaceDTO } from './InviteToWorkspaceDTO'
  13. import { InviteToWorkspaceResponse } from './InviteToWorkspaceResponse'
  14. @injectable()
  15. export class InviteToWorkspace implements UseCaseInterface {
  16. constructor(
  17. @inject(TYPES.WorkspaceInviteRepository) private workspaceInviteRepository: WorkspaceInviteRepositoryInterface,
  18. @inject(TYPES.Timer) private timer: TimerInterface,
  19. @inject(TYPES.DomainEventFactory) private domainEventFactory: DomainEventFactoryInterface,
  20. @inject(TYPES.DomainEventPublisher) private domainEventPublisher: DomainEventPublisherInterface,
  21. ) {}
  22. async execute(dto: InviteToWorkspaceDTO): Promise<InviteToWorkspaceResponse> {
  23. let invite = new WorkspaceInvite()
  24. invite.inviterUuid = dto.inviterUuid
  25. invite.inviteeEmail = dto.inviteeEmail
  26. invite.workspaceUuid = dto.workspaceUuid
  27. invite.accessLevel = dto.accessLevel
  28. invite.status = WorkspaceInviteStatus.Created
  29. const timestamp = this.timer.getTimestampInMicroseconds()
  30. invite.createdAt = timestamp
  31. invite.updatedAt = timestamp
  32. invite = await this.workspaceInviteRepository.save(invite)
  33. await this.domainEventPublisher.publish(
  34. this.domainEventFactory.createEmailRequestedEvent({
  35. body: getBody(invite.uuid),
  36. subject: getSubject(),
  37. level: EmailLevel.LEVELS.System,
  38. messageIdentifier: 'WORKSPACE_INVITE_CREATED',
  39. userEmail: dto.inviteeEmail,
  40. }),
  41. )
  42. return {
  43. invite,
  44. }
  45. }
  46. }