DeleteSharedVault.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { Result, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
  2. import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
  3. import { DeleteSharedVaultDTO } from './DeleteSharedVaultDTO'
  4. import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
  5. import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/SharedVaultUserRepositoryInterface'
  6. import { SharedVaultInviteRepositoryInterface } from '../../../SharedVault/User/Invite/SharedVaultInviteRepositoryInterface'
  7. import { RemoveUserFromSharedVault } from '../RemoveUserFromSharedVault/RemoveUserFromSharedVault'
  8. import { CancelInviteToSharedVault } from '../CancelInviteToSharedVault/CancelInviteToSharedVault'
  9. import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
  10. import { TransferSharedVault } from '../TransferSharedVault/TransferSharedVault'
  11. export class DeleteSharedVault implements UseCaseInterface<void> {
  12. constructor(
  13. private sharedVaultRepository: SharedVaultRepositoryInterface,
  14. private sharedVaultUserRepository: SharedVaultUserRepositoryInterface,
  15. private sharedVaultInviteRepository: SharedVaultInviteRepositoryInterface,
  16. private removeUserFromSharedVault: RemoveUserFromSharedVault,
  17. private cancelInviteToSharedVault: CancelInviteToSharedVault,
  18. private domainEventFactory: DomainEventFactoryInterface,
  19. private domainEventPublisher: DomainEventPublisherInterface,
  20. private transferSharedVault: TransferSharedVault,
  21. ) {}
  22. async execute(dto: DeleteSharedVaultDTO): Promise<Result<void>> {
  23. const originatorUuidOrError = Uuid.create(dto.originatorUuid)
  24. if (originatorUuidOrError.isFailed()) {
  25. return Result.fail(originatorUuidOrError.getError())
  26. }
  27. const originatorUuid = originatorUuidOrError.getValue()
  28. const sharedVaultUuidOrError = Uuid.create(dto.sharedVaultUuid)
  29. if (sharedVaultUuidOrError.isFailed()) {
  30. return Result.fail(sharedVaultUuidOrError.getError())
  31. }
  32. const sharedVaultUuid = sharedVaultUuidOrError.getValue()
  33. const sharedVault = await this.sharedVaultRepository.findByUuid(sharedVaultUuid)
  34. if (!sharedVault) {
  35. return Result.fail('Shared vault not found')
  36. }
  37. if (sharedVault.props.userUuid.value !== originatorUuid.value) {
  38. return Result.fail('Shared vault does not belong to the user')
  39. }
  40. const sharedVaultInvites = await this.sharedVaultInviteRepository.findBySharedVaultUuid(sharedVaultUuid)
  41. for (const sharedVaultInvite of sharedVaultInvites) {
  42. const result = await this.cancelInviteToSharedVault.execute({
  43. inviteUuid: sharedVaultInvite.id.toString(),
  44. userUuid: sharedVaultInvite.props.userUuid.value,
  45. })
  46. if (result.isFailed()) {
  47. return Result.fail(result.getError())
  48. }
  49. }
  50. const sharedVaultDesignatedSurvivor =
  51. await this.sharedVaultUserRepository.findDesignatedSurvivorBySharedVaultUuid(sharedVaultUuid)
  52. if (sharedVaultDesignatedSurvivor) {
  53. const result = await this.transferSharedVault.execute({
  54. sharedVaultUid: sharedVaultUuid.value,
  55. fromUserUuid: originatorUuid.value,
  56. toUserUuid: sharedVaultDesignatedSurvivor.props.userUuid.value,
  57. })
  58. if (result.isFailed()) {
  59. return Result.fail(result.getError())
  60. }
  61. const removingOwnerFromSharedVaultResult = await this.removeUserFromSharedVault.execute({
  62. originatorUuid: originatorUuid.value,
  63. sharedVaultUuid: sharedVaultUuid.value,
  64. userUuid: originatorUuid.value,
  65. forceRemoveOwner: true,
  66. })
  67. if (removingOwnerFromSharedVaultResult.isFailed()) {
  68. return Result.fail(removingOwnerFromSharedVaultResult.getError())
  69. }
  70. return Result.ok()
  71. }
  72. const sharedVaultUsers = await this.sharedVaultUserRepository.findBySharedVaultUuid(sharedVaultUuid)
  73. for (const sharedVaultUser of sharedVaultUsers) {
  74. const result = await this.removeUserFromSharedVault.execute({
  75. originatorUuid: originatorUuid.value,
  76. sharedVaultUuid: sharedVaultUuid.value,
  77. userUuid: sharedVaultUser.props.userUuid.value,
  78. forceRemoveOwner: true,
  79. })
  80. if (result.isFailed()) {
  81. return Result.fail(result.getError())
  82. }
  83. }
  84. await this.sharedVaultRepository.remove(sharedVault)
  85. await this.domainEventPublisher.publish(
  86. this.domainEventFactory.createSharedVaultRemovedEvent({
  87. sharedVaultUuid: sharedVaultUuid.value,
  88. vaultOwnerUuid: sharedVault.props.userUuid.value,
  89. }),
  90. )
  91. return Result.ok()
  92. }
  93. }