diff --git a/packages/api-gateway/src/Controller/v1/SharedVaultInvitesController.ts b/packages/api-gateway/src/Controller/v1/SharedVaultInvitesController.ts index 393797bd1..debbc658f 100644 --- a/packages/api-gateway/src/Controller/v1/SharedVaultInvitesController.ts +++ b/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 { + 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 { await this.httpService.callSyncingServer( diff --git a/packages/api-gateway/src/Service/Resolver/EndpointResolver.ts b/packages/api-gateway/src/Service/Resolver/EndpointResolver.ts index a32475873..6c4bc38e1 100644 --- a/packages/api-gateway/src/Service/Resolver/EndpointResolver.ts +++ b/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'], diff --git a/packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.spec.ts b/packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.spec.ts index 0b7499cb8..7ee89dd10 100644 --- a/packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.spec.ts +++ b/packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.spec.ts @@ -24,6 +24,7 @@ describe('DeleteSharedVaultInvitesSentByUser', () => { sharedVaultInviteRepository = {} as jest.Mocked sharedVaultInviteRepository.findBySenderUuidAndSharedVaultUuid = jest.fn().mockReturnValue([sharedVaultInvite]) + sharedVaultInviteRepository.findBySenderUuid = jest.fn().mockReturnValue([sharedVaultInvite]) declineInviteToSharedVault = {} as jest.Mocked 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() + }) }) diff --git a/packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.ts b/packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.ts index 795124407..8964d6e78 100644 --- a/packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.ts +++ b/packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser.ts @@ -16,16 +16,22 @@ export class DeleteSharedVaultInvitesSentByUser implements UseCaseInterface { + 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 { const result = await this.getSharedVaultInvitesSentByUserUseCase.execute({ senderUuid: response.locals.user.uuid, diff --git a/packages/syncing-server/src/Infra/InversifyExpressUtils/InversifyExpressSharedVaultInvitesController.ts b/packages/syncing-server/src/Infra/InversifyExpressUtils/InversifyExpressSharedVaultInvitesController.ts index 5cf669028..8fc7fc805 100644 --- a/packages/syncing-server/src/Infra/InversifyExpressUtils/InversifyExpressSharedVaultInvitesController.ts +++ b/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 { + return super.deleteOutboundUserInvites(request, response) + } + @httpGet('/invites/outbound') override async getOutboundUserInvites(request: Request, response: Response): Promise { return super.getOutboundUserInvites(request, response) diff --git a/packages/syncing-server/src/Mapping/Http/MessageHttpMapper.ts b/packages/syncing-server/src/Mapping/Http/MessageHttpMapper.ts index 21f32c0ef..4b1d7e283 100644 --- a/packages/syncing-server/src/Mapping/Http/MessageHttpMapper.ts +++ b/packages/syncing-server/src/Mapping/Http/MessageHttpMapper.ts @@ -14,6 +14,7 @@ export class MessageHttpMapper implements MapperInterface