Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add Credential Request endpoints (IdentityApi) #590

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
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.eclipse.edc.identityhub.spi.keypair.store.KeyPairResourceStore;
import org.eclipse.edc.identityhub.spi.participantcontext.store.ParticipantContextStore;
import org.eclipse.edc.identityhub.spi.transformation.ScopeToCriterionTransformer;
import org.eclipse.edc.identityhub.spi.verifiablecredentials.CredentialRequestService;
import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore;
import org.eclipse.edc.jwt.signer.spi.JwsSignerProvider;
import org.eclipse.edc.jwt.validation.jti.JtiValidationStore;
Expand All @@ -39,6 +40,7 @@
import org.eclipse.edc.runtime.metamodel.annotation.Provider;
import org.eclipse.edc.runtime.metamodel.annotation.Setting;
import org.eclipse.edc.security.token.jwt.DefaultJwsSignerProvider;
import org.eclipse.edc.spi.result.ServiceResult;
import org.eclipse.edc.spi.system.ServiceExtension;
import org.eclipse.edc.spi.system.ServiceExtensionContext;
import org.eclipse.edc.spi.types.TypeManager;
Expand Down Expand Up @@ -124,6 +126,11 @@
return revocationService;
}

@Provider(isDefault = true)
public CredentialRequestService createDefaultCredentialRequestService(ServiceExtensionContext context) {

Check notice

Code scanning / CodeQL

Useless parameter Note

The parameter 'context' is never used.
return (issuerDid, requestId, typesAndFormats) -> ServiceResult.success("this is a dummy implementation that will be replaced soon!");
}

