Browse Source

feat: add publishing notifications for users when a user is added to vault (#834)

Karol Sójko 1 year ago
parent
commit
547a79e231

+ 1 - 0
packages/domain-core/src/Domain/Notification/NotificationType.ts

@@ -6,6 +6,7 @@ export class NotificationType extends ValueObject<NotificationTypeProps> {
   static readonly TYPES = {
   static readonly TYPES = {
     SharedVaultItemRemoved: 'shared_vault_item_removed',
     SharedVaultItemRemoved: 'shared_vault_item_removed',
     RemovedFromSharedVault: 'removed_from_shared_vault',
     RemovedFromSharedVault: 'removed_from_shared_vault',
+    UserAddedToSharedVault: 'user_added_to_shared_vault',
     SharedVaultFileUploaded: 'shared_vault_file_uploaded',
     SharedVaultFileUploaded: 'shared_vault_file_uploaded',
     SharedVaultFileRemoved: 'shared_vault_file_removed',
     SharedVaultFileRemoved: 'shared_vault_file_removed',
   }
   }

+ 10 - 9
packages/syncing-server/src/Bootstrap/Container.ts

@@ -620,14 +620,14 @@ export class ContainerConfigLoader {
       .bind<UpdateExistingItem>(TYPES.Sync_UpdateExistingItem)
       .bind<UpdateExistingItem>(TYPES.Sync_UpdateExistingItem)
       .toConstantValue(
       .toConstantValue(
         new UpdateExistingItem(
         new UpdateExistingItem(
-          container.get(TYPES.Sync_ItemRepositoryResolver),
-          container.get(TYPES.Sync_Timer),
-          container.get(TYPES.Sync_DomainEventPublisher),
-          container.get(TYPES.Sync_DomainEventFactory),
-          container.get(TYPES.Sync_REVISIONS_FREQUENCY),
-          container.get(TYPES.Sync_DetermineSharedVaultOperationOnItem),
-          container.get(TYPES.Sync_AddNotificationForUser),
-          container.get(TYPES.Sync_RemoveNotificationsForUser),
+          container.get<ItemRepositoryResolverInterface>(TYPES.Sync_ItemRepositoryResolver),
+          container.get<TimerInterface>(TYPES.Sync_Timer),
+          container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
+          container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
+          container.get<number>(TYPES.Sync_REVISIONS_FREQUENCY),
+          container.get<DetermineSharedVaultOperationOnItem>(TYPES.Sync_DetermineSharedVaultOperationOnItem),
+          container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
+          container.get<RemoveNotificationsForUser>(TYPES.Sync_RemoveNotificationsForUser),
         ),
         ),
       )
       )
     container
     container
@@ -710,6 +710,7 @@ export class ContainerConfigLoader {
           container.get<TimerInterface>(TYPES.Sync_Timer),
           container.get<TimerInterface>(TYPES.Sync_Timer),
           container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
           container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
           container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
           container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
+          container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
         ),
         ),
       )
       )
     container
     container
