From 68c46d01fba31f3608665e8b1f1be667e5d7e947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20K=C3=B6nig?= <33655937+jkoenig134@users.noreply.github.com> Date: Mon, 16 Dec 2024 09:15:55 +0100 Subject: [PATCH] Expose setting the length of the grace period when initiating an IdentityDeletionProcess (#368) * feat: add InitiateIdentityDeletionProcessRequest * feat: update facade * chore: update tests --- .../app-runtime/test/runtime/Startup.test.ts | 4 ++-- .../IdentityDeletionProcessesFacade.ts | 5 ++-- .../runtime/src/useCases/common/Schemas.ts | 16 +++++++++++++ .../InitiateIdentityDeletionProcess.ts | 23 ++++++++++++++----- .../runtime/test/transport/account.test.ts | 5 ++-- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/packages/app-runtime/test/runtime/Startup.test.ts b/packages/app-runtime/test/runtime/Startup.test.ts index 4574934e9..57c26ce58 100644 --- a/packages/app-runtime/test/runtime/Startup.test.ts +++ b/packages/app-runtime/test/runtime/Startup.test.ts @@ -87,14 +87,14 @@ describe("Start Accounts", function () { }); test("should delete Account running startAccounts for an Identity with expired grace period", async function () { - await session.transportServices.identityDeletionProcesses["initiateIdentityDeletionProcessUseCase"]["identityDeletionProcessController"].initiateIdentityDeletionProcess(0); + await session.transportServices.identityDeletionProcesses.initiateIdentityDeletionProcess({ lengthOfGracePeriodInDays: 0 }); await runtime["startAccounts"](); await expect(runtime.selectAccount(session.account.id)).rejects.toThrow("error.transport.recordNotFound"); }); test("should delete Account running startAccounts for a deleted Identity", async function () { - await session.transportServices.identityDeletionProcesses["initiateIdentityDeletionProcessUseCase"]["identityDeletionProcessController"].initiateIdentityDeletionProcess(0); + await session.transportServices.identityDeletionProcesses.initiateIdentityDeletionProcess({ lengthOfGracePeriodInDays: 0 }); await TestUtil.runDeletionJob(); await runtime["startAccounts"](); diff --git a/packages/runtime/src/extensibility/facades/transport/IdentityDeletionProcessesFacade.ts b/packages/runtime/src/extensibility/facades/transport/IdentityDeletionProcessesFacade.ts index 0df76814b..8d499a0f4 100644 --- a/packages/runtime/src/extensibility/facades/transport/IdentityDeletionProcessesFacade.ts +++ b/packages/runtime/src/extensibility/facades/transport/IdentityDeletionProcessesFacade.ts @@ -8,6 +8,7 @@ import { GetIdentityDeletionProcessesUseCase, GetIdentityDeletionProcessRequest, GetIdentityDeletionProcessUseCase, + InitiateIdentityDeletionProcessRequest, InitiateIdentityDeletionProcessUseCase, RejectIdentityDeletionProcessUseCase } from "../../../useCases"; @@ -31,8 +32,8 @@ export class IdentityDeletionProcessesFacade { return await this.rejectIdentityDeletionProcessUseCase.execute(); } - public async initiateIdentityDeletionProcess(): Promise> { - return await this.initiateIdentityDeletionProcessUseCase.execute(); + public async initiateIdentityDeletionProcess(request: InitiateIdentityDeletionProcessRequest = {}): Promise> { + return await this.initiateIdentityDeletionProcessUseCase.execute(request); } public async cancelIdentityDeletionProcess(): Promise> { diff --git a/packages/runtime/src/useCases/common/Schemas.ts b/packages/runtime/src/useCases/common/Schemas.ts index 78b8b303c..b4e81f05c 100644 --- a/packages/runtime/src/useCases/common/Schemas.ts +++ b/packages/runtime/src/useCases/common/Schemas.ts @@ -20638,6 +20638,22 @@ export const GetIdentityDeletionProcessRequest: any = { } } +export const InitiateIdentityDeletionProcessRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/InitiateIdentityDeletionProcessRequest", + "definitions": { + "InitiateIdentityDeletionProcessRequest": { + "type": "object", + "properties": { + "lengthOfGracePeriodInDays": { + "type": "number" + } + }, + "additionalProperties": false + } + } +} + export const DownloadAttachmentRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", "$ref": "#/definitions/DownloadAttachmentRequest", diff --git a/packages/runtime/src/useCases/transport/identityDeletionProcesses/InitiateIdentityDeletionProcess.ts b/packages/runtime/src/useCases/transport/identityDeletionProcesses/InitiateIdentityDeletionProcess.ts index 3b5f2037c..a3187f9a2 100644 --- a/packages/runtime/src/useCases/transport/identityDeletionProcesses/InitiateIdentityDeletionProcess.ts +++ b/packages/runtime/src/useCases/transport/identityDeletionProcesses/InitiateIdentityDeletionProcess.ts @@ -2,25 +2,36 @@ import { Result } from "@js-soft/ts-utils"; import { AccountController, IdentityDeletionProcessController, IdentityDeletionProcessStatus } from "@nmshd/transport"; import { Inject } from "@nmshd/typescript-ioc"; import { IdentityDeletionProcessDTO } from "../../../types/transport/IdentityDeletionProcessDTO"; -import { RuntimeErrors, UseCase } from "../../common"; +import { RuntimeErrors, SchemaRepository, SchemaValidator, UseCase } from "../../common"; import { IdentityDeletionProcessMapper } from "./IdentityDeletionProcessMapper"; -export class InitiateIdentityDeletionProcessUseCase extends UseCase { +export interface InitiateIdentityDeletionProcessRequest { + lengthOfGracePeriodInDays?: number; +} + +class Validator extends SchemaValidator { + public constructor(@Inject schemaRepository: SchemaRepository) { + super(schemaRepository.getSchema("InitiateIdentityDeletionProcessRequest")); + } +} + +export class InitiateIdentityDeletionProcessUseCase extends UseCase { public constructor( @Inject private readonly identityDeletionProcessController: IdentityDeletionProcessController, - @Inject private readonly accountController: AccountController + @Inject private readonly accountController: AccountController, + @Inject validator: Validator ) { - super(); + super(validator); } - protected async executeInternal(): Promise> { + protected async executeInternal(request: InitiateIdentityDeletionProcessRequest): Promise> { const identityDeletionProcess = await this.identityDeletionProcessController.getIdentityDeletionProcessByStatus( IdentityDeletionProcessStatus.Approved, IdentityDeletionProcessStatus.WaitingForApproval ); if (identityDeletionProcess) return Result.fail(RuntimeErrors.identityDeletionProcess.activeIdentityDeletionProcessAlreadyExists()); - const initiatedIdentityDeletionProcess = await this.identityDeletionProcessController.initiateIdentityDeletionProcess(); + const initiatedIdentityDeletionProcess = await this.identityDeletionProcessController.initiateIdentityDeletionProcess(request.lengthOfGracePeriodInDays); await this.accountController.syncDatawallet(); return Result.ok(IdentityDeletionProcessMapper.toIdentityDeletionProcessDTO(initiatedIdentityDeletionProcess)); } diff --git a/packages/runtime/test/transport/account.test.ts b/packages/runtime/test/transport/account.test.ts index 019495d5d..6ab950f88 100644 --- a/packages/runtime/test/transport/account.test.ts +++ b/packages/runtime/test/transport/account.test.ts @@ -228,12 +228,11 @@ describe("CheckIfIdentityIsDeleted", () => { }); test("check deletion of Identity that has IdentityDeletionProcess with expired grace period", async () => { - const identityDeletionProcess = - await sTransportServices.identityDeletionProcesses["initiateIdentityDeletionProcessUseCase"]["identityDeletionProcessController"].initiateIdentityDeletionProcess(0); + const identityDeletionProcess = await sTransportServices.identityDeletionProcesses.initiateIdentityDeletionProcess({ lengthOfGracePeriodInDays: 0 }); const result = await sTransportServices.account.checkIfIdentityIsDeleted(); expect(result.isSuccess).toBe(true); expect(result.value.isDeleted).toBe(true); - expect(result.value.deletionDate).toBe(identityDeletionProcess.cache!.gracePeriodEndsAt!.toString()); + expect(result.value.deletionDate).toBe(identityDeletionProcess.value.gracePeriodEndsAt!.toString()); }); });