DeclineInviteToSharedVault.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { NotificationPayload, NotificationType, Result, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
  2. import { DeclineInviteToSharedVaultDTO } from './DeclineInviteToSharedVaultDTO'
  3. import { SharedVaultInviteRepositoryInterface } from '../../../SharedVault/User/Invite/SharedVaultInviteRepositoryInterface'
  4. import { AddNotificationForUser } from '../../Messaging/AddNotificationForUser/AddNotificationForUser'
  5. export class DeclineInviteToSharedVault implements UseCaseInterface<void> {
  6. constructor(
  7. private sharedVaultInviteRepository: SharedVaultInviteRepositoryInterface,
  8. private addNotificationForUser: AddNotificationForUser,
  9. ) {}
  10. async execute(dto: DeclineInviteToSharedVaultDTO): Promise<Result<void>> {
  11. const inviteUuidOrError = Uuid.create(dto.inviteUuid)
  12. if (inviteUuidOrError.isFailed()) {
  13. return Result.fail(inviteUuidOrError.getError())
  14. }
  15. const inviteUuid = inviteUuidOrError.getValue()
  16. const userUuidOrError = Uuid.create(dto.userUuid)
  17. if (userUuidOrError.isFailed()) {
  18. return Result.fail(userUuidOrError.getError())
  19. }
  20. const userUuid = userUuidOrError.getValue()
  21. const invite = await this.sharedVaultInviteRepository.findByUuid(inviteUuid)
  22. if (!invite) {
  23. return Result.fail('Invite not found')
  24. }
  25. if (!invite.props.userUuid.equals(userUuid) && !invite.props.senderUuid.equals(userUuid)) {
  26. return Result.fail('Only the recipient or the sender can decline the invite')
  27. }
  28. await this.sharedVaultInviteRepository.remove(invite)
  29. const notificationPayloadOrError = NotificationPayload.create({
  30. sharedVaultUuid: invite.props.sharedVaultUuid,
  31. type: NotificationType.create(NotificationType.TYPES.SharedVaultInviteDeclined).getValue(),
  32. version: '1.0',
  33. })
  34. if (notificationPayloadOrError.isFailed()) {
  35. return Result.fail(notificationPayloadOrError.getError())
  36. }
  37. const notificationPayload = notificationPayloadOrError.getValue()
  38. const result = await this.addNotificationForUser.execute({
  39. userUuid: invite.props.userUuid.value,
  40. type: NotificationType.TYPES.SharedVaultInviteDeclined,
  41. payload: notificationPayload,
  42. version: '1.0',
  43. })
  44. if (result.isFailed()) {
  45. return Result.fail(result.getError())
  46. }
  47. return Result.ok()
  48. }
  49. }