@@ -756,7 +757,7 @@ export class ContainerConfigLoader {
         new RemoveUserFromSharedVault(
         new RemoveUserFromSharedVault(
           container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
           container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
           container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
           container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
-          container.get<AddNotificationForUser>(TYPES.Sync_AddNotificationForUser),
+          container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
           container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
           container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
           container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
           container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
         ),
         ),

+ 40 - 1
packages/syncing-server/src/Domain/UseCase/SharedVaults/AddUserToSharedVault/AddUserToSharedVault.spec.ts

@@ -1,5 +1,5 @@
 import { TimerInterface } from '@standardnotes/time'
 import { TimerInterface } from '@standardnotes/time'
-import { Result, SharedVaultUser } from '@standardnotes/domain-core'
+import { NotificationPayload, Result, SharedVaultUser } from '@standardnotes/domain-core'
 import { DomainEventInterface, DomainEventPublisherInterface } from '@standardnotes/domain-events'
 import { DomainEventInterface, DomainEventPublisherInterface } from '@standardnotes/domain-events'
 
 
 import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
 import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
@@ -7,6 +7,7 @@ import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/Sh
 import { AddUserToSharedVault } from './AddUserToSharedVault'
 import { AddUserToSharedVault } from './AddUserToSharedVault'
 import { SharedVault } from '../../../SharedVault/SharedVault'
 import { SharedVault } from '../../../SharedVault/SharedVault'
 import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
 import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
+import { AddNotificationsForUsers } from '../../Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
 
 
 describe('AddUserToSharedVault', () => {
 describe('AddUserToSharedVault', () => {
   let sharedVaultRepository: SharedVaultRepositoryInterface
   let sharedVaultRepository: SharedVaultRepositoryInterface
@@ -15,6 +16,7 @@ describe('AddUserToSharedVault', () => {
   let sharedVault: SharedVault
   let sharedVault: SharedVault
   let domainEventFactory: DomainEventFactoryInterface
   let domainEventFactory: DomainEventFactoryInterface
   let domainEventPublisher: DomainEventPublisherInterface
   let domainEventPublisher: DomainEventPublisherInterface
+  let addNotificationsForUsers: AddNotificationsForUsers
 
 
   const validUuid = '00000000-0000-0000-0000-000000000000'
   const validUuid = '00000000-0000-0000-0000-000000000000'
 
 
@@ -25,6 +27,7 @@ describe('AddUserToSharedVault', () => {
       timer,
       timer,
       domainEventFactory,
       domainEventFactory,
       domainEventPublisher,
       domainEventPublisher,
+      addNotificationsForUsers,
     )
     )
 
 
   beforeEach(() => {
   beforeEach(() => {
@@ -46,6 +49,9 @@ describe('AddUserToSharedVault', () => {
 
 
     domainEventPublisher = {} as jest.Mocked<DomainEventPublisherInterface>
     domainEventPublisher = {} as jest.Mocked<DomainEventPublisherInterface>
     domainEventPublisher.publish = jest.fn()
     domainEventPublisher.publish = jest.fn()
+
+    addNotificationsForUsers = {} as jest.Mocked<AddNotificationsForUsers>
+    addNotificationsForUsers.execute = jest.fn().mockReturnValue(Result.ok())
   })
   })
 
 
   it('should return a failure result if the shared vault uuid is invalid', async () => {
   it('should return a failure result if the shared vault uuid is invalid', async () => {
@@ -122,6 +128,39 @@ describe('AddUserToSharedVault', () => {
     mockSharedVaultUser.mockRestore()
     mockSharedVaultUser.mockRestore()
   })
   })
 
 
+  it('should return a failure if add notification for users fails', async () => {
+    addNotificationsForUsers.execute = jest.fn().mockReturnValue(Result.fail('Oops'))
+
+    const useCase = createUseCase()
+
+    const result = await useCase.execute({
+      sharedVaultUuid: validUuid,
+      userUuid: validUuid,
+      permission: 'read',
+    })
+
+    expect(result.isFailed()).toBe(true)
+    expect(result.getError()).toBe('Oops')
+  })
+
+  it('should return error if notification payload could not be created', async () => {
+    const mock = jest.spyOn(NotificationPayload, 'create')
+    mock.mockReturnValue(Result.fail('Oops'))
+
+    const useCase = createUseCase()
+
+    const result = await useCase.execute({
+      sharedVaultUuid: validUuid,
+      userUuid: validUuid,
+      permission: 'read',
+    })
+
+    expect(result.isFailed()).toBe(true)
+    expect(result.getError()).toBe('Oops')
+
+    mock.mockRestore()
+  })
+
   it('should add a user to a shared vault', async () => {
   it('should add a user to a shared vault', async () => {
     const useCase = createUseCase()
     const useCase = createUseCase()
 
 

+ 24 - 0
packages/syncing-server/src/Domain/UseCase/SharedVaults/AddUserToSharedVault/AddUserToSharedVault.ts

@@ -1,4 +1,6 @@
 import {
 import {
+  NotificationPayload,
+  NotificationType,
   Result,
   Result,
   SharedVaultUser,
   SharedVaultUser,
   SharedVaultUserPermission,
   SharedVaultUserPermission,
@@ -13,6 +15,7 @@ import { AddUserToSharedVaultDTO } from './AddUserToSharedVaultDTO'
 import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
 import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
 import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/SharedVaultUserRepositoryInterface'
 import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/SharedVaultUserRepositoryInterface'
 import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
 import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
+import { AddNotificationsForUsers } from '../../Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
 
 
 export class AddUserToSharedVault implements UseCaseInterface<SharedVaultUser> {
 export class AddUserToSharedVault implements UseCaseInterface<SharedVaultUser> {
   constructor(
   constructor(
@@ -21,6 +24,7 @@ export class AddUserToSharedVault implements UseCaseInterface<SharedVaultUser> {
     private timer: TimerInterface,
     private timer: TimerInterface,
     private domainEventFactory: DomainEventFactoryInterface,
     private domainEventFactory: DomainEventFactoryInterface,
     private domainEventPublisher: DomainEventPublisherInterface,
     private domainEventPublisher: DomainEventPublisherInterface,
+    private addNotificationForUsers: AddNotificationsForUsers,
   ) {}
   ) {}
 
 
   async execute(dto: AddUserToSharedVaultDTO): Promise<Result<SharedVaultUser>> {
   async execute(dto: AddUserToSharedVaultDTO): Promise<Result<SharedVaultUser>> {
@@ -67,6 +71,26 @@ export class AddUserToSharedVault implements UseCaseInterface<SharedVaultUser> {
 
 
     await this.sharedVaultUserRepository.save(sharedVaultUser)
     await this.sharedVaultUserRepository.save(sharedVaultUser)
 
 
+    const notificationPayloadOrError = NotificationPayload.create({
+      sharedVaultUuid: sharedVaultUuid,
+      type: NotificationType.create(NotificationType.TYPES.UserAddedToSharedVault).getValue(),
+      version: '1.0',
+    })
+    if (notificationPayloadOrError.isFailed()) {
+      return Result.fail(notificationPayloadOrError.getError())
+    }
+    const notificationPayload = notificationPayloadOrError.getValue()
+
+    const result = await this.addNotificationForUsers.execute({
+      sharedVaultUuid: sharedVaultUuid.value,
+      type: NotificationType.TYPES.UserAddedToSharedVault,
+      payload: notificationPayload,
+      version: '1.0',
+    })
+    if (result.isFailed()) {
+      return Result.fail(result.getError())
+    }
+
     await this.domainEventPublisher.publish(
     await this.domainEventPublisher.publish(
       this.domainEventFactory.createUserAddedToSharedVaultEvent({
       this.domainEventFactory.createUserAddedToSharedVaultEvent({
         sharedVaultUuid: sharedVaultUser.props.sharedVaultUuid.value,
         sharedVaultUuid: sharedVaultUser.props.sharedVaultUuid.value,

+ 9 - 7
packages/syncing-server/src/Domain/UseCase/SharedVaults/RemoveUserFromSharedVault/RemoveUserFromSharedVault.spec.ts

@@ -11,14 +11,14 @@ import { SharedVault } from '../../../SharedVault/SharedVault'
 import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
 import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
 import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/SharedVaultUserRepositoryInterface'
 import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/SharedVaultUserRepositoryInterface'
 import { RemoveUserFromSharedVault } from './RemoveUserFromSharedVault'
 import { RemoveUserFromSharedVault } from './RemoveUserFromSharedVault'
-import { AddNotificationForUser } from '../../Messaging/AddNotificationForUser/AddNotificationForUser'
 import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
 import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
 import { DomainEventInterface, DomainEventPublisherInterface } from '@standardnotes/domain-events'
 import { DomainEventInterface, DomainEventPublisherInterface } from '@standardnotes/domain-events'
+import { AddNotificationsForUsers } from '../../Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
 
 
 describe('RemoveUserFromSharedVault', () => {
 describe('RemoveUserFromSharedVault', () => {
   let sharedVaultRepository: SharedVaultRepositoryInterface
   let sharedVaultRepository: SharedVaultRepositoryInterface
   let sharedVaultUserRepository: SharedVaultUserRepositoryInterface
   let sharedVaultUserRepository: SharedVaultUserRepositoryInterface
-  let addNotificationForUser: AddNotificationForUser
+  let addNotificationsForUsers: AddNotificationsForUsers
   let sharedVault: SharedVault
   let sharedVault: SharedVault
   let sharedVaultUser: SharedVaultUser
   let sharedVaultUser: SharedVaultUser
   let domainEventFactory: DomainEventFactoryInterface
   let domainEventFactory: DomainEventFactoryInterface
@@ -28,7 +28,7 @@ describe('RemoveUserFromSharedVault', () => {
     new RemoveUserFromSharedVault(
     new RemoveUserFromSharedVault(
       sharedVaultUserRepository,
       sharedVaultUserRepository,
       sharedVaultRepository,
       sharedVaultRepository,
-      addNotificationForUser,
+      addNotificationsForUsers,
       domainEventFactory,
       domainEventFactory,
       domainEventPublisher,
       domainEventPublisher,
     )
     )
@@ -53,8 +53,8 @@ describe('RemoveUserFromSharedVault', () => {
     sharedVaultUserRepository.findByUserUuidAndSharedVaultUuid = jest.fn().mockResolvedValue(sharedVaultUser)
     sharedVaultUserRepository.findByUserUuidAndSharedVaultUuid = jest.fn().mockResolvedValue(sharedVaultUser)
     sharedVaultUserRepository.remove = jest.fn()
     sharedVaultUserRepository.remove = jest.fn()
 
 
-    addNotificationForUser = {} as jest.Mocked<AddNotificationForUser>
-    addNotificationForUser.execute = jest.fn().mockReturnValue(Result.ok())
+    addNotificationsForUsers = {} as jest.Mocked<AddNotificationsForUsers>
+    addNotificationsForUsers.execute = jest.fn().mockReturnValue(Result.ok())
 
 
     domainEventFactory = {} as jest.Mocked<DomainEventFactoryInterface>
     domainEventFactory = {} as jest.Mocked<DomainEventFactoryInterface>
     domainEventFactory.createUserRemovedFromSharedVaultEvent = jest
     domainEventFactory.createUserRemovedFromSharedVaultEvent = jest
@@ -199,11 +199,11 @@ describe('RemoveUserFromSharedVault', () => {
       userUuid: '00000000-0000-0000-0000-000000000001',
       userUuid: '00000000-0000-0000-0000-000000000001',
     })
     })
 
 
-    expect(addNotificationForUser.execute).toHaveBeenCalled()
+    expect(addNotificationsForUsers.execute).toHaveBeenCalled()
   })
   })
 
 
   it('should return error if notification could not be added', async () => {
   it('should return error if notification could not be added', async () => {
-    addNotificationForUser.execute = jest.fn().mockResolvedValue(Result.fail('Could not add notification'))
+    addNotificationsForUsers.execute = jest.fn().mockResolvedValue(Result.fail('Could not add notification'))
 
 
     const useCase = createUseCase()
     const useCase = createUseCase()
     const result = await useCase.execute({
     const result = await useCase.execute({
@@ -228,5 +228,7 @@ describe('RemoveUserFromSharedVault', () => {
 
 
     expect(result.isFailed()).toBe(true)
     expect(result.isFailed()).toBe(true)
     expect(result.getError()).toBe('Oops')
     expect(result.getError()).toBe('Oops')
+
+    mock.mockRestore()
   })
   })
 })
 })

+ 4 - 4
packages/syncing-server/src/Domain/UseCase/SharedVaults/RemoveUserFromSharedVault/RemoveUserFromSharedVault.ts

@@ -4,14 +4,14 @@ import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
 import { RemoveUserFromSharedVaultDTO } from './RemoveUserFromSharedVaultDTO'
 import { RemoveUserFromSharedVaultDTO } from './RemoveUserFromSharedVaultDTO'
 import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
 import { SharedVaultRepositoryInterface } from '../../../SharedVault/SharedVaultRepositoryInterface'
 import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/SharedVaultUserRepositoryInterface'
 import { SharedVaultUserRepositoryInterface } from '../../../SharedVault/User/SharedVaultUserRepositoryInterface'
-import { AddNotificationForUser } from '../../Messaging/AddNotificationForUser/AddNotificationForUser'
 import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
 import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryInterface'
+import { AddNotificationsForUsers } from '../../Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
 
 
 export class RemoveUserFromSharedVault implements UseCaseInterface<void> {
 export class RemoveUserFromSharedVault implements UseCaseInterface<void> {
   constructor(
   constructor(
     private sharedVaultUsersRepository: SharedVaultUserRepositoryInterface,
     private sharedVaultUsersRepository: SharedVaultUserRepositoryInterface,
     private sharedVaultRepository: SharedVaultRepositoryInterface,
     private sharedVaultRepository: SharedVaultRepositoryInterface,
-    private addNotificationForUser: AddNotificationForUser,
+    private addNotificationForUsers: AddNotificationsForUsers,
     private domainEventFactory: DomainEventFactoryInterface,
     private domainEventFactory: DomainEventFactoryInterface,
     private domainEventPublisher: DomainEventPublisherInterface,
     private domainEventPublisher: DomainEventPublisherInterface,
   ) {}
   ) {}
@@ -71,8 +71,8 @@ export class RemoveUserFromSharedVault implements UseCaseInterface<void> {
     }
     }
     const notificationPayload = notificationPayloadOrError.getValue()
     const notificationPayload = notificationPayloadOrError.getValue()
 
 
-    const result = await this.addNotificationForUser.execute({
-      userUuid: sharedVaultUser.props.userUuid.value,
+    const result = await this.addNotificationForUsers.execute({
+      sharedVaultUuid: sharedVault.id.toString(),
       type: NotificationType.TYPES.RemovedFromSharedVault,
       type: NotificationType.TYPES.RemovedFromSharedVault,
       payload: notificationPayload,
       payload: notificationPayload,
       version: '1.0',
       version: '1.0',

+ 6 - 6
packages/syncing-server/src/Domain/UseCase/Syncing/UpdateExistingItem/UpdateExistingItem.spec.ts

@@ -18,10 +18,10 @@ import {
 import { SharedVaultAssociation } from '../../../SharedVault/SharedVaultAssociation'
 import { SharedVaultAssociation } from '../../../SharedVault/SharedVaultAssociation'
 import { KeySystemAssociation } from '../../../KeySystem/KeySystemAssociation'
 import { KeySystemAssociation } from '../../../KeySystem/KeySystemAssociation'
 import { DetermineSharedVaultOperationOnItem } from '../../SharedVaults/DetermineSharedVaultOperationOnItem/DetermineSharedVaultOperationOnItem'
 import { DetermineSharedVaultOperationOnItem } from '../../SharedVaults/DetermineSharedVaultOperationOnItem/DetermineSharedVaultOperationOnItem'
-import { AddNotificationForUser } from '../../Messaging/AddNotificationForUser/AddNotificationForUser'
 import { RemoveNotificationsForUser } from '../../Messaging/RemoveNotificationsForUser/RemoveNotificationsForUser'
 import { RemoveNotificationsForUser } from '../../Messaging/RemoveNotificationsForUser/RemoveNotificationsForUser'
 import { SharedVaultOperationOnItem } from '../../../SharedVault/SharedVaultOperationOnItem'
 import { SharedVaultOperationOnItem } from '../../../SharedVault/SharedVaultOperationOnItem'
 import { ItemRepositoryResolverInterface } from '../../../Item/ItemRepositoryResolverInterface'
 import { ItemRepositoryResolverInterface } from '../../../Item/ItemRepositoryResolverInterface'
+import { AddNotificationsForUsers } from '../../Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
 
 
 describe('UpdateExistingItem', () => {
 describe('UpdateExistingItem', () => {
   let itemRepository: ItemRepositoryInterface
   let itemRepository: ItemRepositoryInterface
@@ -32,7 +32,7 @@ describe('UpdateExistingItem', () => {
   let itemHash1: ItemHash
   let itemHash1: ItemHash
   let item1: Item
   let item1: Item
   let determineSharedVaultOperationOnItem: DetermineSharedVaultOperationOnItem
   let determineSharedVaultOperationOnItem: DetermineSharedVaultOperationOnItem
-  let addNotificationForUser: AddNotificationForUser
+  let addNotificationsForUsers: AddNotificationsForUsers
   let removeNotificationsForUser: RemoveNotificationsForUser
   let removeNotificationsForUser: RemoveNotificationsForUser
 
 
   const createUseCase = () =>
   const createUseCase = () =>
@@ -43,7 +43,7 @@ describe('UpdateExistingItem', () => {
       domainEventFactory,
       domainEventFactory,
       5,
       5,
       determineSharedVaultOperationOnItem,
       determineSharedVaultOperationOnItem,
-      addNotificationForUser,
+      addNotificationsForUsers,
       removeNotificationsForUser,
       removeNotificationsForUser,
     )
     )
 
 
@@ -128,8 +128,8 @@ describe('UpdateExistingItem', () => {
       ),
       ),
     )
     )
 
 
-    addNotificationForUser = {} as jest.Mocked<AddNotificationForUser>
-    addNotificationForUser.execute = jest.fn().mockReturnValue(Result.ok())
+    addNotificationsForUsers = {} as jest.Mocked<AddNotificationsForUsers>
+    addNotificationsForUsers.execute = jest.fn().mockReturnValue(Result.ok())
 
 
     removeNotificationsForUser = {} as jest.Mocked<RemoveNotificationsForUser>
     removeNotificationsForUser = {} as jest.Mocked<RemoveNotificationsForUser>
     removeNotificationsForUser.execute = jest.fn().mockReturnValue(Result.ok())
     removeNotificationsForUser.execute = jest.fn().mockReturnValue(Result.ok())
@@ -580,7 +580,7 @@ describe('UpdateExistingItem', () => {
         ),
         ),
       )
       )
 
 
-      addNotificationForUser.execute = jest.fn().mockReturnValue(Result.fail('Oops'))
+      addNotificationsForUsers.execute = jest.fn().mockReturnValue(Result.fail('Oops'))
 
 
       const useCase = createUseCase()
       const useCase = createUseCase()
 
 

+ 4 - 4
packages/syncing-server/src/Domain/UseCase/Syncing/UpdateExistingItem/UpdateExistingItem.ts

@@ -20,10 +20,10 @@ import { SharedVaultAssociation } from '../../../SharedVault/SharedVaultAssociat
 import { KeySystemAssociation } from '../../../KeySystem/KeySystemAssociation'
 import { KeySystemAssociation } from '../../../KeySystem/KeySystemAssociation'
 import { DetermineSharedVaultOperationOnItem } from '../../SharedVaults/DetermineSharedVaultOperationOnItem/DetermineSharedVaultOperationOnItem'
 import { DetermineSharedVaultOperationOnItem } from '../../SharedVaults/DetermineSharedVaultOperationOnItem/DetermineSharedVaultOperationOnItem'
 import { SharedVaultOperationOnItem } from '../../../SharedVault/SharedVaultOperationOnItem'
 import { SharedVaultOperationOnItem } from '../../../SharedVault/SharedVaultOperationOnItem'
-import { AddNotificationForUser } from '../../Messaging/AddNotificationForUser/AddNotificationForUser'
 import { RemoveNotificationsForUser } from '../../Messaging/RemoveNotificationsForUser/RemoveNotificationsForUser'
 import { RemoveNotificationsForUser } from '../../Messaging/RemoveNotificationsForUser/RemoveNotificationsForUser'
 import { ItemRepositoryResolverInterface } from '../../../Item/ItemRepositoryResolverInterface'
 import { ItemRepositoryResolverInterface } from '../../../Item/ItemRepositoryResolverInterface'
 import { ItemHash } from '../../../Item/ItemHash'
 import { ItemHash } from '../../../Item/ItemHash'
+import { AddNotificationsForUsers } from '../../Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
 
 
 export class UpdateExistingItem implements UseCaseInterface<Item> {
 export class UpdateExistingItem implements UseCaseInterface<Item> {
   constructor(
   constructor(
@@ -33,7 +33,7 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
     private domainEventFactory: DomainEventFactoryInterface,
     private domainEventFactory: DomainEventFactoryInterface,
     private revisionFrequency: number,
     private revisionFrequency: number,
     private determineSharedVaultOperationOnItem: DetermineSharedVaultOperationOnItem,
     private determineSharedVaultOperationOnItem: DetermineSharedVaultOperationOnItem,
-    private addNotificationForUser: AddNotificationForUser,
+    private addNotificationForUsers: AddNotificationsForUsers,
     private removeNotificationsForUser: RemoveNotificationsForUser,
     private removeNotificationsForUser: RemoveNotificationsForUser,
   ) {}
   ) {}
 
 
@@ -255,10 +255,10 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
       }
       }
       const payload = notificationPayloadOrError.getValue()
       const payload = notificationPayloadOrError.getValue()
 
 
-      const result = await this.addNotificationForUser.execute({
+      const result = await this.addNotificationForUsers.execute({
         payload,
         payload,
         type: NotificationType.TYPES.SharedVaultItemRemoved,
         type: NotificationType.TYPES.SharedVaultItemRemoved,
-        userUuid: userUuid.value,
+        sharedVaultUuid: sharedVaultOperation.props.sharedVaultUuid.value,
         version: '1.0',
         version: '1.0',
       })
       })
       if (result.isFailed()) {
       if (result.isFailed()) {