Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 7 additions & 26 deletions packages/consumption/src/modules/openid4vc/OpenId4VcController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -34,33 +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 });

// 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 processCredentialOffer(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) });
const credentials = await holder.requestAndStoreCredentials(JSON.parse(credentialOffer), { credentialsToRequest: credentialConfigurationIds, txCode: pinCode });

// TODO: support multiple credentials
const credential = credentials[0].content.value as VerifiableCredential;
Expand All @@ -75,11 +56,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

Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

3 changes: 0 additions & 3 deletions packages/runtime-types/src/consumption/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
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";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,47 +1,43 @@
import { ApplicationError, Result } from "@js-soft/ts-utils";
import { AcceptAuthorizationRequestDTO, FetchedAuthorizationRequestDTO, FetchedCredentialOfferDTO, VerifiableCredentialDTO } from "@nmshd/runtime-types";
import { VerifiableCredentialDTO } from "@nmshd/runtime-types";
import { Inject } from "@nmshd/typescript-ioc";
import {
AcceptAuthorizationRequestRequest,
AcceptAuthorizationRequestResponse,
AcceptAuthorizationRequestUseCase,
FetchCredentialOfferRequest,
FetchCredentialOfferUseCase,
FetchedCredentialOfferRequest,
AcceptCredentialOfferRequest,
AcceptCredentialOfferUseCase,
GetVerifiableCredentialsUseCase,
ResolveAuthorizationRequestRequest,
ResolveAuthorizationRequestResponse,
ResolveAuthorizationRequestUseCase,
ResolveCredentialOfferRequest,
ResolveCredentialOfferUseCase,
ResolveFetchedCredentialOfferUseCase
ResolveCredentialOfferResponse,
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 acceptCredentialOfferUseCase: AcceptCredentialOfferUseCase,
@Inject private readonly resolveAuthorizationRequestUseCase: ResolveAuthorizationRequestUseCase,
@Inject private readonly acceptAuthorizationRequestUseCase: AcceptAuthorizationRequestUseCase,
@Inject private readonly getVerifiableCredentialsUseCase: GetVerifiableCredentialsUseCase
) {}

