From 5a17b015e92d2c1ad5e22eb2aa33a8e8b964242b Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 21 Nov 2025 11:41:03 +0100 Subject: [PATCH 1/6] refactor: change the use case and related namings --- .../modules/openid4vc/OpenId4VcController.ts | 17 +++--- .../AcceptedAuthorizationRequestDTO.ts | 4 -- .../consumption/FetchedCredentialOfferDTO.ts | 3 - .../Oid4VpVerificationResultDTO.ts | 4 ++ ....ts => ResolvedAuthorizationRequestDTO.ts} | 2 +- .../consumption/ResolvedCredentialOfferDTO.ts | 3 + .../runtime-types/src/consumption/index.ts | 6 +- .../facades/consumption/OpenId4VcFacade.ts | 32 +++++----- .../runtime/src/useCases/common/Schemas.ts | 60 +++++++++---------- .../openid4vc/AcceptAuthorizationRequest.ts | 10 ++-- .../openid4vc/AcceptCredentialOffer.ts | 36 +++++++++++ .../openid4vc/FetchCredentialOffer.ts | 29 --------- .../openid4vc/GetVerifiableCredentials.ts | 4 +- .../ResolveAndAcceptCredentialOffer.ts | 29 +++++++++ .../openid4vc/ResolveAuthorizationRequest.ts | 12 ++-- .../openid4vc/ResolveCredentialOffer.ts | 12 ++-- .../openid4vc/ResolveFetchedCredential.ts | 36 ----------- .../useCases/consumption/openid4vc/index.ts | 4 +- .../test/consumption/openid4vc.test.ts | 22 +++---- 19 files changed, 162 insertions(+), 163 deletions(-) delete mode 100644 packages/runtime-types/src/consumption/AcceptedAuthorizationRequestDTO.ts delete mode 100644 packages/runtime-types/src/consumption/FetchedCredentialOfferDTO.ts create mode 100644 packages/runtime-types/src/consumption/Oid4VpVerificationResultDTO.ts rename packages/runtime-types/src/consumption/{FetchedAuthorizationRequestDTO.ts => ResolvedAuthorizationRequestDTO.ts} (76%) create mode 100644 packages/runtime-types/src/consumption/ResolvedCredentialOfferDTO.ts create mode 100644 packages/runtime/src/useCases/consumption/openid4vc/AcceptCredentialOffer.ts delete mode 100644 packages/runtime/src/useCases/consumption/openid4vc/FetchCredentialOffer.ts create mode 100644 packages/runtime/src/useCases/consumption/openid4vc/ResolveAndAcceptCredentialOffer.ts delete mode 100644 packages/runtime/src/useCases/consumption/openid4vc/ResolveFetchedCredential.ts diff --git a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts index 6a7ad0b0f..659980e21 100644 --- a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts +++ b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts @@ -25,7 +25,7 @@ export class OpenId4VcController extends ConsumptionBaseController { return this.parent.consumptionConfig.fetchInstance ?? fetch; } - public async fetchCredentialOffer(credentialOfferUrl: string): Promise<{ data: string }> { + public async resolveCredentialOffer(credentialOfferUrl: string): Promise<{ data: string }> { const holder = new Holder(this.keyStorage, this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); const res = await holder.resolveCredentialOffer(credentialOfferUrl); @@ -34,15 +34,14 @@ export class OpenId4VcController extends ConsumptionBaseController { }; } - public async processFetchedCredentialOffer( - fetchedCredentialOffer: string, - requestedCredentialOffers: string[], + public async acceptCredentialOffer( + credentialOffer: string, + credentialConfigurationIds: string[], pinCode?: string ): Promise<{ data: string; id: string; type: string; displayInformation: string | undefined }> { const holder = new Holder(this.keyStorage, this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); - const credentialOffer = JSON.parse(fetchedCredentialOffer); - const credentials = await holder.requestAndStoreCredentials(credentialOffer, { credentialsToRequest: requestedCredentialOffers, txCode: pinCode }); + const credentials = await holder.requestAndStoreCredentials(JSON.parse(credentialOffer), { credentialsToRequest: credentialConfigurationIds, txCode: pinCode }); // TODO: support multiple credentials const credential = credentials[0].content.value as VerifiableCredential; @@ -56,7 +55,7 @@ export class OpenId4VcController extends ConsumptionBaseController { }; } - public async processCredentialOffer(credentialOffer: string): Promise<{ data: string; id: string; type: string; displayInformation: string | undefined }> { + public async resolveAndAcceptCredentialOffer(credentialOffer: string): Promise<{ data: string; id: string; type: string; displayInformation: string | undefined }> { const holder = new Holder(this.keyStorage, this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); const res = await holder.resolveCredentialOffer(credentialOffer); @@ -75,11 +74,11 @@ export class OpenId4VcController extends ConsumptionBaseController { } public async resolveAuthorizationRequest( - requestUrl: string + authorizationRequestUrl: string ): Promise<{ authorizationRequest: OpenId4VpResolvedAuthorizationRequest; usedCredentials: { id: string; data: string; type: string; displayInformation?: string }[] }> { const holder = new Holder(this.keyStorage, this.parent.accountController, this.parent.attributes, this.fetchInstance); await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); - const authorizationRequest = await holder.resolveAuthorizationRequest(requestUrl); + const authorizationRequest = await holder.resolveAuthorizationRequest(authorizationRequestUrl); // TODO: extract DTOs diff --git a/packages/runtime-types/src/consumption/AcceptedAuthorizationRequestDTO.ts b/packages/runtime-types/src/consumption/AcceptedAuthorizationRequestDTO.ts deleted file mode 100644 index f7fada0e1..000000000 --- a/packages/runtime-types/src/consumption/AcceptedAuthorizationRequestDTO.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface AcceptAuthorizationRequestDTO { - status: number; - message: string; -} diff --git a/packages/runtime-types/src/consumption/FetchedCredentialOfferDTO.ts b/packages/runtime-types/src/consumption/FetchedCredentialOfferDTO.ts deleted file mode 100644 index b669e51eb..000000000 --- a/packages/runtime-types/src/consumption/FetchedCredentialOfferDTO.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface FetchedCredentialOfferDTO { - jsonRepresentation: string; -} diff --git a/packages/runtime-types/src/consumption/Oid4VpVerificationResultDTO.ts b/packages/runtime-types/src/consumption/Oid4VpVerificationResultDTO.ts new file mode 100644 index 000000000..9aaf12de5 --- /dev/null +++ b/packages/runtime-types/src/consumption/Oid4VpVerificationResultDTO.ts @@ -0,0 +1,4 @@ +export interface Oid4VpVerificationResultDTO { + status: number; + message: string; +} diff --git a/packages/runtime-types/src/consumption/FetchedAuthorizationRequestDTO.ts b/packages/runtime-types/src/consumption/ResolvedAuthorizationRequestDTO.ts similarity index 76% rename from packages/runtime-types/src/consumption/FetchedAuthorizationRequestDTO.ts rename to packages/runtime-types/src/consumption/ResolvedAuthorizationRequestDTO.ts index ce97265ea..a14026481 100644 --- a/packages/runtime-types/src/consumption/FetchedAuthorizationRequestDTO.ts +++ b/packages/runtime-types/src/consumption/ResolvedAuthorizationRequestDTO.ts @@ -1,6 +1,6 @@ import { VerifiableCredentialDTO } from "./VerifiableCredentialDTO"; -export interface FetchedAuthorizationRequestDTO { +export interface ResolvedAuthorizationRequestDTO { authorizationRequest: Record; usedCredentials: VerifiableCredentialDTO[]; } diff --git a/packages/runtime-types/src/consumption/ResolvedCredentialOfferDTO.ts b/packages/runtime-types/src/consumption/ResolvedCredentialOfferDTO.ts new file mode 100644 index 000000000..9cb96a384 --- /dev/null +++ b/packages/runtime-types/src/consumption/ResolvedCredentialOfferDTO.ts @@ -0,0 +1,3 @@ +export interface ResolvedCredentialOfferDTO { + jsonRepresentation: string; +} diff --git a/packages/runtime-types/src/consumption/index.ts b/packages/runtime-types/src/consumption/index.ts index c9fb6f886..fbda75e3e 100644 --- a/packages/runtime-types/src/consumption/index.ts +++ b/packages/runtime-types/src/consumption/index.ts @@ -1,15 +1,15 @@ -export * from "./AcceptedAuthorizationRequestDTO"; export * from "./AttributeTagCollectionDTO"; export * from "./CredentialOfferDTO"; export * from "./DraftDTO"; -export * from "./FetchedAuthorizationRequestDTO"; -export * from "./FetchedCredentialOfferDTO"; export * from "./IdentityMetadataDTO"; export * from "./LocalAttributeDeletionInfoDTO"; export * from "./LocalAttributeDTO"; export * from "./LocalAttributeForwardingDetailsDTO"; export * from "./LocalNotificationDTO"; export * from "./LocalRequestDTO"; +export * from "./Oid4VpVerificationResultDTO"; export * from "./RequestValidationResultDTO"; +export * from "./ResolvedAuthorizationRequestDTO"; +export * from "./ResolvedCredentialOfferDTO"; export * from "./SettingDTO"; export * from "./VerifiableCredentialDTO"; diff --git a/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts index 29d796111..73a1c5ac0 100644 --- a/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts +++ b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts @@ -1,47 +1,47 @@ import { ApplicationError, Result } from "@js-soft/ts-utils"; -import { AcceptAuthorizationRequestDTO, FetchedAuthorizationRequestDTO, FetchedCredentialOfferDTO, VerifiableCredentialDTO } from "@nmshd/runtime-types"; +import { Oid4VpVerificationResultDTO, ResolvedAuthorizationRequestDTO, ResolvedCredentialOfferDTO, VerifiableCredentialDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import { AcceptAuthorizationRequestRequest, AcceptAuthorizationRequestUseCase, - FetchCredentialOfferRequest, - FetchCredentialOfferUseCase, - FetchedCredentialOfferRequest, + AcceptCredentialOfferRequest, + AcceptCredentialOfferUseCase, GetVerifiableCredentialsUseCase, + ResolveAndAcceptCredentialOfferRequest, + ResolveAndAcceptCredentialOfferUseCase, ResolveAuthorizationRequestRequest, ResolveAuthorizationRequestUseCase, ResolveCredentialOfferRequest, - ResolveCredentialOfferUseCase, - ResolveFetchedCredentialOfferUseCase + ResolveCredentialOfferUseCase } from "../../../useCases"; export class OpenId4VcFacade { public constructor( @Inject private readonly resolveCredentialOfferUseCase: ResolveCredentialOfferUseCase, - @Inject private readonly fetchOfferUseCase: FetchCredentialOfferUseCase, - @Inject private readonly resolveFetchedOfferUseCase: ResolveFetchedCredentialOfferUseCase, + @Inject private readonly resolveAndAcceptCredentialOfferUseCase: ResolveAndAcceptCredentialOfferUseCase, + @Inject private readonly acceptCredentialOfferUseCase: AcceptCredentialOfferUseCase, @Inject private readonly resolveAuthorizationRequestUseCase: ResolveAuthorizationRequestUseCase, @Inject private readonly acceptAuthorizationRequestUseCase: AcceptAuthorizationRequestUseCase, @Inject private readonly getVerifiableCredentialsUseCase: GetVerifiableCredentialsUseCase ) {} - public async resolveCredentialOffer(request: ResolveCredentialOfferRequest): Promise> { - return await this.resolveCredentialOfferUseCase.execute(request); + public async resolveAndAcceptCredentialOffer(request: ResolveAndAcceptCredentialOfferRequest): Promise> { + return await this.resolveAndAcceptCredentialOfferUseCase.execute(request); } - public async fetchCredentialOffer(request: FetchCredentialOfferRequest): Promise> { - return await this.fetchOfferUseCase.execute(request); + public async resolveCredentialOffer(request: ResolveCredentialOfferRequest): Promise> { + return await this.resolveCredentialOfferUseCase.execute(request); } - public async resolveFetchedCredentialOffer(request: FetchedCredentialOfferRequest): Promise> { - return await this.resolveFetchedOfferUseCase.execute(request); + public async acceptCredentialOffer(request: AcceptCredentialOfferRequest): Promise> { + return await this.acceptCredentialOfferUseCase.execute(request); } - public async resolveAuthorizationRequest(request: ResolveAuthorizationRequestRequest): Promise> { + public async resolveAuthorizationRequest(request: ResolveAuthorizationRequestRequest): Promise> { return await this.resolveAuthorizationRequestUseCase.execute(request); } - public async acceptAuthorizationRequest(request: AcceptAuthorizationRequestRequest): Promise> { + public async acceptAuthorizationRequest(request: AcceptAuthorizationRequestRequest): Promise> { return await this.acceptAuthorizationRequestUseCase.execute(request); } diff --git a/packages/runtime/src/useCases/common/Schemas.ts b/packages/runtime/src/useCases/common/Schemas.ts index ec57ad2ee..9e498db17 100644 --- a/packages/runtime/src/useCases/common/Schemas.ts +++ b/packages/runtime/src/useCases/common/Schemas.ts @@ -16718,19 +16718,29 @@ export const AcceptAuthorizationRequestRequest: any = { } } -export const FetchCredentialOfferRequest: any = { +export const AcceptCredentialOfferRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/FetchCredentialOfferRequest", + "$ref": "#/definitions/AcceptCredentialOfferRequest", "definitions": { - "FetchCredentialOfferRequest": { + "AcceptCredentialOfferRequest": { "type": "object", "properties": { - "credentialOfferUrl": { + "credentialOffer": { "type": "string" + }, + "pinCode": { + "type": "string" + }, + "credentialConfigurationIds": { + "type": "array", + "items": { + "type": "string" + } } }, "required": [ - "credentialOfferUrl" + "credentialOffer", + "credentialConfigurationIds" ], "additionalProperties": false } @@ -16756,67 +16766,57 @@ export const GetVerifiableCredentialsRequest: any = { } } -export const ResolveAuthorizationRequestRequest: any = { +export const ResolveAndAcceptCredentialOfferRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/ResolveAuthorizationRequestRequest", + "$ref": "#/definitions/ResolveAndAcceptCredentialOfferRequest", "definitions": { - "ResolveAuthorizationRequestRequest": { + "ResolveAndAcceptCredentialOfferRequest": { "type": "object", "properties": { - "requestUrl": { + "credentialOfferUrl": { "type": "string" } }, "required": [ - "requestUrl" + "credentialOfferUrl" ], "additionalProperties": false } } } -export const ResolveCredentialOfferRequest: any = { +export const ResolveAuthorizationRequestRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/ResolveCredentialOfferRequest", + "$ref": "#/definitions/ResolveAuthorizationRequestRequest", "definitions": { - "ResolveCredentialOfferRequest": { + "ResolveAuthorizationRequestRequest": { "type": "object", "properties": { - "credentialOfferUrl": { + "authorizationRequestUrl": { "type": "string" } }, "required": [ - "credentialOfferUrl" + "authorizationRequestUrl" ], "additionalProperties": false } } } -export const FetchedCredentialOfferRequest: any = { +export const ResolveCredentialOfferRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/FetchedCredentialOfferRequest", + "$ref": "#/definitions/ResolveCredentialOfferRequest", "definitions": { - "FetchedCredentialOfferRequest": { + "ResolveCredentialOfferRequest": { "type": "object", "properties": { - "data": { - "type": "string" - }, - "pinCode": { + "credentialOfferUrl": { "type": "string" - }, - "requestedCredentials": { - "type": "array", - "items": { - "type": "string" - } } }, "required": [ - "data", - "requestedCredentials" + "credentialOfferUrl" ], "additionalProperties": false } diff --git a/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts index 95b1bed56..60a4aa063 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts @@ -1,7 +1,7 @@ import { OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; import { Result } from "@js-soft/ts-utils"; import { OpenId4VcController } from "@nmshd/consumption"; -import { AcceptAuthorizationRequestDTO } from "@nmshd/runtime-types"; +import { Oid4VpVerificationResultDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; @@ -15,16 +15,16 @@ class Validator extends SchemaValidator { } } -export class AcceptAuthorizationRequestUseCase extends UseCase { +export class AcceptAuthorizationRequestUseCase extends UseCase { public constructor( - @Inject private readonly openId4VcContoller: OpenId4VcController, + @Inject private readonly openId4VcController: OpenId4VcController, @Inject validator: Validator ) { super(validator); } - protected override async executeInternal(request: AcceptAuthorizationRequestRequest): Promise> { - const result = await this.openId4VcContoller.acceptAuthorizationRequest(request.authorizationRequest as OpenId4VpResolvedAuthorizationRequest); + protected override async executeInternal(request: AcceptAuthorizationRequestRequest): Promise> { + const result = await this.openId4VcController.acceptAuthorizationRequest(request.authorizationRequest as OpenId4VpResolvedAuthorizationRequest); return Result.ok({ status: result.status, message: JSON.stringify(result.message) }); } } diff --git a/packages/runtime/src/useCases/consumption/openid4vc/AcceptCredentialOffer.ts b/packages/runtime/src/useCases/consumption/openid4vc/AcceptCredentialOffer.ts new file mode 100644 index 000000000..0076cf47e --- /dev/null +++ b/packages/runtime/src/useCases/consumption/openid4vc/AcceptCredentialOffer.ts @@ -0,0 +1,36 @@ +import { Result } from "@js-soft/ts-utils"; +import { OpenId4VcController } from "@nmshd/consumption"; +import { VerifiableCredentialDTO } from "@nmshd/runtime-types"; +import { Inject } from "@nmshd/typescript-ioc"; +import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; + +export interface AcceptCredentialOfferRequest { + credentialOffer: string; + pinCode?: string; + credentialConfigurationIds: string[]; +} + +class Validator extends SchemaValidator { + public constructor(@Inject schemaRepository: SchemaRepository) { + super(schemaRepository.getSchema("AcceptCredentialOfferRequest")); + } +} + +export class AcceptCredentialOfferUseCase extends UseCase { + public constructor( + @Inject private readonly openId4VcController: OpenId4VcController, + @Inject validator: Validator + ) { + super(validator); + } + + protected override async executeInternal(request: AcceptCredentialOfferRequest): Promise> { + const result = await this.openId4VcController.acceptCredentialOffer(request.credentialOffer, request.credentialConfigurationIds, request.pinCode); + return Result.ok({ + data: result.data, + id: result.id, + type: result.type, + displayInformation: result.displayInformation + }); + } +} diff --git a/packages/runtime/src/useCases/consumption/openid4vc/FetchCredentialOffer.ts b/packages/runtime/src/useCases/consumption/openid4vc/FetchCredentialOffer.ts deleted file mode 100644 index 6d1067aad..000000000 --- a/packages/runtime/src/useCases/consumption/openid4vc/FetchCredentialOffer.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Result } from "@js-soft/ts-utils"; -import { OpenId4VcController } from "@nmshd/consumption"; -import { FetchedCredentialOfferDTO } from "@nmshd/runtime-types"; -import { Inject } from "@nmshd/typescript-ioc"; -import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; - -export interface FetchCredentialOfferRequest { - credentialOfferUrl: string; -} - -class Validator extends SchemaValidator { - public constructor(@Inject schemaRepository: SchemaRepository) { - super(schemaRepository.getSchema("FetchCredentialOfferRequest")); - } -} - -export class FetchCredentialOfferUseCase extends UseCase { - public constructor( - @Inject private readonly openId4VcContoller: OpenId4VcController, - @Inject validator: Validator - ) { - super(validator); - } - - protected override async executeInternal(request: FetchCredentialOfferRequest): Promise> { - const result = await this.openId4VcContoller.fetchCredentialOffer(request.credentialOfferUrl); - return Result.ok({ jsonRepresentation: result.data } as FetchedCredentialOfferDTO); - } -} diff --git a/packages/runtime/src/useCases/consumption/openid4vc/GetVerifiableCredentials.ts b/packages/runtime/src/useCases/consumption/openid4vc/GetVerifiableCredentials.ts index 55beb77d7..679f518ad 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/GetVerifiableCredentials.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/GetVerifiableCredentials.ts @@ -16,14 +16,14 @@ class Validator extends SchemaValidator { export class GetVerifiableCredentialsUseCase extends UseCase { public constructor( - @Inject private readonly openId4VcContoller: OpenId4VcController, + @Inject private readonly openId4VcController: OpenId4VcController, @Inject validator: Validator ) { super(validator); } protected override async executeInternal(request: GetVerifiableCredentialsRequest): Promise> { - const credentials = await this.openId4VcContoller.getVerifiableCredentials(request.ids); + const credentials = await this.openId4VcController.getVerifiableCredentials(request.ids); return Result.ok(credentials); } } diff --git a/packages/runtime/src/useCases/consumption/openid4vc/ResolveAndAcceptCredentialOffer.ts b/packages/runtime/src/useCases/consumption/openid4vc/ResolveAndAcceptCredentialOffer.ts new file mode 100644 index 000000000..2fbc5c795 --- /dev/null +++ b/packages/runtime/src/useCases/consumption/openid4vc/ResolveAndAcceptCredentialOffer.ts @@ -0,0 +1,29 @@ +import { Result } from "@js-soft/ts-utils"; +import { OpenId4VcController } from "@nmshd/consumption"; +import { VerifiableCredentialDTO } from "@nmshd/runtime-types"; +import { Inject } from "@nmshd/typescript-ioc"; +import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; + +export interface ResolveAndAcceptCredentialOfferRequest { + credentialOfferUrl: string; +} + +class Validator extends SchemaValidator { + public constructor(@Inject schemaRepository: SchemaRepository) { + super(schemaRepository.getSchema("ResolveAndAcceptCredentialOfferRequest")); + } +} + +export class ResolveAndAcceptCredentialOfferUseCase extends UseCase { + public constructor( + @Inject private readonly openId4VcController: OpenId4VcController, + @Inject validator: Validator + ) { + super(validator); + } + + protected override async executeInternal(request: ResolveAndAcceptCredentialOfferRequest): Promise> { + const result = await this.openId4VcController.resolveAndAcceptCredentialOffer(request.credentialOfferUrl); + return Result.ok(result); + } +} diff --git a/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts b/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts index 430032a44..657d813e5 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts @@ -1,12 +1,12 @@ import { Result } from "@js-soft/ts-utils"; import { OpenId4VcController } from "@nmshd/consumption"; -import { FetchedAuthorizationRequestDTO } from "@nmshd/runtime-types"; +import { ResolvedAuthorizationRequestDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import stringifySafe from "json-stringify-safe"; import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; export interface ResolveAuthorizationRequestRequest { - requestUrl: string; + authorizationRequestUrl: string; } class Validator extends SchemaValidator { @@ -15,16 +15,16 @@ class Validator extends SchemaValidator { } } -export class ResolveAuthorizationRequestUseCase extends UseCase { +export class ResolveAuthorizationRequestUseCase extends UseCase { public constructor( - @Inject private readonly openId4VcContoller: OpenId4VcController, + @Inject private readonly openId4VcController: OpenId4VcController, @Inject validator: Validator ) { super(validator); } - protected override async executeInternal(request: ResolveAuthorizationRequestRequest): Promise> { - const result = await this.openId4VcContoller.resolveAuthorizationRequest(request.requestUrl); + protected override async executeInternal(request: ResolveAuthorizationRequestRequest): Promise> { + const result = await this.openId4VcController.resolveAuthorizationRequest(request.authorizationRequestUrl); return Result.ok({ authorizationRequest: JSON.parse(stringifySafe(result.authorizationRequest)), diff --git a/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts b/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts index 4a29eb874..ca6127fdb 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts @@ -1,6 +1,6 @@ import { Result } from "@js-soft/ts-utils"; import { OpenId4VcController } from "@nmshd/consumption"; -import { VerifiableCredentialDTO } from "@nmshd/runtime-types"; +import { ResolvedCredentialOfferDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; @@ -14,16 +14,16 @@ class Validator extends SchemaValidator { } } -export class ResolveCredentialOfferUseCase extends UseCase { +export class ResolveCredentialOfferUseCase extends UseCase { public constructor( - @Inject private readonly openId4VcContoller: OpenId4VcController, + @Inject private readonly openId4VcController: OpenId4VcController, @Inject validator: Validator ) { super(validator); } - protected override async executeInternal(request: ResolveCredentialOfferRequest): Promise> { - const result = await this.openId4VcContoller.processCredentialOffer(request.credentialOfferUrl); - return Result.ok(result); + protected override async executeInternal(request: ResolveCredentialOfferRequest): Promise> { + const result = await this.openId4VcController.resolveCredentialOffer(request.credentialOfferUrl); + return Result.ok({ jsonRepresentation: result.data } as ResolvedCredentialOfferDTO); } } diff --git a/packages/runtime/src/useCases/consumption/openid4vc/ResolveFetchedCredential.ts b/packages/runtime/src/useCases/consumption/openid4vc/ResolveFetchedCredential.ts deleted file mode 100644 index 81d090b3a..000000000 --- a/packages/runtime/src/useCases/consumption/openid4vc/ResolveFetchedCredential.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Result } from "@js-soft/ts-utils"; -import { OpenId4VcController } from "@nmshd/consumption"; -import { VerifiableCredentialDTO } from "@nmshd/runtime-types"; -import { Inject } from "@nmshd/typescript-ioc"; -import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; - -export interface FetchedCredentialOfferRequest { - data: string; - pinCode?: string; - requestedCredentials: string[]; -} - -class Validator extends SchemaValidator { - public constructor(@Inject schemaRepository: SchemaRepository) { - super(schemaRepository.getSchema("FetchedCredentialOfferRequest")); - } -} - -export class ResolveFetchedCredentialOfferUseCase extends UseCase { - public constructor( - @Inject private readonly openId4VcContoller: OpenId4VcController, - @Inject validator: Validator - ) { - super(validator); - } - - protected override async executeInternal(request: FetchedCredentialOfferRequest): Promise> { - const result = await this.openId4VcContoller.processFetchedCredentialOffer(request.data, request.requestedCredentials, request.pinCode); - return Result.ok({ - data: result.data, - id: result.id, - type: result.type, - displayInformation: result.displayInformation - }); - } -} diff --git a/packages/runtime/src/useCases/consumption/openid4vc/index.ts b/packages/runtime/src/useCases/consumption/openid4vc/index.ts index 9d19e641b..146e3ed44 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/index.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/index.ts @@ -1,6 +1,6 @@ export * from "./AcceptAuthorizationRequest"; -export * from "./FetchCredentialOffer"; +export * from "./AcceptCredentialOffer"; export * from "./GetVerifiableCredentials"; +export * from "./ResolveAndAcceptCredentialOffer"; export * from "./ResolveAuthorizationRequest"; export * from "./ResolveCredentialOffer"; -export * from "./ResolveFetchedCredential"; diff --git a/packages/runtime/test/consumption/openid4vc.test.ts b/packages/runtime/test/consumption/openid4vc.test.ts index b74071943..144c232e9 100644 --- a/packages/runtime/test/consumption/openid4vc.test.ts +++ b/packages/runtime/test/consumption/openid4vc.test.ts @@ -54,7 +54,7 @@ describe("custom openid4vc service", () => { credentialOfferUrl = responseData.result.credentialOffer; - const result = await consumptionServices.openId4Vc.fetchCredentialOffer({ + const result = await consumptionServices.openId4Vc.resolveCredentialOffer({ credentialOfferUrl }); @@ -72,9 +72,9 @@ describe("custom openid4vc service", () => { requestedCredentials = credentialOfferDecoded["credentialOfferPayload"]["credential_configuration_ids"]; } - const acceptanceResult = await consumptionServices.openId4Vc.resolveFetchedCredentialOffer({ - data: jsonRepresentation, - requestedCredentials: requestedCredentials + const acceptanceResult = await consumptionServices.openId4Vc.acceptCredentialOffer({ + credentialOffer: jsonRepresentation, + credentialConfigurationIds: requestedCredentials }); expect(acceptanceResult).toBeSuccessful(); expect(typeof acceptanceResult.value.id).toBe("string"); @@ -119,7 +119,7 @@ describe("custom openid4vc service", () => { expect(response.status).toBe(200); const responseData = await response.data; - const result = await consumptionServices.openId4Vc.resolveAuthorizationRequest({ requestUrl: responseData.result.presentationRequest }); + const result = await consumptionServices.openId4Vc.resolveAuthorizationRequest({ authorizationRequestUrl: responseData.result.presentationRequest }); expect(result.value.usedCredentials).toHaveLength(1); const request = result.value.authorizationRequest as OpenId4VpResolvedAuthorizationRequest; @@ -245,25 +245,25 @@ describe("EUDIPLO", () => { }) ).data.uri; - const loadResult = await consumptionServices.openId4Vc.fetchCredentialOffer({ credentialOfferUrl }); + const loadResult = await consumptionServices.openId4Vc.resolveCredentialOffer({ credentialOfferUrl }); expect(loadResult).toBeSuccessful(); - const resolveResult = await consumptionServices.openId4Vc.resolveFetchedCredentialOffer({ - data: loadResult.value.jsonRepresentation, - requestedCredentials: [eudiploCredentialIdInConfiguration] + const resolveResult = await consumptionServices.openId4Vc.acceptCredentialOffer({ + credentialOffer: loadResult.value.jsonRepresentation, + credentialConfigurationIds: [eudiploCredentialIdInConfiguration] }); expect(resolveResult).toBeSuccessful(); }); test("presentation", async () => { - const requestUrl = ( + const authorizationRequestUrl = ( await axiosInstance.post(`/presentation-management/request`, { response_type: "uri", // eslint-disable-line @typescript-eslint/naming-convention requestId: eudiploPresentationConfigurationId }) ).data.uri; - const loadResult = await consumptionServices.openId4Vc.resolveAuthorizationRequest({ requestUrl }); + const loadResult = await consumptionServices.openId4Vc.resolveAuthorizationRequest({ authorizationRequestUrl }); expect(loadResult).toBeSuccessful(); const queryResult = loadResult.value.authorizationRequest.dcql.queryResult; From 464c83202df9c806e1c544f7257b99d027831a3f Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 21 Nov 2025 14:18:58 +0100 Subject: [PATCH 2/6] refactor: remove combination use case, rename response --- .../modules/openid4vc/OpenId4VcController.ts | 18 ------------ .../Oid4VpVerificationResultDTO.ts | 4 --- .../runtime-types/src/consumption/index.ts | 1 - .../facades/consumption/OpenId4VcFacade.ts | 12 ++------ .../openid4vc/AcceptAuthorizationRequest.ts | 10 +++++-- .../ResolveAndAcceptCredentialOffer.ts | 29 ------------------- .../useCases/consumption/openid4vc/index.ts | 1 - 7 files changed, 10 insertions(+), 65 deletions(-) delete mode 100644 packages/runtime-types/src/consumption/Oid4VpVerificationResultDTO.ts delete mode 100644 packages/runtime/src/useCases/consumption/openid4vc/ResolveAndAcceptCredentialOffer.ts diff --git a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts index 659980e21..63b7d1753 100644 --- a/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts +++ b/packages/consumption/src/modules/openid4vc/OpenId4VcController.ts @@ -55,24 +55,6 @@ export class OpenId4VcController extends ConsumptionBaseController { }; } - public async resolveAndAcceptCredentialOffer(credentialOffer: string): Promise<{ data: string; id: string; type: string; displayInformation: string | undefined }> { - const holder = new Holder(this.keyStorage, this.parent.accountController, this.parent.attributes, this.fetchInstance); - await holder.initializeAgent("96213c3d7fc8d4d6754c7a0fd969598e"); - const res = await holder.resolveCredentialOffer(credentialOffer); - const credentials = await holder.requestAndStoreCredentials(res, { credentialsToRequest: Object.keys(res.offeredCredentialConfigurations) }); - - // TODO: support multiple credentials - const credential = credentials[0].content.value as VerifiableCredential; - - return { - data: credential.value, - // multi credentials not supported yet - id: credentials[0].id.toString(), - type: credential.type, - displayInformation: credential.displayInformation - }; - } - public async resolveAuthorizationRequest( authorizationRequestUrl: string ): Promise<{ authorizationRequest: OpenId4VpResolvedAuthorizationRequest; usedCredentials: { id: string; data: string; type: string; displayInformation?: string }[] }> { diff --git a/packages/runtime-types/src/consumption/Oid4VpVerificationResultDTO.ts b/packages/runtime-types/src/consumption/Oid4VpVerificationResultDTO.ts deleted file mode 100644 index 9aaf12de5..000000000 --- a/packages/runtime-types/src/consumption/Oid4VpVerificationResultDTO.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface Oid4VpVerificationResultDTO { - status: number; - message: string; -} diff --git a/packages/runtime-types/src/consumption/index.ts b/packages/runtime-types/src/consumption/index.ts index fbda75e3e..06f43be51 100644 --- a/packages/runtime-types/src/consumption/index.ts +++ b/packages/runtime-types/src/consumption/index.ts @@ -7,7 +7,6 @@ export * from "./LocalAttributeDTO"; export * from "./LocalAttributeForwardingDetailsDTO"; export * from "./LocalNotificationDTO"; export * from "./LocalRequestDTO"; -export * from "./Oid4VpVerificationResultDTO"; export * from "./RequestValidationResultDTO"; export * from "./ResolvedAuthorizationRequestDTO"; export * from "./ResolvedCredentialOfferDTO"; diff --git a/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts index 73a1c5ac0..5cfb374a5 100644 --- a/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts +++ b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts @@ -1,14 +1,13 @@ import { ApplicationError, Result } from "@js-soft/ts-utils"; -import { Oid4VpVerificationResultDTO, ResolvedAuthorizationRequestDTO, ResolvedCredentialOfferDTO, VerifiableCredentialDTO } from "@nmshd/runtime-types"; +import { ResolvedAuthorizationRequestDTO, ResolvedCredentialOfferDTO, VerifiableCredentialDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import { AcceptAuthorizationRequestRequest, + AcceptAuthorizationRequestResponse, AcceptAuthorizationRequestUseCase, AcceptCredentialOfferRequest, AcceptCredentialOfferUseCase, GetVerifiableCredentialsUseCase, - ResolveAndAcceptCredentialOfferRequest, - ResolveAndAcceptCredentialOfferUseCase, ResolveAuthorizationRequestRequest, ResolveAuthorizationRequestUseCase, ResolveCredentialOfferRequest, @@ -18,17 +17,12 @@ import { export class OpenId4VcFacade { public constructor( @Inject private readonly resolveCredentialOfferUseCase: ResolveCredentialOfferUseCase, - @Inject private readonly resolveAndAcceptCredentialOfferUseCase: ResolveAndAcceptCredentialOfferUseCase, @Inject private readonly acceptCredentialOfferUseCase: AcceptCredentialOfferUseCase, @Inject private readonly resolveAuthorizationRequestUseCase: ResolveAuthorizationRequestUseCase, @Inject private readonly acceptAuthorizationRequestUseCase: AcceptAuthorizationRequestUseCase, @Inject private readonly getVerifiableCredentialsUseCase: GetVerifiableCredentialsUseCase ) {} - public async resolveAndAcceptCredentialOffer(request: ResolveAndAcceptCredentialOfferRequest): Promise> { - return await this.resolveAndAcceptCredentialOfferUseCase.execute(request); - } - public async resolveCredentialOffer(request: ResolveCredentialOfferRequest): Promise> { return await this.resolveCredentialOfferUseCase.execute(request); } @@ -41,7 +35,7 @@ export class OpenId4VcFacade { return await this.resolveAuthorizationRequestUseCase.execute(request); } - public async acceptAuthorizationRequest(request: AcceptAuthorizationRequestRequest): Promise> { + public async acceptAuthorizationRequest(request: AcceptAuthorizationRequestRequest): Promise> { return await this.acceptAuthorizationRequestUseCase.execute(request); } diff --git a/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts index 60a4aa063..46b2c455e 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts @@ -1,7 +1,6 @@ import { OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; import { Result } from "@js-soft/ts-utils"; import { OpenId4VcController } from "@nmshd/consumption"; -import { Oid4VpVerificationResultDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; @@ -9,13 +8,18 @@ export interface AcceptAuthorizationRequestRequest { authorizationRequest: Record; } +export interface AcceptAuthorizationRequestResponse { + status: number; + message: string; +} + class Validator extends SchemaValidator { public constructor(@Inject schemaRepository: SchemaRepository) { super(schemaRepository.getSchema("AcceptAuthorizationRequestRequest")); } } -export class AcceptAuthorizationRequestUseCase extends UseCase { +export class AcceptAuthorizationRequestUseCase extends UseCase { public constructor( @Inject private readonly openId4VcController: OpenId4VcController, @Inject validator: Validator @@ -23,7 +27,7 @@ export class AcceptAuthorizationRequestUseCase extends UseCase> { + protected override async executeInternal(request: AcceptAuthorizationRequestRequest): Promise> { const result = await this.openId4VcController.acceptAuthorizationRequest(request.authorizationRequest as OpenId4VpResolvedAuthorizationRequest); return Result.ok({ status: result.status, message: JSON.stringify(result.message) }); } diff --git a/packages/runtime/src/useCases/consumption/openid4vc/ResolveAndAcceptCredentialOffer.ts b/packages/runtime/src/useCases/consumption/openid4vc/ResolveAndAcceptCredentialOffer.ts deleted file mode 100644 index 2fbc5c795..000000000 --- a/packages/runtime/src/useCases/consumption/openid4vc/ResolveAndAcceptCredentialOffer.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Result } from "@js-soft/ts-utils"; -import { OpenId4VcController } from "@nmshd/consumption"; -import { VerifiableCredentialDTO } from "@nmshd/runtime-types"; -import { Inject } from "@nmshd/typescript-ioc"; -import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; - -export interface ResolveAndAcceptCredentialOfferRequest { - credentialOfferUrl: string; -} - -class Validator extends SchemaValidator { - public constructor(@Inject schemaRepository: SchemaRepository) { - super(schemaRepository.getSchema("ResolveAndAcceptCredentialOfferRequest")); - } -} - -export class ResolveAndAcceptCredentialOfferUseCase extends UseCase { - public constructor( - @Inject private readonly openId4VcController: OpenId4VcController, - @Inject validator: Validator - ) { - super(validator); - } - - protected override async executeInternal(request: ResolveAndAcceptCredentialOfferRequest): Promise> { - const result = await this.openId4VcController.resolveAndAcceptCredentialOffer(request.credentialOfferUrl); - return Result.ok(result); - } -} diff --git a/packages/runtime/src/useCases/consumption/openid4vc/index.ts b/packages/runtime/src/useCases/consumption/openid4vc/index.ts index 146e3ed44..12295fc15 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/index.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/index.ts @@ -1,6 +1,5 @@ export * from "./AcceptAuthorizationRequest"; export * from "./AcceptCredentialOffer"; export * from "./GetVerifiableCredentials"; -export * from "./ResolveAndAcceptCredentialOffer"; export * from "./ResolveAuthorizationRequest"; export * from "./ResolveCredentialOffer"; From 1908886196431b92d749425b45be61f8f9b305bf Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 21 Nov 2025 14:21:45 +0100 Subject: [PATCH 3/6] chore: build schemas --- .../runtime/src/useCases/common/Schemas.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/packages/runtime/src/useCases/common/Schemas.ts b/packages/runtime/src/useCases/common/Schemas.ts index 9e498db17..47a616b80 100644 --- a/packages/runtime/src/useCases/common/Schemas.ts +++ b/packages/runtime/src/useCases/common/Schemas.ts @@ -16766,25 +16766,6 @@ export const GetVerifiableCredentialsRequest: any = { } } -export const ResolveAndAcceptCredentialOfferRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/ResolveAndAcceptCredentialOfferRequest", - "definitions": { - "ResolveAndAcceptCredentialOfferRequest": { - "type": "object", - "properties": { - "credentialOfferUrl": { - "type": "string" - } - }, - "required": [ - "credentialOfferUrl" - ], - "additionalProperties": false - } - } -} - export const ResolveAuthorizationRequestRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", "$ref": "#/definitions/ResolveAuthorizationRequestRequest", From 4542c261799dabcbcf6829e027d1e7ecb64155c8 Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 21 Nov 2025 14:35:59 +0100 Subject: [PATCH 4/6] refactor: use more responses --- .../consumption/ResolvedAuthorizationRequestDTO.ts | 6 ------ .../src/consumption/ResolvedCredentialOfferDTO.ts | 3 --- packages/runtime-types/src/consumption/index.ts | 2 -- .../facades/consumption/OpenId4VcFacade.ts | 8 +++++--- .../openid4vc/ResolveAuthorizationRequest.ts | 11 ++++++++--- .../consumption/openid4vc/ResolveCredentialOffer.ts | 8 ++++++-- 6 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 packages/runtime-types/src/consumption/ResolvedAuthorizationRequestDTO.ts delete mode 100644 packages/runtime-types/src/consumption/ResolvedCredentialOfferDTO.ts diff --git a/packages/runtime-types/src/consumption/ResolvedAuthorizationRequestDTO.ts b/packages/runtime-types/src/consumption/ResolvedAuthorizationRequestDTO.ts deleted file mode 100644 index a14026481..000000000 --- a/packages/runtime-types/src/consumption/ResolvedAuthorizationRequestDTO.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { VerifiableCredentialDTO } from "./VerifiableCredentialDTO"; - -export interface ResolvedAuthorizationRequestDTO { - authorizationRequest: Record; - usedCredentials: VerifiableCredentialDTO[]; -} diff --git a/packages/runtime-types/src/consumption/ResolvedCredentialOfferDTO.ts b/packages/runtime-types/src/consumption/ResolvedCredentialOfferDTO.ts deleted file mode 100644 index 9cb96a384..000000000 --- a/packages/runtime-types/src/consumption/ResolvedCredentialOfferDTO.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ResolvedCredentialOfferDTO { - jsonRepresentation: string; -} diff --git a/packages/runtime-types/src/consumption/index.ts b/packages/runtime-types/src/consumption/index.ts index 06f43be51..9d93032ca 100644 --- a/packages/runtime-types/src/consumption/index.ts +++ b/packages/runtime-types/src/consumption/index.ts @@ -8,7 +8,5 @@ export * from "./LocalAttributeForwardingDetailsDTO"; export * from "./LocalNotificationDTO"; export * from "./LocalRequestDTO"; export * from "./RequestValidationResultDTO"; -export * from "./ResolvedAuthorizationRequestDTO"; -export * from "./ResolvedCredentialOfferDTO"; export * from "./SettingDTO"; export * from "./VerifiableCredentialDTO"; diff --git a/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts index 5cfb374a5..a9bdf369b 100644 --- a/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts +++ b/packages/runtime/src/extensibility/facades/consumption/OpenId4VcFacade.ts @@ -1,5 +1,5 @@ import { ApplicationError, Result } from "@js-soft/ts-utils"; -import { ResolvedAuthorizationRequestDTO, ResolvedCredentialOfferDTO, VerifiableCredentialDTO } from "@nmshd/runtime-types"; +import { VerifiableCredentialDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import { AcceptAuthorizationRequestRequest, @@ -9,8 +9,10 @@ import { AcceptCredentialOfferUseCase, GetVerifiableCredentialsUseCase, ResolveAuthorizationRequestRequest, + ResolveAuthorizationRequestResponse, ResolveAuthorizationRequestUseCase, ResolveCredentialOfferRequest, + ResolveCredentialOfferResponse, ResolveCredentialOfferUseCase } from "../../../useCases"; @@ -23,7 +25,7 @@ export class OpenId4VcFacade { @Inject private readonly getVerifiableCredentialsUseCase: GetVerifiableCredentialsUseCase ) {} - public async resolveCredentialOffer(request: ResolveCredentialOfferRequest): Promise> { + public async resolveCredentialOffer(request: ResolveCredentialOfferRequest): Promise> { return await this.resolveCredentialOfferUseCase.execute(request); } @@ -31,7 +33,7 @@ export class OpenId4VcFacade { return await this.acceptCredentialOfferUseCase.execute(request); } - public async resolveAuthorizationRequest(request: ResolveAuthorizationRequestRequest): Promise> { + public async resolveAuthorizationRequest(request: ResolveAuthorizationRequestRequest): Promise> { return await this.resolveAuthorizationRequestUseCase.execute(request); } diff --git a/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts b/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts index 657d813e5..3b0c1dd79 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/ResolveAuthorizationRequest.ts @@ -1,6 +1,6 @@ import { Result } from "@js-soft/ts-utils"; import { OpenId4VcController } from "@nmshd/consumption"; -import { ResolvedAuthorizationRequestDTO } from "@nmshd/runtime-types"; +import { VerifiableCredentialDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import stringifySafe from "json-stringify-safe"; import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; @@ -9,13 +9,18 @@ export interface ResolveAuthorizationRequestRequest { authorizationRequestUrl: string; } +export interface ResolveAuthorizationRequestResponse { + authorizationRequest: Record; + usedCredentials: VerifiableCredentialDTO[]; +} + class Validator extends SchemaValidator { public constructor(@Inject schemaRepository: SchemaRepository) { super(schemaRepository.getSchema("ResolveAuthorizationRequestRequest")); } } -export class ResolveAuthorizationRequestUseCase extends UseCase { +export class ResolveAuthorizationRequestUseCase extends UseCase { public constructor( @Inject private readonly openId4VcController: OpenId4VcController, @Inject validator: Validator @@ -23,7 +28,7 @@ export class ResolveAuthorizationRequestUseCase extends UseCase> { + protected override async executeInternal(request: ResolveAuthorizationRequestRequest): Promise> { const result = await this.openId4VcController.resolveAuthorizationRequest(request.authorizationRequestUrl); return Result.ok({ diff --git a/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts b/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts index ca6127fdb..b2f6dfc65 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts @@ -8,13 +8,17 @@ export interface ResolveCredentialOfferRequest { credentialOfferUrl: string; } +export interface ResolveCredentialOfferResponse { + jsonRepresentation: string; +} + class Validator extends SchemaValidator { public constructor(@Inject schemaRepository: SchemaRepository) { super(schemaRepository.getSchema("ResolveCredentialOfferRequest")); } } -export class ResolveCredentialOfferUseCase extends UseCase { +export class ResolveCredentialOfferUseCase extends UseCase { public constructor( @Inject private readonly openId4VcController: OpenId4VcController, @Inject validator: Validator @@ -22,7 +26,7 @@ export class ResolveCredentialOfferUseCase extends UseCase> { + protected override async executeInternal(request: ResolveCredentialOfferRequest): Promise> { const result = await this.openId4VcController.resolveCredentialOffer(request.credentialOfferUrl); return Result.ok({ jsonRepresentation: result.data } as ResolvedCredentialOfferDTO); } From 0c28dc42a7476d6b6cc326f6540f2dd9dde600d4 Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 21 Nov 2025 14:38:45 +0100 Subject: [PATCH 5/6] fix: complete response usage --- .../useCases/consumption/openid4vc/ResolveCredentialOffer.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts b/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts index b2f6dfc65..b68dedf17 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/ResolveCredentialOffer.ts @@ -1,6 +1,5 @@ import { Result } from "@js-soft/ts-utils"; import { OpenId4VcController } from "@nmshd/consumption"; -import { ResolvedCredentialOfferDTO } from "@nmshd/runtime-types"; import { Inject } from "@nmshd/typescript-ioc"; import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; @@ -28,6 +27,6 @@ export class ResolveCredentialOfferUseCase extends UseCase> { const result = await this.openId4VcController.resolveCredentialOffer(request.credentialOfferUrl); - return Result.ok({ jsonRepresentation: result.data } as ResolvedCredentialOfferDTO); + return Result.ok({ jsonRepresentation: result.data }); } } From da75191e195d2fae26d05700509d865c0c3ff542 Mon Sep 17 00:00:00 2001 From: mkuhn Date: Fri, 21 Nov 2025 15:53:09 +0100 Subject: [PATCH 6/6] fix: don't use credo type in runtime --- packages/runtime/src/useCases/common/Schemas.ts | 4 +--- .../consumption/openid4vc/AcceptAuthorizationRequest.ts | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/runtime/src/useCases/common/Schemas.ts b/packages/runtime/src/useCases/common/Schemas.ts index 47a616b80..03b27a25c 100644 --- a/packages/runtime/src/useCases/common/Schemas.ts +++ b/packages/runtime/src/useCases/common/Schemas.ts @@ -16706,9 +16706,7 @@ export const AcceptAuthorizationRequestRequest: any = { "AcceptAuthorizationRequestRequest": { "type": "object", "properties": { - "authorizationRequest": { - "type": "object" - } + "authorizationRequest": {} }, "required": [ "authorizationRequest" diff --git a/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts index 46b2c455e..8ec76fbc1 100644 --- a/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts +++ b/packages/runtime/src/useCases/consumption/openid4vc/AcceptAuthorizationRequest.ts @@ -1,11 +1,10 @@ -import { OpenId4VpResolvedAuthorizationRequest } from "@credo-ts/openid4vc"; import { Result } from "@js-soft/ts-utils"; import { OpenId4VcController } from "@nmshd/consumption"; import { Inject } from "@nmshd/typescript-ioc"; import { SchemaRepository, SchemaValidator, UseCase } from "../../common"; export interface AcceptAuthorizationRequestRequest { - authorizationRequest: Record; + authorizationRequest: any; } export interface AcceptAuthorizationRequestResponse { @@ -28,7 +27,7 @@ export class AcceptAuthorizationRequestUseCase extends UseCase> { - const result = await this.openId4VcController.acceptAuthorizationRequest(request.authorizationRequest as OpenId4VpResolvedAuthorizationRequest); + const result = await this.openId4VcController.acceptAuthorizationRequest(request.authorizationRequest); return Result.ok({ status: result.status, message: JSON.stringify(result.message) }); } }