Skip to content

Commit

Permalink
feat: first impl of DCP credential request API (#566)
Browse files Browse the repository at this point in the history
  • Loading branch information
wolf4ood authored Feb 12, 2025
1 parent 4499bc4 commit fb6fc8e
Show file tree
Hide file tree
Showing 62 changed files with 1,857 additions and 105 deletions.
1 change: 1 addition & 0 deletions .github/workflows/verify.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ jobs:
-e "EDC_STS_ACCOUNT_API_URL=https://sts.com" \
-e "EDC_STS_ACCOUNTS_API_AUTH_HEADER_VALUE=auth-header" \
-e "EDC_ISSUER_STATUSLIST_SIGNING_KEY_ALIAS=foo-alias" \
-e "EDC_ISSUER_ID=did:web:issuer" \
issuer-service:latest
- name: 'Wait for Issuer-Service to be healthy'
Expand Down
8 changes: 3 additions & 5 deletions core/identity-hub-core/src/main/resources/dcp.v1.0.jsonld
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,9 @@
"CredentialRequestMessage": {
"@id": "dcp:CredentialRequestMessage",
"@context": {
"format": "dcp:format",
"credentialType": {
"@id": "dcp:credentialType",
"@type": "@vocab",
"@container": "@set"
"credentials": {
"@id": "dcp:credentials",
"@type": "@json"
}
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,18 @@
package org.eclipse.edc.issuerservice.issuance;

import org.eclipse.edc.issuerservice.issuance.attestation.AttestationDefinitionServiceImpl;
import org.eclipse.edc.issuerservice.issuance.attestation.AttestationPipelineImpl;
import org.eclipse.edc.issuerservice.issuance.credentialdefinition.CredentialDefinitionServiceImpl;
import org.eclipse.edc.issuerservice.issuance.rule.CredentialRuleDefinitionEvaluatorImpl;
import org.eclipse.edc.issuerservice.issuance.rule.CredentialRuleFactoryRegistryImpl;
import org.eclipse.edc.issuerservice.spi.issuance.attestation.AttestationDefinitionService;
import org.eclipse.edc.issuerservice.spi.issuance.attestation.AttestationDefinitionStore;
import org.eclipse.edc.issuerservice.spi.issuance.attestation.AttestationPipeline;
import org.eclipse.edc.issuerservice.spi.issuance.attestation.AttestationSourceFactoryRegistry;
import org.eclipse.edc.issuerservice.spi.issuance.credentialdefinition.CredentialDefinitionService;
import org.eclipse.edc.issuerservice.spi.issuance.credentialdefinition.store.CredentialDefinitionStore;
import org.eclipse.edc.issuerservice.spi.issuance.rule.CredentialRuleDefinitionEvaluator;
import org.eclipse.edc.issuerservice.spi.issuance.rule.CredentialRuleFactoryRegistry;
import org.eclipse.edc.issuerservice.spi.participant.store.ParticipantStore;
import org.eclipse.edc.runtime.metamodel.annotation.Extension;
import org.eclipse.edc.runtime.metamodel.annotation.Inject;
Expand All @@ -36,11 +43,14 @@ public class IssuanceServicesExtension implements ServiceExtension {
private TransactionContext transactionContext;
@Inject
private CredentialDefinitionStore store;

@Inject
private AttestationDefinitionStore attestationDefinitionStore;
@Inject
private ParticipantStore participantStore;

private AttestationPipelineImpl attestationPipeline;

private CredentialRuleFactoryRegistry ruleFactoryRegistry;

@Provider
public CredentialDefinitionService createParticipantService() {
Expand All @@ -51,4 +61,35 @@ public CredentialDefinitionService createParticipantService() {
public AttestationDefinitionService createAttestationService() {
return new AttestationDefinitionServiceImpl(transactionContext, attestationDefinitionStore, participantStore);
}

@Provider
public AttestationPipeline createAttestationPipeline() {
return createAttestationPipelineImpl();
}

@Provider
public AttestationSourceFactoryRegistry createAttestationSourceFactoryRegistry() {
return createAttestationPipelineImpl();
}

@Provider
public CredentialRuleDefinitionEvaluator credentialRuleDefinitionEvaluator() {
return new CredentialRuleDefinitionEvaluatorImpl(credentialRuleFactoryRegistry());
}

@Provider
public CredentialRuleFactoryRegistry credentialRuleFactoryRegistry() {

if (ruleFactoryRegistry == null) {
ruleFactoryRegistry = new CredentialRuleFactoryRegistryImpl();
}
return ruleFactoryRegistry;
}

private AttestationPipelineImpl createAttestationPipelineImpl() {
if (attestationPipeline == null) {
attestationPipeline = new AttestationPipelineImpl(attestationDefinitionStore);
}
return attestationPipeline;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*
*/

package org.eclipse.edc.identityhub.issuance.credentials.attestation;
package org.eclipse.edc.issuerservice.issuance.attestation;

import org.eclipse.edc.issuerservice.spi.issuance.attestation.AttestationContext;
import org.eclipse.edc.issuerservice.spi.issuance.attestation.AttestationDefinitionStore;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2025 Cofinity-X
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* Cofinity-X - initial API and implementation
*
*/

package org.eclipse.edc.issuerservice.issuance.rule;

import org.eclipse.edc.issuerservice.spi.issuance.IssuanceContext;
import org.eclipse.edc.issuerservice.spi.issuance.model.CredentialRuleDefinition;
import org.eclipse.edc.issuerservice.spi.issuance.rule.CredentialRuleDefinitionEvaluator;
import org.eclipse.edc.issuerservice.spi.issuance.rule.CredentialRuleFactoryRegistry;
import org.eclipse.edc.spi.result.Result;

import java.util.Collection;

public class CredentialRuleDefinitionEvaluatorImpl implements CredentialRuleDefinitionEvaluator {

private final CredentialRuleFactoryRegistry credentialRuleFactoryRegistry;

public CredentialRuleDefinitionEvaluatorImpl(CredentialRuleFactoryRegistry credentialRuleFactoryRegistry) {
this.credentialRuleFactoryRegistry = credentialRuleFactoryRegistry;
}

@Override
public Result<Void> evaluate(Collection<CredentialRuleDefinition> definitions, IssuanceContext context) {
for (var definition : definitions) {
var factory = credentialRuleFactoryRegistry.resolveFactory(definition.type());
var rule = factory.createRule(definition);
var result = rule.evaluate(context);
if (result.failed()) {
return result;
}
}
return Result.success();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*
*/

package org.eclipse.edc.identityhub.issuance.credentials.rule;
package org.eclipse.edc.issuerservice.issuance.rule;

import org.eclipse.edc.issuerservice.spi.issuance.rule.CredentialRuleFactory;
import org.eclipse.edc.issuerservice.spi.issuance.rule.CredentialRuleFactoryRegistry;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*
*/

package org.eclipse.edc.identityhub.issuance.credentials.attestation;
package org.eclipse.edc.issuerservice.issuance.attestation;

import org.eclipse.edc.issuerservice.spi.issuance.attestation.AttestationContext;
import org.eclipse.edc.issuerservice.spi.issuance.attestation.AttestationDefinitionStore;
Expand All @@ -26,7 +26,6 @@
import java.util.Map;
import java.util.Set;

import static java.util.Collections.emptyMap;
import static java.util.Map.entry;
import static org.assertj.core.api.Assertions.assertThat;
import static org.eclipse.edc.junit.assertions.AbstractResultAssert.assertThat;
Expand All @@ -46,6 +45,8 @@ void evaluate_whenSingle_success() {
var attestationDefinition = new AttestationDefinition("a123", "testType", Map.of());

var store = mock(AttestationDefinitionStore.class);
var attestationContext = mock(AttestationContext.class);

when(store.resolveDefinition(eq("a123"))).thenReturn(attestationDefinition);

var pipeline = new AttestationPipelineImpl(store);
Expand All @@ -58,7 +59,7 @@ void evaluate_whenSingle_success() {

pipeline.registerFactory("testType", sourceFactory);

var results = pipeline.evaluate(Set.of("a123"), new DefaultAttestationContext("123", emptyMap()));
var results = pipeline.evaluate(Set.of("a123"), attestationContext);
assertThat(results).isSucceeded();
assertThat(results.getContent()).contains(entry("test", "value"));

Expand All @@ -75,6 +76,7 @@ void evaluate_whenMultipleInvalid_shouldFailOnFirst() {
var attestationDefinition2 = new AttestationDefinition("a456", "testType1", Map.of());

var store = mock(AttestationDefinitionStore.class);
var attestationContext = mock(AttestationContext.class);
when(store.resolveDefinition(eq("a123"))).thenReturn(attestationDefinition1);
when(store.resolveDefinition(eq("a456"))).thenReturn(attestationDefinition2);

Expand All @@ -88,7 +90,7 @@ void evaluate_whenMultipleInvalid_shouldFailOnFirst() {

pipeline.registerFactory("testType1", sourceFactory);

var results = pipeline.evaluate(new LinkedHashSet<>(List.of("a123", "a456")), new DefaultAttestationContext("123", emptyMap()));
var results = pipeline.evaluate(new LinkedHashSet<>(List.of("a123", "a456")), attestationContext);
assertThat(results).isFailed();

verify(store).resolveDefinition("a123");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*
*/

package org.eclipse.edc.identityhub.issuance.credentials.rule;
package org.eclipse.edc.issuerservice.issuance.rule;

import org.eclipse.edc.issuerservice.spi.issuance.rule.CredentialRuleFactory;
import org.junit.jupiter.api.Test;
Expand Down
4 changes: 4 additions & 0 deletions dist/bom/issuerservice-base-bom/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,12 @@ dependencies {
runtimeOnly(project(":core:issuerservice:issuerservice-issuance"))
runtimeOnly(project(":extensions:did:local-did-publisher"))
// API modules
runtimeOnly(project(":extensions:protocols:dcp:dcp-issuer:dcp-issuer-core"))
runtimeOnly(project(":extensions:protocols:dcp:dcp-issuer:dcp-issuer-api"))

runtimeOnly(project(":extensions:issuance:issuerservice-issuance-attestations"))
runtimeOnly(project(":extensions:issuance:issuerservice-issuance-rules"))

runtimeOnly(project(":extensions:sts:sts-account-provisioner"))
runtimeOnly(libs.edc.identity.did.core)
runtimeOnly(libs.edc.core.token)
Expand Down
1 change: 1 addition & 0 deletions e2e-tests/admin-api-tests/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ dependencies {
testImplementation(libs.jakarta.rsApi)
testImplementation(libs.edc.sts.spi)
testImplementation(testFixtures(project(":e2e-tests:fixtures")))
testImplementation(testFixtures(project(":spi:verifiable-credential-spi")))

}

Expand Down
Loading

0 comments on commit fb6fc8e

Please sign in to comment.