public async resolveCredentialOffer(request: ResolveCredentialOfferRequest): Promise<Result<VerifiableCredentialDTO, ApplicationError>> {
public async resolveCredentialOffer(request: ResolveCredentialOfferRequest): Promise<Result<ResolveCredentialOfferResponse, ApplicationError>> {
return await this.resolveCredentialOfferUseCase.execute(request);
}

public async fetchCredentialOffer(request: FetchCredentialOfferRequest): Promise<Result<FetchedCredentialOfferDTO, ApplicationError>> {
return await this.fetchOfferUseCase.execute(request);
public async acceptCredentialOffer(request: AcceptCredentialOfferRequest): Promise<Result<VerifiableCredentialDTO, ApplicationError>> {
return await this.acceptCredentialOfferUseCase.execute(request);
}

public async resolveFetchedCredentialOffer(request: FetchedCredentialOfferRequest): Promise<Result<VerifiableCredentialDTO, ApplicationError>> {
return await this.resolveFetchedOfferUseCase.execute(request);
}

public async resolveAuthorizationRequest(request: ResolveAuthorizationRequestRequest): Promise<Result<FetchedAuthorizationRequestDTO, ApplicationError>> {
public async resolveAuthorizationRequest(request: ResolveAuthorizationRequestRequest): Promise<Result<ResolveAuthorizationRequestResponse, ApplicationError>> {
return await this.resolveAuthorizationRequestUseCase.execute(request);
}

public async acceptAuthorizationRequest(request: AcceptAuthorizationRequestRequest): Promise<Result<AcceptAuthorizationRequestDTO, ApplicationError>> {
public async acceptAuthorizationRequest(request: AcceptAuthorizationRequestRequest): Promise<Result<AcceptAuthorizationRequestResponse, ApplicationError>> {
return await this.acceptAuthorizationRequestUseCase.execute(request);
}

Expand Down
57 changes: 18 additions & 39 deletions packages/runtime/src/useCases/common/Schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16706,9 +16706,7 @@ export const AcceptAuthorizationRequestRequest: any = {
"AcceptAuthorizationRequestRequest": {
"type": "object",
"properties": {
"authorizationRequest": {
"type": "object"
}
"authorizationRequest": {}
},
"required": [
"authorizationRequest"
Expand All @@ -16718,19 +16716,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
}
Expand Down Expand Up @@ -16763,12 +16771,12 @@ export const ResolveAuthorizationRequestRequest: any = {
"ResolveAuthorizationRequestRequest": {
"type": "object",
"properties": {
"requestUrl": {
"authorizationRequestUrl": {
"type": "string"
}
},
"required": [
"requestUrl"
"authorizationRequestUrl"
],
"additionalProperties": false
}
Expand All @@ -16794,35 +16802,6 @@ export const ResolveCredentialOfferRequest: any = {
}
}

export const FetchedCredentialOfferRequest: any = {
"$schema": "http://json-schema.org/draft-07/schema#",
"$ref": "#/definitions/FetchedCredentialOfferRequest",
"definitions": {
"FetchedCredentialOfferRequest": {
"type": "object",
"properties": {
"data": {
"type": "string"
},
"pinCode": {
"type": "string"
},
"requestedCredentials": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"data",
"requestedCredentials"
],
"additionalProperties": false
}
}
}

export const CreateSettingRequest: any = {
"$schema": "http://json-schema.org/draft-07/schema#",
"$ref": "#/definitions/CreateSettingRequest",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
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 { Inject } from "@nmshd/typescript-ioc";
import { SchemaRepository, SchemaValidator, UseCase } from "../../common";

export interface AcceptAuthorizationRequestRequest {
authorizationRequest: Record<string, any>;
authorizationRequest: any;
}

export interface AcceptAuthorizationRequestResponse {
status: number;
message: string;
}

class Validator extends SchemaValidator<AcceptAuthorizationRequestRequest> {
Expand All @@ -15,16 +18,16 @@ class Validator extends SchemaValidator<AcceptAuthorizationRequestRequest> {
}
}

export class AcceptAuthorizationRequestUseCase extends UseCase<AcceptAuthorizationRequestRequest, AcceptAuthorizationRequestDTO> {
export class AcceptAuthorizationRequestUseCase extends UseCase<AcceptAuthorizationRequestRequest, AcceptAuthorizationRequestResponse> {
public constructor(
@Inject private readonly openId4VcContoller: OpenId4VcController,
@Inject private readonly openId4VcController: OpenId4VcController,
@Inject validator: Validator
) {
super(validator);
}

protected override async executeInternal(request: AcceptAuthorizationRequestRequest): Promise<Result<AcceptAuthorizationRequestDTO>> {
const result = await this.openId4VcContoller.acceptAuthorizationRequest(request.authorizationRequest as OpenId4VpResolvedAuthorizationRequest);
protected override async executeInternal(request: AcceptAuthorizationRequestRequest): Promise<Result<AcceptAuthorizationRequestResponse>> {
const result = await this.openId4VcController.acceptAuthorizationRequest(request.authorizationRequest);
return Result.ok({ status: result.status, message: JSON.stringify(result.message) });
}
}
Original file line number Diff line number Diff line change
@@ -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<AcceptCredentialOfferRequest> {
public constructor(@Inject schemaRepository: SchemaRepository) {
super(schemaRepository.getSchema("AcceptCredentialOfferRequest"));
}
}

export class AcceptCredentialOfferUseCase extends UseCase<AcceptCredentialOfferRequest, VerifiableCredentialDTO> {
public constructor(
@Inject private readonly openId4VcController: OpenId4VcController,
@Inject validator: Validator
) {
super(validator);
}

protected override async executeInternal(request: AcceptCredentialOfferRequest): Promise<Result<VerifiableCredentialDTO>> {
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
});
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ class Validator extends SchemaValidator<GetVerifiableCredentialsRequest> {

export class GetVerifiableCredentialsUseCase extends UseCase<GetVerifiableCredentialsRequest, VerifiableCredentialDTO[]> {
public constructor(
@Inject private readonly openId4VcContoller: OpenId4VcController,
@Inject private readonly openId4VcController: OpenId4VcController,
@Inject validator: Validator
) {
super(validator);
}

protected override async executeInternal(request: GetVerifiableCredentialsRequest): Promise<Result<VerifiableCredentialDTO[]>> {
const credentials = await this.openId4VcContoller.getVerifiableCredentials(request.ids);
const credentials = await this.openId4VcController.getVerifiableCredentials(request.ids);
return Result.ok(credentials);
}
}
Loading