@Provider(isDefault = true)
public SignatureSuiteRegistry createSignatureSuiteRegistry() {
return new InMemorySignatureSuiteRegistry();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

package org.eclipse.edc.issuerservice.defaults.store;

import org.eclipse.edc.issuerservice.spi.issuance.model.IssuerCredentialIssuanceProcess;
import org.eclipse.edc.issuerservice.spi.issuance.model.IssuanceProcess;
import org.eclipse.edc.issuerservice.spi.issuance.process.store.IssuanceProcessStore;
import org.eclipse.edc.spi.query.CriterionOperatorRegistry;
import org.eclipse.edc.spi.query.QuerySpec;
Expand All @@ -24,18 +24,18 @@
import java.util.UUID;
import java.util.stream.Stream;

public class InMemoryIssuanceProcessStore extends InMemoryStatefulEntityStore<IssuerCredentialIssuanceProcess> implements IssuanceProcessStore {
public class InMemoryIssuanceProcessStore extends InMemoryStatefulEntityStore<IssuanceProcess> implements IssuanceProcessStore {

public InMemoryIssuanceProcessStore(Clock clock, CriterionOperatorRegistry criterionOperatorRegistry) {
this(UUID.randomUUID().toString(), clock, criterionOperatorRegistry);
}

public InMemoryIssuanceProcessStore(String leaserId, Clock clock, CriterionOperatorRegistry criterionOperatorRegistry) {
super(IssuerCredentialIssuanceProcess.class, leaserId, clock, criterionOperatorRegistry);
super(IssuanceProcess.class, leaserId, clock, criterionOperatorRegistry);
}

@Override
public Stream<IssuerCredentialIssuanceProcess> query(QuerySpec querySpec) {
public Stream<IssuanceProcess> query(QuerySpec querySpec) {
return super.findAll(querySpec);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@
package org.eclipse.edc.issuerservice.defaults.store;

import org.eclipse.edc.issuerservice.spi.issuance.process.store.IssuanceProcessStore;
import org.eclipse.edc.issuerservice.spi.issuance.process.store.IssuerCredentialIssuanceProcessStoreTestBase;
import org.eclipse.edc.issuerservice.spi.issuance.process.store.IssuanceProcessStoreTestBase;
import org.eclipse.edc.query.CriterionOperatorRegistryImpl;

import java.time.Duration;

public class InMemoryIssuerCredentialIssuanceProcessStoreTest extends IssuerCredentialIssuanceProcessStoreTestBase {
public class InMemoryIssuanceProcessStoreTest extends IssuanceProcessStoreTestBase {

private final InMemoryIssuanceProcessStore store = new InMemoryIssuanceProcessStore(IssuerCredentialIssuanceProcessStoreTestBase.RUNTIME_ID, clock, CriterionOperatorRegistryImpl.ofDefaults());
private final InMemoryIssuanceProcessStore store = new InMemoryIssuanceProcessStore(IssuanceProcessStoreTestBase.RUNTIME_ID, clock, CriterionOperatorRegistryImpl.ofDefaults());

@Override
protected IssuanceProcessStore getStore() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@

package org.eclipse.edc.issuerservice.issuance;

import org.eclipse.edc.issuerservice.issuance.process.IssuerCredentialIssuanceProcessManagerImpl;
import org.eclipse.edc.issuerservice.issuance.process.IssuerCredentialIssuanceProcessServiceImpl;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuerCredentialIssuanceProcessManager;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuerCredentialIssuanceProcessService;
import org.eclipse.edc.issuerservice.issuance.process.IssuanceProcessManagerImpl;
import org.eclipse.edc.issuerservice.issuance.process.IssuanceProcessServiceImpl;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuanceProcessManager;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuanceProcessService;
import org.eclipse.edc.issuerservice.spi.issuance.process.retry.IssuanceProcessRetryStrategy;
import org.eclipse.edc.issuerservice.spi.issuance.process.store.IssuanceProcessStore;
import org.eclipse.edc.runtime.metamodel.annotation.Extension;
Expand Down Expand Up @@ -61,7 +61,7 @@ public class IssuanceCoreExtension implements ServiceExtension {
@Setting(description = "The base delay for the issuance retry mechanism in millisecond", key = "edc.issuer.issuance.send.retry.base-delay.ms", defaultValue = DEFAULT_SEND_RETRY_BASE_DELAY + "")
private long sendRetryBaseDelay;

private IssuerCredentialIssuanceProcessManager issuerCredentialIssuanceProcessManager;
private IssuanceProcessManager issuanceProcessManager;

@Inject
private IssuanceProcessStore issuanceProcessStore;
Expand All @@ -85,11 +85,11 @@ public class IssuanceCoreExtension implements ServiceExtension {
private TransactionContext transactionContext;

@Provider
public IssuerCredentialIssuanceProcessManager createIssuanceProcessManager() {
public IssuanceProcessManager createIssuanceProcessManager() {

if (issuerCredentialIssuanceProcessManager == null) {
if (issuanceProcessManager == null) {
var waitStrategy = retryStrategy != null ? retryStrategy : new ExponentialWaitStrategy(stateMachineIterationWaitMillis);
issuerCredentialIssuanceProcessManager = IssuerCredentialIssuanceProcessManagerImpl.Builder.newInstance()
issuanceProcessManager = IssuanceProcessManagerImpl.Builder.newInstance()
.store(issuanceProcessStore)
.monitor(monitor)
.batchSize(stateMachineBatchSize)
Expand All @@ -100,23 +100,23 @@ public IssuerCredentialIssuanceProcessManager createIssuanceProcessManager() {
.entityRetryProcessConfiguration(getEntityRetryProcessConfiguration())
.build();
}
return issuerCredentialIssuanceProcessManager;
return issuanceProcessManager;
}

@Provider
public IssuerCredentialIssuanceProcessService createIssuanceProcessService() {
return new IssuerCredentialIssuanceProcessServiceImpl(transactionContext, issuanceProcessStore);
public IssuanceProcessService createIssuanceProcessService() {
return new IssuanceProcessServiceImpl(transactionContext, issuanceProcessStore);
}

@Override
public void start() {
issuerCredentialIssuanceProcessManager.start();
issuanceProcessManager.start();
}

@Override
public void shutdown() {
if (issuerCredentialIssuanceProcessManager != null) {
issuerCredentialIssuanceProcessManager.stop();
if (issuanceProcessManager != null) {
issuanceProcessManager.stop();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@

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

import org.eclipse.edc.issuerservice.spi.issuance.model.IssuerCredentialIssuanceProcess;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuerCredentialIssuanceProcessManager;
import org.eclipse.edc.issuerservice.spi.issuance.model.IssuanceProcess;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuanceProcessManager;
import org.eclipse.edc.issuerservice.spi.issuance.process.store.IssuanceProcessStore;
import org.eclipse.edc.statemachine.AbstractStateEntityManager;
import org.eclipse.edc.statemachine.StateMachineManager;

public class IssuerCredentialIssuanceProcessManagerImpl extends AbstractStateEntityManager<IssuerCredentialIssuanceProcess, IssuanceProcessStore> implements IssuerCredentialIssuanceProcessManager {
public class IssuanceProcessManagerImpl extends AbstractStateEntityManager<IssuanceProcess, IssuanceProcessStore> implements IssuanceProcessManager {


private IssuerCredentialIssuanceProcessManagerImpl() {
private IssuanceProcessManagerImpl() {
}

@Override
Expand All @@ -32,10 +32,10 @@ protected StateMachineManager.Builder configureStateMachineManager(StateMachineM
}

public static class Builder
extends AbstractStateEntityManager.Builder<IssuerCredentialIssuanceProcess, IssuanceProcessStore, IssuerCredentialIssuanceProcessManagerImpl, Builder> {
extends AbstractStateEntityManager.Builder<IssuanceProcess, IssuanceProcessStore, IssuanceProcessManagerImpl, Builder> {

private Builder() {
super(new IssuerCredentialIssuanceProcessManagerImpl());
super(new IssuanceProcessManagerImpl());
}

public static Builder newInstance() {
Expand All @@ -48,7 +48,7 @@ public Builder self() {
}

@Override
public IssuerCredentialIssuanceProcessManagerImpl build() {
public IssuanceProcessManagerImpl build() {
super.build();
return manager;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,36 @@

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

import org.eclipse.edc.issuerservice.spi.issuance.model.IssuerCredentialIssuanceProcess;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuerCredentialIssuanceProcessService;
import org.eclipse.edc.issuerservice.spi.issuance.model.IssuanceProcess;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuanceProcessService;
import org.eclipse.edc.issuerservice.spi.issuance.process.store.IssuanceProcessStore;
import org.eclipse.edc.spi.query.QuerySpec;
import org.eclipse.edc.spi.result.ServiceResult;
import org.eclipse.edc.transaction.spi.TransactionContext;

import java.util.List;

public class IssuerCredentialIssuanceProcessServiceImpl implements IssuerCredentialIssuanceProcessService {
public class IssuanceProcessServiceImpl implements IssuanceProcessService {

private final TransactionContext transactionContext;
private final IssuanceProcessStore issuanceProcessStore;

public IssuerCredentialIssuanceProcessServiceImpl(TransactionContext transactionContext, IssuanceProcessStore issuanceProcessStore) {
public IssuanceProcessServiceImpl(TransactionContext transactionContext, IssuanceProcessStore issuanceProcessStore) {
this.transactionContext = transactionContext;
this.issuanceProcessStore = issuanceProcessStore;
}

@Override
public IssuerCredentialIssuanceProcess findById(String id) {
public IssuanceProcess findById(String id) {
return transactionContext.execute(() -> issuanceProcessStore.findById(id));
}

@Override
public ServiceResult<List<IssuerCredentialIssuanceProcess>> search(QuerySpec query) {
public ServiceResult<List<IssuanceProcess>> search(QuerySpec query) {
return ServiceResult.success(queryIssuanceProcesses(query));
}

private List<IssuerCredentialIssuanceProcess> queryIssuanceProcesses(QuerySpec query) {
private List<IssuanceProcess> queryIssuanceProcesses(QuerySpec query) {
return transactionContext.execute(() -> {
try (var stream = issuanceProcessStore.query(query)) {
return stream.toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

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

import org.eclipse.edc.issuerservice.spi.issuance.IssuerCredentialIssuanceContext;
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;
Expand All @@ -31,7 +31,7 @@ public CredentialRuleDefinitionEvaluatorImpl(CredentialRuleFactoryRegistry crede
}

@Override
public Result<Void> evaluate(Collection<CredentialRuleDefinition> definitions, IssuerCredentialIssuanceContext context) {
public Result<Void> evaluate(Collection<CredentialRuleDefinition> definitions, IssuanceContext context) {
for (var definition : definitions) {
var factory = credentialRuleFactoryRegistry.resolveFactory(definition.type());
var rule = factory.createRule(definition);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@


import org.eclipse.edc.boot.system.injection.ObjectFactory;
import org.eclipse.edc.issuerservice.issuance.process.IssuerCredentialIssuanceProcessManagerImpl;
import org.eclipse.edc.issuerservice.issuance.process.IssuerCredentialIssuanceProcessServiceImpl;
import org.eclipse.edc.issuerservice.issuance.process.IssuanceProcessManagerImpl;
import org.eclipse.edc.issuerservice.issuance.process.IssuanceProcessServiceImpl;
import org.eclipse.edc.junit.extensions.DependencyInjectionExtension;
import org.eclipse.edc.spi.system.ServiceExtensionContext;
import org.junit.jupiter.api.Test;
Expand All @@ -32,8 +32,8 @@ public class IssuanceCoreExtensionTest {
@Test
void verifyProviders(ServiceExtensionContext context, ObjectFactory factory) {
var extension = factory.constructInstance(IssuanceCoreExtension.class);
assertThat(extension.createIssuanceProcessManager()).isInstanceOf(IssuerCredentialIssuanceProcessManagerImpl.class);
assertThat(extension.createIssuanceProcessService()).isInstanceOf(IssuerCredentialIssuanceProcessServiceImpl.class);
assertThat(extension.createIssuanceProcessManager()).isInstanceOf(IssuanceProcessManagerImpl.class);
assertThat(extension.createIssuanceProcessService()).isInstanceOf(IssuanceProcessServiceImpl.class);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@

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

import org.eclipse.edc.issuerservice.spi.issuance.model.IssuerCredentialIssuanceProcess;
import org.eclipse.edc.issuerservice.spi.issuance.model.IssuerCredentialIssuanceProcessStates;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuerCredentialIssuanceProcessService;
import org.eclipse.edc.issuerservice.spi.issuance.model.IssuanceProcess;
import org.eclipse.edc.issuerservice.spi.issuance.model.IssuanceProcessStates;
import org.eclipse.edc.issuerservice.spi.issuance.process.IssuanceProcessService;
import org.eclipse.edc.issuerservice.spi.issuance.process.store.IssuanceProcessStore;
import org.eclipse.edc.spi.query.QuerySpec;
import org.eclipse.edc.transaction.spi.NoopTransactionContext;
Expand All @@ -34,11 +34,11 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class IssuerCredentialIssuerCredentialIssuanceProcessServiceImplTest {
public class IssuanceProcessServiceImplTest {

private final TransactionContext transactionContext = spy(new NoopTransactionContext());
private final IssuanceProcessStore store = mock();
private final IssuerCredentialIssuanceProcessService service = new IssuerCredentialIssuanceProcessServiceImpl(transactionContext, store);
private final IssuanceProcessService service = new IssuanceProcessServiceImpl(transactionContext, store);

@Test
void findById_whenFound() {
Expand All @@ -65,15 +65,15 @@ void search() {

var result = service.search(query);

assertThat(result).isSucceeded().asInstanceOf(list(IssuerCredentialIssuanceProcess.class)).containsExactly(process);
assertThat(result).isSucceeded().asInstanceOf(list(IssuanceProcess.class)).containsExactly(process);
verify(transactionContext).execute(any(TransactionContext.ResultTransactionBlock.class));
}

private IssuerCredentialIssuanceProcess createIssuanceProcess() {
private IssuanceProcess createIssuanceProcess() {

return IssuerCredentialIssuanceProcess.Builder.newInstance()
return IssuanceProcess.Builder.newInstance()
.id("id")
.state(IssuerCredentialIssuanceProcessStates.APPROVED.code())
.state(IssuanceProcessStates.APPROVED.code())
.participantId("participantId")
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
"version": "1.0.0-alpha",
"urlPath": "/v1alpha",
"lastUpdated": "2025-02-06T12:00:00Z",
"lastUpdated": "2025-02-13T12:00:00Z",
"maturity": null
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.eclipse.edc.identityhub.api.verifiablecredentials.v1.unstable.transformer.VerifiableCredentialManifestToVerifiableCredentialResourceTransformer;
import org.eclipse.edc.identityhub.spi.authorization.AuthorizationService;
import org.eclipse.edc.identityhub.spi.participantcontext.model.ParticipantResource;
import org.eclipse.edc.identityhub.spi.verifiablecredentials.CredentialRequestService;
import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource;
import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore;
import org.eclipse.edc.identityhub.spi.webcontext.IdentityHubApiContext;
Expand Down Expand Up @@ -47,6 +48,8 @@ public class VerifiableCredentialApiExtension implements ServiceExtension {
private CredentialStore credentialStore;
@Inject
private AuthorizationService authorizationService;
@Inject
private CredentialRequestService credentialRequestService;

@Override
public String name() {
Expand All @@ -58,7 +61,7 @@ public void initialize(ServiceExtensionContext context) {
authorizationService.addLookupFunction(VerifiableCredentialResource.class, this::queryById);
var registry = typeTransformerRegistry.forContext("identity-api");
registry.register(new VerifiableCredentialManifestToVerifiableCredentialResourceTransformer());
var controller = new VerifiableCredentialsApiController(credentialStore, authorizationService, new VerifiableCredentialManifestValidator(), registry);
var controller = new VerifiableCredentialsApiController(credentialStore, authorizationService, new VerifiableCredentialManifestValidator(), registry, credentialRequestService);
var getAllController = new GetAllCredentialsApiController(credentialStore);
webService.registerResource(IdentityHubApiContext.IDENTITY, controller);
webService.registerResource(IdentityHubApiContext.IDENTITY, getAllController);
Expand Down
Loading