Przeglądaj źródła

feat(syncing-server): add deleting outbound messages

Co-authored-by: Mo <mo@standardnotes.com>
Karol Sójko 1 rok temu
rodzic
commit
e8ba49ecca

+ 10 - 0
packages/api-gateway/src/Controller/v1/SharedVaultInvitesController.ts

@@ -83,6 +83,16 @@ export class SharedVaultInvitesController extends BaseHttpController {
     )
   }
 
+  @httpDelete('/invites/outbound')
+  async deleteOutboundUserInvites(request: Request, response: Response): Promise<void> {
+    await this.httpService.callSyncingServer(
+      request,
+      response,
+      this.endpointResolver.resolveEndpointOrMethodIdentifier('DELETE', 'shared-vaults/invites/outbound'),
+      request.body,
+    )
+  }
+
   @httpGet('/invites/outbound')
   async getOutboundUserInvites(request: Request, response: Response): Promise<void> {
     await this.httpService.callSyncingServer(

+ 1 - 0
packages/api-gateway/src/Service/Resolver/EndpointResolver.ts

@@ -79,6 +79,7 @@ export class EndpointResolver implements EndpointResolverInterface {
     ['[POST]:shared-vaults/:sharedVaultUuid/invites/:inviteUuid/accept', 'sync.shared-vault-invites.accept'],
     ['[POST]:shared-vaults/:sharedVaultUuid/invites/:inviteUuid/decline', 'sync.shared-vault-invites.decline'],
     ['[DELETE]:shared-vaults/invites/inbound', 'sync.shared-vault-invites.delete-inbound'],
+    ['[DELETE]:shared-vaults/invites/outbound', 'sync.shared-vault-invites.delete-outbound'],
     ['[GET]:shared-vaults/invites/outbound', 'sync.shared-vault-invites.get-outbound'],
     ['[GET]:shared-vaults/invites', 'sync.shared-vault-invites.get-user-invites'],
     ['[GET]:shared-vaults/:sharedVaultUuid/invites', 'sync.shared-vault-invites.get-vault-invites'],

+ 12 - 0
packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.spec.ts

@@ -24,6 +24,7 @@ describe('DeleteSharedVaultInvitesSentByUser', () => {
 
     sharedVaultInviteRepository = {} as jest.Mocked<SharedVaultInviteRepositoryInterface>
     sharedVaultInviteRepository.findBySenderUuidAndSharedVaultUuid = jest.fn().mockReturnValue([sharedVaultInvite])
+    sharedVaultInviteRepository.findBySenderUuid = jest.fn().mockReturnValue([sharedVaultInvite])
 
     declineInviteToSharedVault = {} as jest.Mocked<DeclineInviteToSharedVault>
     declineInviteToSharedVault.execute = jest.fn().mockReturnValue(Result.ok())
@@ -75,4 +76,15 @@ describe('DeleteSharedVaultInvitesSentByUser', () => {
 
     expect(result.isFailed()).toBeTruthy()
   })
+
+  it('should decline all invites by user to all shared vaults', async () => {
+    const useCase = createUseCase()
+
+    const result = await useCase.execute({
+      userUuid: '00000000-0000-0000-0000-000000000000',
+    })
+
+    expect(result.isFailed()).toBeFalsy()
+    expect(declineInviteToSharedVault.execute).toHaveBeenCalled()
+  })
 })

+ 14 - 8
packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.ts

@@ -16,16 +16,22 @@ export class DeleteSharedVaultInvitesSentByUser implements UseCaseInterface<void
     }
     const userUuid = userUuidOrError.getValue()
 
-    const sharedVaultUuidOrError = Uuid.create(dto.sharedVaultUuid)
-    if (sharedVaultUuidOrError.isFailed()) {
-      return Result.fail(sharedVaultUuidOrError.getError())
+    let inboundInvites = []
+    if (dto.sharedVaultUuid !== undefined) {
+      const sharedVaultUuidOrError = Uuid.create(dto.sharedVaultUuid)
+      if (sharedVaultUuidOrError.isFailed()) {
+        return Result.fail(sharedVaultUuidOrError.getError())
+      }
+      const sharedVaultUuid = sharedVaultUuidOrError.getValue()
+
+      inboundInvites = await this.sharedVaultInviteRepository.findBySenderUuidAndSharedVaultUuid({
+        senderUuid: userUuid,
+        sharedVaultUuid,
+      })
+    } else {
+      inboundInvites = await this.sharedVaultInviteRepository.findBySenderUuid(userUuid)
     }
-    const sharedVaultUuid = sharedVaultUuidOrError.getValue()
 
-    const inboundInvites = await this.sharedVaultInviteRepository.findBySenderUuidAndSharedVaultUuid({
-      senderUuid: userUuid,
-      sharedVaultUuid,
-    })
     for (const invite of inboundInvites) {
       const result = await this.declineInviteToSharedVault.execute({
         inviteUuid: invite.id.toString(),

+ 1 - 1
packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUserDTO.ts

@@ -1,4 +1,4 @@
 export interface DeleteSharedVaultInvitesSentByUserDTO {
   userUuid: string
-  sharedVaultUuid: string
+  sharedVaultUuid?: string
 }

+ 25 - 0
packages/syncing-server/src/Infra/InversifyExpressUtils/HomeServer/HomeServerSharedVaultInvitesController.ts

@@ -38,6 +38,10 @@ export class HomeServerSharedVaultInvitesController extends BaseHttpController {
         'sync.shared-vault-invites.delete-inbound',
         this.deleteInboundUserInvites.bind(this),
       )
+      this.controllerContainer.register(
+        'sync.shared-vault-invites.delete-outbound',
+        this.deleteOutboundUserInvites.bind(this),
+      )
       this.controllerContainer.register(
         'sync.shared-vault-invites.get-outbound',
         this.getOutboundUserInvites.bind(this),
@@ -172,6 +176,27 @@ export class HomeServerSharedVaultInvitesController extends BaseHttpController {
     })
   }
 
+  async deleteOutboundUserInvites(_request: Request, response: Response): Promise<results.JsonResult> {
+    const result = await this.deleteSharedVaultInvitesSentByUserUseCase.execute({
+      userUuid: response.locals.user.uuid,
+    })
+
+    if (result.isFailed()) {
+      return this.json(
+        {
+          error: {
+            message: result.getError(),
+          },
+        },
+        HttpStatusCode.BadRequest,
+      )
+    }
+
+    return this.json({
+      success: true,
+    })
+  }
+
   async getOutboundUserInvites(_request: Request, response: Response): Promise<results.JsonResult> {
     const result = await this.getSharedVaultInvitesSentByUserUseCase.execute({
       senderUuid: response.locals.user.uuid,

+ 5 - 0
packages/syncing-server/src/Infra/InversifyExpressUtils/InversifyExpressSharedVaultInvitesController.ts

@@ -72,6 +72,11 @@ export class InversifyExpressSharedVaultInvitesController extends HomeServerShar
     return super.deleteInboundUserInvites(request, response)
   }
 
+  @httpDelete('/invites/outbound')
+  override async deleteOutboundUserInvites(request: Request, response: Response): Promise<results.JsonResult> {
+    return super.deleteOutboundUserInvites(request, response)
+  }
+
   @httpGet('/invites/outbound')
   override async getOutboundUserInvites(request: Request, response: Response): Promise<results.JsonResult> {
     return super.getOutboundUserInvites(request, response)

+ 1 - 0
packages/syncing-server/src/Mapping/Http/MessageHttpMapper.ts

@@ -14,6 +14,7 @@ export class MessageHttpMapper implements MapperInterface<Message, MessageHttpRe
       recipient_uuid: domain.props.recipientUuid.value,
       sender_uuid: domain.props.senderUuid.value,
       encrypted_message: domain.props.encryptedMessage,
+      replaceability_identifier: domain.props.replaceabilityIdentifier,
       created_at_timestamp: domain.props.timestamps.createdAt,
       updated_at_timestamp: domain.props.timestamps.updatedAt,
     }

+ 1 - 0
packages/syncing-server/src/Mapping/Http/MessageHttpRepresentation.ts

@@ -3,6 +3,7 @@ export interface MessageHttpRepresentation {
   recipient_uuid: string
   sender_uuid: string
   encrypted_message: string
+  replaceability_identifier: string | null
   created_at_timestamp: number
   updated_at_timestamp: number
 }