AddUserToSharedVault.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import {
  2. NotificationPayload,
  3. NotificationPayloadIdentifierType,
  4. NotificationType,
  5. Result,
  6. SharedVaultUser,
  7. SharedVaultUserPermission,
  8. Timestamps,
  9. UseCaseInterface,
  10. Uuid,
  11. } from '@standardnotes/domain-core'
  12. import { TimerInterface } from '@standardnotes/time'
  13. import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
  14. import { AddUserToSharedVaultDTO } from './AddUserToSharedVaultDTO'
  15. import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
  16. import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/SharedVaultUserRepositoryInterface'
  17. import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
  18. import { AddNotificationsForUsers } from '../../Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
  19. export class AddUserToSharedVault implements UseCaseInterface<SharedVaultUser> {
  20. constructor(
  21. private sharedVaultRepository: SharedVaultRepositoryInterface,
  22. private sharedVaultUserRepository: SharedVaultUserRepositoryInterface,
  23. private timer: TimerInterface,
  24. private domainEventFactory: DomainEventFactoryInterface,
  25. private domainEventPublisher: DomainEventPublisherInterface,
  26. private addNotificationForUsers: AddNotificationsForUsers,
  27. ) {}
  28. async execute(dto: AddUserToSharedVaultDTO): Promise<Result<SharedVaultUser>> {
  29. const sharedVaultUuidOrError = Uuid.create(dto.sharedVaultUuid)
  30. if (sharedVaultUuidOrError.isFailed()) {
  31. return Result.fail(sharedVaultUuidOrError.getError())
  32. }
  33. const sharedVaultUuid = sharedVaultUuidOrError.getValue()
  34. if (!dto.skipSharedVaultExistenceCheck) {
  35. const sharedVault = await this.sharedVaultRepository.findByUuid(sharedVaultUuid)
  36. if (!sharedVault) {
  37. return Result.fail('Attempting to add a shared vault user to a non-existent shared vault')
  38. }
  39. }
  40. const userUuidOrError = Uuid.create(dto.userUuid)
  41. if (userUuidOrError.isFailed()) {
  42. return Result.fail(userUuidOrError.getError())
  43. }
  44. const userUuid = userUuidOrError.getValue()
  45. const permissionOrError = SharedVaultUserPermission.create(dto.permission)
  46. if (permissionOrError.isFailed()) {
  47. return Result.fail(permissionOrError.getError())
  48. }
  49. const permission = permissionOrError.getValue()
  50. const timestamps = Timestamps.create(
  51. this.timer.getTimestampInMicroseconds(),
  52. this.timer.getTimestampInMicroseconds(),
  53. ).getValue()
  54. const sharedVaultUserOrError = SharedVaultUser.create({
  55. userUuid,
  56. sharedVaultUuid,
  57. permission,
  58. timestamps,
  59. isDesignatedSurvivor: false,
  60. })
  61. if (sharedVaultUserOrError.isFailed()) {
  62. return Result.fail(sharedVaultUserOrError.getError())
  63. }
  64. const sharedVaultUser = sharedVaultUserOrError.getValue()
  65. await this.sharedVaultUserRepository.save(sharedVaultUser)
  66. const notificationPayloadOrError = NotificationPayload.create({
  67. primaryIdentifier: sharedVaultUuid,
  68. primaryIndentifierType: NotificationPayloadIdentifierType.create(
  69. NotificationPayloadIdentifierType.TYPES.SharedVaultUuid,
  70. ).getValue(),
  71. type: NotificationType.create(NotificationType.TYPES.UserAddedToSharedVault).getValue(),
  72. version: '1.0',
  73. })
  74. if (notificationPayloadOrError.isFailed()) {
  75. return Result.fail(notificationPayloadOrError.getError())
  76. }
  77. const notificationPayload = notificationPayloadOrError.getValue()
  78. const result = await this.addNotificationForUsers.execute({
  79. sharedVaultUuid: sharedVaultUuid.value,
  80. type: NotificationType.TYPES.UserAddedToSharedVault,
  81. payload: notificationPayload,
  82. version: '1.0',
  83. })
  84. if (result.isFailed()) {
  85. return Result.fail(result.getError())
  86. }
  87. await this.domainEventPublisher.publish(
  88. this.domainEventFactory.createUserAddedToSharedVaultEvent({
  89. sharedVaultUuid: sharedVaultUser.props.sharedVaultUuid.value,
  90. userUuid: sharedVaultUser.props.userUuid.value,
  91. permission: sharedVaultUser.props.permission.value,
  92. createdAt: sharedVaultUser.props.timestamps.createdAt,
  93. updatedAt: sharedVaultUser.props.timestamps.updatedAt,
  94. }),
  95. )
  96. return Result.ok(sharedVaultUser)
  97. }
  98. }