Bläddra i källkod

feat(syncing-server): allow surviving only upon account deletion (#857)

Karol Sójko 1 år sedan
förälder
incheckning
609e85f926

+ 1 - 0
packages/syncing-server/src/Domain/Handler/AccountDeletionRequestedEventHandler.ts

@@ -37,6 +37,7 @@ export class AccountDeletionRequestedEventHandler implements DomainEventHandlerI
 
     const deletingVaultsResult = await this.deleteSharedVaults.execute({
       ownerUuid: event.payload.userUuid,
+      allowSurviving: true,
     })
     if (deletingVaultsResult.isFailed()) {
       this.logger.error(

+ 10 - 0
packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVault/DeleteSharedVault.spec.ts

@@ -96,6 +96,7 @@ describe('DeleteSharedVault', () => {
     const result = await useCase.execute({
       sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
       originatorUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: false,
     })
 
     expect(result.isFailed()).toBeFalsy()
@@ -111,6 +112,7 @@ describe('DeleteSharedVault', () => {
     const result = await useCase.execute({
       sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
       originatorUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: false,
     })
 
     expect(result.isFailed()).toBeTruthy()
@@ -125,6 +127,7 @@ describe('DeleteSharedVault', () => {
     const result = await useCase.execute({
       sharedVaultUuid: 'invalid',
       originatorUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: false,
     })
 
     expect(result.isFailed()).toBeTruthy()
@@ -139,6 +142,7 @@ describe('DeleteSharedVault', () => {
     const result = await useCase.execute({
       sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
       originatorUuid: 'invalid',
+      allowSurviving: false,
     })
 
     expect(result.isFailed()).toBeTruthy()
@@ -159,6 +163,7 @@ describe('DeleteSharedVault', () => {
     const result = await useCase.execute({
       sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
       originatorUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: false,
     })
 
     expect(result.isFailed()).toBeTruthy()
@@ -174,6 +179,7 @@ describe('DeleteSharedVault', () => {
     const result = await useCase.execute({
       sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
       originatorUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: false,
     })
 
     expect(result.isFailed()).toBeTruthy()
@@ -188,6 +194,7 @@ describe('DeleteSharedVault', () => {
     const result = await useCase.execute({
       sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
       originatorUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: false,
     })
 
     expect(result.isFailed()).toBeTruthy()
@@ -207,6 +214,7 @@ describe('DeleteSharedVault', () => {
       const result = await useCase.execute({
         sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
         originatorUuid: '00000000-0000-0000-0000-000000000000',
+        allowSurviving: true,
       })
 
       expect(result.isFailed()).toBeFalsy()
@@ -223,6 +231,7 @@ describe('DeleteSharedVault', () => {
       const result = await useCase.execute({
         sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
         originatorUuid: '00000000-0000-0000-0000-000000000000',
+        allowSurviving: true,
       })
 
       expect(result.isFailed()).toBeTruthy()
@@ -239,6 +248,7 @@ describe('DeleteSharedVault', () => {
       const result = await useCase.execute({
         sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
         originatorUuid: '00000000-0000-0000-0000-000000000000',
+        allowSurviving: true,
       })
 
       expect(result.isFailed()).toBeTruthy()

+ 25 - 23
packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVault/DeleteSharedVault.ts

@@ -56,30 +56,32 @@ export class DeleteSharedVault implements UseCaseInterface<{ status: 'deleted' |
       }
     }
 
-    const sharedVaultDesignatedSurvivor =
-      await this.sharedVaultUserRepository.findDesignatedSurvivorBySharedVaultUuid(sharedVaultUuid)
-    if (sharedVaultDesignatedSurvivor) {
-      const result = await this.transferSharedVault.execute({
-        sharedVaultUid: sharedVaultUuid.value,
-        fromUserUuid: originatorUuid.value,
-        toUserUuid: sharedVaultDesignatedSurvivor.props.userUuid.value,
-      })
-
-      if (result.isFailed()) {
-        return Result.fail(result.getError())
+    if (dto.allowSurviving) {
+      const sharedVaultDesignatedSurvivor =
+        await this.sharedVaultUserRepository.findDesignatedSurvivorBySharedVaultUuid(sharedVaultUuid)
+      if (sharedVaultDesignatedSurvivor) {
+        const result = await this.transferSharedVault.execute({
+          sharedVaultUid: sharedVaultUuid.value,
+          fromUserUuid: originatorUuid.value,
+          toUserUuid: sharedVaultDesignatedSurvivor.props.userUuid.value,
+        })
+
+        if (result.isFailed()) {
+          return Result.fail(result.getError())
+        }
+
+        const removingOwnerFromSharedVaultResult = await this.removeUserFromSharedVault.execute({
+          originatorUuid: originatorUuid.value,
+          sharedVaultUuid: sharedVaultUuid.value,
+          userUuid: originatorUuid.value,
+          forceRemoveOwner: true,
+        })
+        if (removingOwnerFromSharedVaultResult.isFailed()) {
+          return Result.fail(removingOwnerFromSharedVaultResult.getError())
+        }
+
+        return Result.ok({ status: 'transitioned' })
       }
-
-      const removingOwnerFromSharedVaultResult = await this.removeUserFromSharedVault.execute({
-        originatorUuid: originatorUuid.value,
-        sharedVaultUuid: sharedVaultUuid.value,
-        userUuid: originatorUuid.value,
-        forceRemoveOwner: true,
-      })
-      if (removingOwnerFromSharedVaultResult.isFailed()) {
-        return Result.fail(removingOwnerFromSharedVaultResult.getError())
-      }
-
-      return Result.ok({ status: 'transitioned' })
     }
 
     const sharedVaultUsers = await this.sharedVaultUserRepository.findBySharedVaultUuid(sharedVaultUuid)

+ 1 - 0
packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVault/DeleteSharedVaultDTO.ts

@@ -1,4 +1,5 @@
 export interface DeleteSharedVaultDTO {
   originatorUuid: string
   sharedVaultUuid: string
+  allowSurviving: boolean
 }

+ 5 - 0
packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaults/DeleteSharedVaults.spec.ts

@@ -32,6 +32,7 @@ describe('DeleteSharedVaults', () => {
 
     const result = await useCase.execute({
       ownerUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: true,
     })
 
     expect(result.isFailed()).toBe(false)
@@ -39,6 +40,7 @@ describe('DeleteSharedVaults', () => {
     expect(deleteSharedVaultUseCase.execute).toHaveBeenCalledWith({
       originatorUuid: '00000000-0000-0000-0000-000000000000',
       sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: true,
     })
   })
 
@@ -48,6 +50,7 @@ describe('DeleteSharedVaults', () => {
 
     const result = await useCase.execute({
       ownerUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: true,
     })
 
     expect(result.isFailed()).toBe(true)
@@ -55,6 +58,7 @@ describe('DeleteSharedVaults', () => {
     expect(deleteSharedVaultUseCase.execute).toHaveBeenCalledWith({
       originatorUuid: '00000000-0000-0000-0000-000000000000',
       sharedVaultUuid: '00000000-0000-0000-0000-000000000000',
+      allowSurviving: true,
     })
   })
 
@@ -63,6 +67,7 @@ describe('DeleteSharedVaults', () => {
 
     const result = await useCase.execute({
       ownerUuid: 'invalid',
+      allowSurviving: true,
     })
 
     expect(result.isFailed()).toBeTruthy()

+ 1 - 0
packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaults/DeleteSharedVaults.ts

@@ -24,6 +24,7 @@ export class DeleteSharedVaults implements UseCaseInterface<Map<Uuid, 'deleted'
       const result = await this.deleteSharedVaultUseCase.execute({
         originatorUuid: ownerUuid.value,
         sharedVaultUuid: sharedVault.id.toString(),
+        allowSurviving: dto.allowSurviving,
       })
       if (result.isFailed()) {
         return Result.fail(result.getError())

+ 1 - 0
packages/syncing-server/src/Domain/UseCase/SharedVaults/DeleteSharedVaults/DeleteSharedVaultsDTO.ts

@@ -1,3 +1,4 @@
 export interface DeleteSharedVaultsDTO {
   ownerUuid: string
+  allowSurviving: boolean
 }

+ 1 - 0
packages/syncing-server/src/Infra/InversifyExpressUtils/Base/BaseSharedVaultsController.ts

@@ -92,6 +92,7 @@ export class BaseSharedVaultsController extends BaseHttpController {
     const result = await this.deleteSharedVaultUseCase.execute({
       sharedVaultUuid: request.params.sharedVaultUuid,
       originatorUuid: response.locals.user.uuid,
+      allowSurviving: false,
     })
 
     if (result.isFailed()) {