From b7cb3fd636121bb130fc9f39ea4642393d3c1ec8 Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger Date: Thu, 6 Feb 2025 14:51:30 +0100 Subject: [PATCH 1/8] add basic api test --- .../build.gradle.kts | 2 + .../StatusListServiceExtension.java | 6 +- .../issuerservice-base-bom/build.gradle.kts | 1 + ...> IssuerAttestationAdminApiExtension.java} | 4 +- ...rg.eclipse.edc.spi.system.ServiceExtension | 2 +- .../api/issuer-admin-api/build.gradle.kts | 3 +- .../credentials-api/build.gradle.kts | 1 + .../IssuerCredentialsAdminApiExtension.java | 5 +- .../unstable/IssuerCredentialsAdminApi.java | 19 ++- .../IssuerCredentialsAdminApiController.java | 51 ++++--- .../model/VerifiableCredentialResponse.java | 3 +- ...suerCredentialsAdminApiControllerTest.java | 127 ++++++++++++++++++ .../IssuerAdminApiConfigurationExtension.java | 2 +- .../spi/webcontext/IdentityHubApiContext.java | 2 +- 14 files changed, 185 insertions(+), 43 deletions(-) rename extensions/api/issuer-admin-api/attestation-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/{IssuerCredentialsAdminApiExtension.java => IssuerAttestationAdminApiExtension.java} (93%) create mode 100644 extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java diff --git a/core/issuerservice/issuerservice-credential-revocation/build.gradle.kts b/core/issuerservice/issuerservice-credential-revocation/build.gradle.kts index 3a1e6c9f0..7cd99d642 100644 --- a/core/issuerservice/issuerservice-credential-revocation/build.gradle.kts +++ b/core/issuerservice/issuerservice-credential-revocation/build.gradle.kts @@ -5,8 +5,10 @@ plugins { dependencies { api(project(":spi:verifiable-credential-spi")) api(project(":spi:issuerservice:credential-revocation-spi")) + implementation(libs.edc.lib.token) implementation(libs.nimbus.jwt) + implementation(libs.edc.spi.transaction) implementation(libs.edc.lib.store) testImplementation(project(":core:identity-hub-core")) diff --git a/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java b/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java index f14114660..d65fdd078 100644 --- a/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java +++ b/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java @@ -18,6 +18,7 @@ import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfoFactoryRegistry; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; import org.eclipse.edc.issuerservice.statuslist.bitstring.BitstringStatusListFactory; +import org.eclipse.edc.jwt.signer.spi.JwsSignerProvider; import org.eclipse.edc.runtime.metamodel.annotation.Extension; import org.eclipse.edc.runtime.metamodel.annotation.Inject; import org.eclipse.edc.runtime.metamodel.annotation.Provider; @@ -25,7 +26,7 @@ import org.eclipse.edc.spi.system.ServiceExtension; import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.edc.spi.types.TypeManager; -import org.eclipse.edc.token.spi.TokenGenerationService; +import org.eclipse.edc.token.JwtGenerationService; import org.eclipse.edc.transaction.spi.TransactionContext; import static org.eclipse.edc.issuerservice.statuslist.StatusListServiceExtension.NAME; @@ -44,7 +45,7 @@ public class StatusListServiceExtension implements ServiceExtension { @Inject private TypeManager typeManager; @Inject - private TokenGenerationService tokenGenerationService; + private JwsSignerProvider jwsSignerProvider; private StatusListInfoFactoryRegistry factory; @Provider @@ -54,6 +55,7 @@ public StatusListService getStatusListService(ServiceExtensionContext context) { // Bitstring StatusList is provided by default. others can be added via extensions fact.register("BitStringStatusListEntry", new BitstringStatusListFactory(store, typeManager.getMapper())); + var tokenGenerationService = new JwtGenerationService(jwsSignerProvider); return new StatusListServiceImpl(store, transactionContext, typeManager.getMapper(JSON_LD), context.getMonitor(), tokenGenerationService, () -> privateKeyAlias, fact); } diff --git a/dist/bom/issuerservice-base-bom/build.gradle.kts b/dist/bom/issuerservice-base-bom/build.gradle.kts index 0f72fe55a..b9ac4de48 100644 --- a/dist/bom/issuerservice-base-bom/build.gradle.kts +++ b/dist/bom/issuerservice-base-bom/build.gradle.kts @@ -24,6 +24,7 @@ dependencies { runtimeOnly(project(":core:identity-hub-keypairs")) runtimeOnly(project(":core:issuerservice:issuerservice-core")) runtimeOnly(project(":core:issuerservice:issuerservice-participants")) + runtimeOnly(project(":core:issuerservice:issuerservice-credential-revocation")) runtimeOnly(project(":extensions:did:local-did-publisher")) // API modules runtimeOnly(project(":extensions:protocols:dcp:dcp-issuer:dcp-issuer-api")) diff --git a/extensions/api/issuer-admin-api/attestation-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java b/extensions/api/issuer-admin-api/attestation-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerAttestationAdminApiExtension.java similarity index 93% rename from extensions/api/issuer-admin-api/attestation-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java rename to extensions/api/issuer-admin-api/attestation-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerAttestationAdminApiExtension.java index baae56b96..de45a534b 100644 --- a/extensions/api/issuer-admin-api/attestation-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java +++ b/extensions/api/issuer-admin-api/attestation-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerAttestationAdminApiExtension.java @@ -22,10 +22,10 @@ import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.edc.web.spi.WebService; -import static org.eclipse.edc.issuerservice.api.admin.credentials.IssuerCredentialsAdminApiExtension.NAME; +import static org.eclipse.edc.issuerservice.api.admin.credentials.IssuerAttestationAdminApiExtension.NAME; @Extension(value = NAME) -public class IssuerCredentialsAdminApiExtension implements ServiceExtension { +public class IssuerAttestationAdminApiExtension implements ServiceExtension { public static final String NAME = "Issuer Service Credentials Admin API Extension"; @Inject diff --git a/extensions/api/issuer-admin-api/attestation-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/extensions/api/issuer-admin-api/attestation-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension index 77f87a854..c7df791eb 100644 --- a/extensions/api/issuer-admin-api/attestation-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ b/extensions/api/issuer-admin-api/attestation-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -12,4 +12,4 @@ # # -org.eclipse.edc.issuerservice.api.admin.credentials.IssuerCredentialsAdminApiExtension \ No newline at end of file +org.eclipse.edc.issuerservice.api.admin.credentials.IssuerAttestationAdminApiExtension \ No newline at end of file diff --git a/extensions/api/issuer-admin-api/build.gradle.kts b/extensions/api/issuer-admin-api/build.gradle.kts index 3193efef1..b94b73d4d 100644 --- a/extensions/api/issuer-admin-api/build.gradle.kts +++ b/extensions/api/issuer-admin-api/build.gradle.kts @@ -14,11 +14,10 @@ plugins { `java-library` - `maven-publish` } dependencies { - api(project(":extensions:api:issuer-admin-api:attestation-api")) api(project(":extensions:api:issuer-admin-api:credentials-api")) + api(project(":extensions:api:issuer-admin-api:attestation-api")) api(project(":extensions:api:issuer-admin-api:participant-api")) } diff --git a/extensions/api/issuer-admin-api/credentials-api/build.gradle.kts b/extensions/api/issuer-admin-api/credentials-api/build.gradle.kts index aa268fc9d..25465afb6 100644 --- a/extensions/api/issuer-admin-api/credentials-api/build.gradle.kts +++ b/extensions/api/issuer-admin-api/credentials-api/build.gradle.kts @@ -20,6 +20,7 @@ plugins { dependencies { api(libs.edc.spi.core) + api(project(":spi:issuerservice:credential-revocation-spi")) implementation(project(":extensions:api:issuer-admin-api:issuer-admin-api-configuration")) implementation(libs.edc.spi.validator) implementation(libs.edc.spi.web) diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java index 1f7db6ad0..562bfa566 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java @@ -16,6 +16,7 @@ import org.eclipse.edc.identityhub.spi.webcontext.IdentityHubApiContext; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.IssuerCredentialsAdminApiController; +import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; import org.eclipse.edc.runtime.metamodel.annotation.Extension; import org.eclipse.edc.runtime.metamodel.annotation.Inject; import org.eclipse.edc.spi.system.ServiceExtension; @@ -30,6 +31,8 @@ public class IssuerCredentialsAdminApiExtension implements ServiceExtension { public static final String NAME = "Issuer Service Credentials Admin API Extension"; @Inject private WebService webService; + @Inject + private StatusListService statusListService; @Override public String name() { @@ -38,7 +41,7 @@ public String name() { @Override public void initialize(ServiceExtensionContext context) { - var controller = new IssuerCredentialsAdminApiController(); + var controller = new IssuerCredentialsAdminApiController(statusListService); webService.registerResource(IdentityHubApiContext.ISSUERADMIN, controller); } } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApi.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApi.java index 1fa3d1b9b..9dded1549 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApi.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApi.java @@ -31,6 +31,8 @@ import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.web.spi.ApiErrorDetail; +import java.util.Collection; + @OpenAPIDefinition(info = @Info(description = "This API is used to manipulate VerifiableCredentials for participants in an Issuer Service", title = "Issuer Service Credentials Admin API", version = "1")) @Tag(name = "Issuer Service Credentials Admin API") public interface IssuerCredentialsAdminApi { @@ -40,7 +42,8 @@ public interface IssuerCredentialsAdminApi { operationId = "getCredentials", parameters = {@Parameter(name = "participantId", description = "ID of the participant whos credentials should be returned", required = true, in = ParameterIn.PATH)}, responses = { - @ApiResponse(responseCode = "200", description = "A list of verifiable credential metadata. Note that these are not actual VerifiableCredentials."), + @ApiResponse(responseCode = "200", description = "A list of verifiable credential metadata. Note that these are not actual VerifiableCredentials.", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = VerifiableCredentialResponse.class)), mediaType = "application/json")), @ApiResponse(responseCode = "400", description = "Request body was malformed, or the request could not be processed", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")), @ApiResponse(responseCode = "401", description = "The request could not be completed, because either the authentication was missing or was not valid.", @@ -49,7 +52,7 @@ public interface IssuerCredentialsAdminApi { content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")) } ) - VerifiableCredentialResponse getAllCredentials(String participantId); + Collection getAllCredentials(String participantId); @Operation(description = "Query credentials, possibly across multiple participants.", operationId = "queryCredentials", @@ -69,7 +72,6 @@ public interface IssuerCredentialsAdminApi { @Operation(description = "Revokes a credential with the given ID for the given participant. Revoked credentials will be added to the Revocation List", operationId = "revokeCredential", parameters = { - @Parameter(name = "participantId", description = "ID of the participant whos credential should be revoked", required = true, in = ParameterIn.PATH), @Parameter(name = "credentialId", description = "ID of the credential to revoke", required = true, in = ParameterIn.PATH) }, responses = { @@ -82,13 +84,12 @@ public interface IssuerCredentialsAdminApi { content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")) } ) - Response revokeCredential(String participantId, String credentialId); + Response revokeCredential(String credentialId); @Operation(description = "Suspends a credential with the given ID for the given participant. Suspended credentials will be added to the Revocation List. Suspension is reversible.", operationId = "suspendCredential", parameters = { - @Parameter(name = "participantId", description = "ID of the participant whos credential should be suspended", required = true, in = ParameterIn.PATH), @Parameter(name = "credentialId", description = "ID of the credential to revoke", required = true, in = ParameterIn.PATH) }, responses = { @@ -101,12 +102,11 @@ public interface IssuerCredentialsAdminApi { content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")) } ) - Response suspendCredential(String participantId, String credentialId); + Response suspendCredential(String credentialId); @Operation(description = "Resumes a credential with the given ID for the given participant. Resumed credentials will be removed from the Revocation List.", operationId = "resumeCredential", parameters = { - @Parameter(name = "participantId", description = "ID of the participant whos credential should be resumed", required = true, in = ParameterIn.PATH), @Parameter(name = "credentialId", description = "ID of the credential to resume", required = true, in = ParameterIn.PATH) }, responses = { @@ -119,12 +119,11 @@ public interface IssuerCredentialsAdminApi { content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")) } ) - Response resumeCredential(String participantId, String credentialId); + Response resumeCredential(String credentialId); @Operation(description = "Checks the revocation status of a credential with the given ID for the given participant.", operationId = "checkCredentialStatus", parameters = { - @Parameter(name = "participantId", description = "ID of the participant whos credential should be checked", required = true, in = ParameterIn.PATH), @Parameter(name = "credentialId", description = "ID of the credential to check", required = true, in = ParameterIn.PATH) }, responses = { @@ -137,5 +136,5 @@ public interface IssuerCredentialsAdminApi { content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")) } ) - CredentialStatusResponse checkRevocationStatus(String participantId, String credentialId); + CredentialStatusResponse checkRevocationStatus(String credentialId); } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java index 539e8dda0..a8d7da42e 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java @@ -21,64 +21,71 @@ import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.Response; -import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialFormat; import org.eclipse.edc.iam.verifiablecredentials.spi.model.VerifiableCredential; import org.eclipse.edc.identityhub.api.Versions; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.CredentialStatusResponse; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialResponse; +import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; import org.eclipse.edc.spi.query.QuerySpec; +import java.util.Collection; +import java.util.List; + import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; +import static org.eclipse.edc.web.spi.exception.ServiceResultHandler.exceptionMapper; @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) -@Path(Versions.UNSTABLE) +@Path(Versions.UNSTABLE + "/credentials") public class IssuerCredentialsAdminApiController implements IssuerCredentialsAdminApi { + private final StatusListService statuslistService; + public IssuerCredentialsAdminApiController(StatusListService statuslistService) { + this.statuslistService = statuslistService; + } @GET - @Path("/participants/{participantId}/credentials") + @Path("/{participantId}") @Override - public VerifiableCredentialResponse getAllCredentials(@PathParam("participantId") String participantId) { - return new VerifiableCredentialResponse(CredentialFormat.VC1_0_JWT, VerifiableCredential.Builder.newInstance().build()); + public Collection getAllCredentials(@PathParam("participantId") String participantId) { + return List.of(); } @POST - @Path("/credentials") @Override public VerifiableCredentialResponse queryCredentials(QuerySpec query) { return null; } @POST - @Path("/participants/{participantId}/credentials/{credentialId}/revoke") + @Path("/{credentialId}/revoke") @Override - public Response revokeCredential(@PathParam("participantId") String participantId, - @PathParam("credentialId") String credentialId) { - return Response.noContent().build(); + public Response revokeCredential(@PathParam("credentialId") String credentialId) { + return statuslistService.revokeCredential(credentialId) + .map(v -> Response.noContent().build()) + .orElseThrow(exceptionMapper(VerifiableCredential.class, credentialId)); } @POST - @Path("/participants/{participantId}/credentials/{credentialId}/suspend") + @Path("/{credentialId}/suspend") @Override - public Response suspendCredential(@PathParam("participantId") String participantId, - @PathParam("credentialId") String credentialId) { - return null; + public Response suspendCredential(@PathParam("credentialId") String credentialId) { + return Response.status(501).build(); } @POST - @Path("/participants/{participantId}/credentials/{credentialId}/resume") + @Path("/{credentialId}/resume") @Override - public Response resumeCredential(@PathParam("participantId") String participantId, - @PathParam("credentialId") String credentialId) { - return null; + public Response resumeCredential(@PathParam("credentialId") String credentialId) { + return Response.status(501).build(); } @GET - @Path("/participants/{participantId}/credentials/{credentialId}/status") + @Path("/{credentialId}/status") @Override - public CredentialStatusResponse checkRevocationStatus(@PathParam("participantId") String participantId, - @PathParam("credentialId") String credentialId) { - return null; + public CredentialStatusResponse checkRevocationStatus(@PathParam("credentialId") String credentialId) { + return statuslistService.getCredentialStatus(credentialId) + .map(status -> new CredentialStatusResponse(credentialId, status, null)) + .orElseThrow(exceptionMapper(VerifiableCredential.class, credentialId)); } } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialResponse.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialResponse.java index 149bc9c01..7f2062cae 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialResponse.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialResponse.java @@ -23,6 +23,7 @@ * @param format The {@link CredentialFormat} of the credential * @param verifiableCredential Structured metadata about the VC, not the actual VC. This will not contain the proof! */ -public record VerifiableCredentialResponse(CredentialFormat format, VerifiableCredential verifiableCredential) { +public record VerifiableCredentialResponse(CredentialFormat format, + VerifiableCredential verifiableCredential) { } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java b/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java new file mode 100644 index 000000000..89fca34f5 --- /dev/null +++ b/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java @@ -0,0 +1,127 @@ +/* + * 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.api.admin.credentials.v1.unstable; + +import io.restassured.specification.RequestSpecification; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.VerifiableCredential; +import org.eclipse.edc.identityhub.api.Versions; +import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; +import org.eclipse.edc.web.jersey.testfixtures.RestControllerTestBase; +import org.junit.jupiter.api.Test; + +import static io.restassured.RestAssured.given; +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.mock; + +class IssuerCredentialsAdminApiControllerTest extends RestControllerTestBase { + + private final StatusListService statuslistServiceMock = mock(); + + @Test + void getAllCredentials() { + var credentials = baseRequest() + .get("/test-participant") + .then() + .statusCode(200) + .extract().body().as(VerifiableCredential[].class); + + assertThat(credentials).hasSize(2); + } + + @Test + void getAllCredentials_whenNoResult() { + var credentials = baseRequest() + .get("/test-participant") + .then() + .statusCode(200) + .extract().body().as(VerifiableCredential[].class); + + assertThat(credentials).hasSize(2); + } + + @Test + void queryCredentials() { + } + + @Test + void revokeCredential_whenAlreadyRevoked() { + } + + @Test + void revokeCredential_whenNotRevoked() { + } + + @Test + void revokeCredential_whenNotFoundRevoked() { + } + + @Test + void suspendCredential() { + baseRequest() + .post("/test-credential-id/suspend") + .then() + .statusCode(501); + } + + @Test + void resumeCredential() { + baseRequest() + .post("/test-credential-id/resume") + .then() + .statusCode(501); + } + + @Test + void checkRevocationStatus_whenNotRevoked() { + baseRequest() + .post("/test-credential-id/status") + .then() + .statusCode(200) + .body(isNull()); + } + + @Test + void checkRevocationStatus_whenRevoked() { + baseRequest() + .post("/test-credential-id/status") + .then() + .statusCode(200) + .body(equalTo("revocation")); + } + + @Test + void checkRevocationStatus_whenNotFound() { + baseRequest() + .post("/test-credential-id/status") + .then() + .statusCode(404) + .body(notNullValue()); + } + + @Override + protected Object controller() { + return new IssuerCredentialsAdminApiController(statuslistServiceMock); + } + + private RequestSpecification baseRequest() { + return given() + .contentType("application/json") + .baseUri("http://localhost:" + port + Versions.UNSTABLE + "/credentials") + .when(); + } +} \ No newline at end of file diff --git a/extensions/api/issuer-admin-api/issuer-admin-api-configuration/src/main/java/org/eclipse/edc/identityhub/api/configuration/IssuerAdminApiConfigurationExtension.java b/extensions/api/issuer-admin-api/issuer-admin-api-configuration/src/main/java/org/eclipse/edc/identityhub/api/configuration/IssuerAdminApiConfigurationExtension.java index 3b092d4e3..7128198c7 100644 --- a/extensions/api/issuer-admin-api/issuer-admin-api-configuration/src/main/java/org/eclipse/edc/identityhub/api/configuration/IssuerAdminApiConfigurationExtension.java +++ b/extensions/api/issuer-admin-api/issuer-admin-api-configuration/src/main/java/org/eclipse/edc/identityhub/api/configuration/IssuerAdminApiConfigurationExtension.java @@ -92,7 +92,7 @@ private void registerVersionInfo(ClassLoader resourceClassLoader) { record IdentityApiConfiguration( @Setting(key = "web.http." + ISSUERADMIN + ".port", description = "Port for " + ISSUERADMIN + " api context", defaultValue = 15152 + "") int port, - @Setting(key = "web.http." + ISSUERADMIN + ".path", description = "Path for " + ISSUERADMIN + " api context", defaultValue = "/api/issuer/admin") + @Setting(key = "web.http." + ISSUERADMIN + ".path", description = "Path for " + ISSUERADMIN + " api context", defaultValue = "/api/issuer") String path ) { diff --git a/spi/identity-hub-spi/src/main/java/org/eclipse/edc/identityhub/spi/webcontext/IdentityHubApiContext.java b/spi/identity-hub-spi/src/main/java/org/eclipse/edc/identityhub/spi/webcontext/IdentityHubApiContext.java index f530afdf7..60ba1c6fc 100644 --- a/spi/identity-hub-spi/src/main/java/org/eclipse/edc/identityhub/spi/webcontext/IdentityHubApiContext.java +++ b/spi/identity-hub-spi/src/main/java/org/eclipse/edc/identityhub/spi/webcontext/IdentityHubApiContext.java @@ -18,7 +18,7 @@ public interface IdentityHubApiContext { String IDENTITY = "identity"; String IH_DID = "did"; String PRESENTATION = "presentation"; - String ISSUER_API = "issuer-api"; + String ISSUANCE_API = "issuance-api"; @Deprecated(since = "0.9.0") String RESOLUTION = "resolution"; String ISSUERADMIN = "issueradmin"; From 15fbfe607437e486f04ae04506b6b926cc03787d Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger Date: Thu, 6 Feb 2025 17:06:44 +0100 Subject: [PATCH 2/8] add e2e test for credential api --- .../build.gradle.kts | 4 +- .../CredentialServiceExtension.java | 37 +++ .../credentials/CredentialServiceImpl.java | 43 ++++ .../StatusListInfoFactoryRegistryImpl.java | 0 .../StatusListServiceExtension.java | 2 +- .../statuslist/StatusListServiceImpl.java | 0 .../bitstring/BitstringStatusInfo.java | 0 .../bitstring/BitstringStatusListFactory.java | 0 ...rg.eclipse.edc.spi.system.ServiceExtension | 1 + .../statuslist/StatusListServiceImplTest.java | 0 .../issuerservice/statuslist/TestData.java | 0 .../BitstringStatusListFactoryTest.java | 0 .../issuerservice-base-bom/build.gradle.kts | 2 +- e2e-tests/admin-api-tests/build.gradle.kts | 7 +- .../tests/CredentialApiEndToEndTest.java | 218 +++++++++++++++++- .../edc/identityhub/tests/TestData.java | 74 ++++++ .../IssuerServiceRuntimeConfiguration.java | 3 +- .../eclipse/edc/test/bom/BomSmokeTests.java | 1 + .../credentials-api/build.gradle.kts | 2 +- .../IssuerCredentialsAdminApiExtension.java | 5 +- .../unstable/IssuerCredentialsAdminApi.java | 10 +- .../IssuerCredentialsAdminApiController.java | 22 +- ...onse.java => VerifiableCredentialDto.java} | 5 +- ...suerCredentialsAdminApiControllerTest.java | 131 +++++++++-- settings.gradle.kts | 4 +- .../build.gradle.kts | 1 - .../issuerservice/spi/CredentialService.java | 27 +++ .../spi/statuslist/StatusListInfo.java | 0 .../spi/statuslist/StatusListInfoFactory.java | 0 .../StatusListInfoFactoryRegistry.java | 0 .../spi/statuslist/StatusListService.java | 0 31 files changed, 554 insertions(+), 45 deletions(-) rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/build.gradle.kts (57%) create mode 100644 core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java create mode 100644 core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListInfoFactoryRegistryImpl.java (100%) rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java (97%) rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java (100%) rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusInfo.java (100%) rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactory.java (100%) rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension (85%) rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/src/test/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImplTest.java (100%) rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/src/test/java/org/eclipse/edc/issuerservice/statuslist/TestData.java (100%) rename core/issuerservice/{issuerservice-credential-revocation => issuerservice-credentials}/src/test/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactoryTest.java (100%) create mode 100644 e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/TestData.java rename extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/{VerifiableCredentialResponse.java => VerifiableCredentialDto.java} (77%) rename spi/issuerservice/{credential-revocation-spi => issuerservice-credential-spi}/build.gradle.kts (96%) create mode 100644 spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/CredentialService.java rename spi/issuerservice/{credential-revocation-spi => issuerservice-credential-spi}/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfo.java (100%) rename spi/issuerservice/{credential-revocation-spi => issuerservice-credential-spi}/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactory.java (100%) rename spi/issuerservice/{credential-revocation-spi => issuerservice-credential-spi}/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactoryRegistry.java (100%) rename spi/issuerservice/{credential-revocation-spi => issuerservice-credential-spi}/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java (100%) diff --git a/core/issuerservice/issuerservice-credential-revocation/build.gradle.kts b/core/issuerservice/issuerservice-credentials/build.gradle.kts similarity index 57% rename from core/issuerservice/issuerservice-credential-revocation/build.gradle.kts rename to core/issuerservice/issuerservice-credentials/build.gradle.kts index 7cd99d642..58bef2b4c 100644 --- a/core/issuerservice/issuerservice-credential-revocation/build.gradle.kts +++ b/core/issuerservice/issuerservice-credentials/build.gradle.kts @@ -4,15 +4,13 @@ plugins { dependencies { api(project(":spi:verifiable-credential-spi")) - api(project(":spi:issuerservice:credential-revocation-spi")) + api(project(":spi:issuerservice:issuerservice-credential-spi")) implementation(libs.edc.lib.token) implementation(libs.nimbus.jwt) implementation(libs.edc.spi.transaction) implementation(libs.edc.lib.store) - testImplementation(project(":core:identity-hub-core")) testImplementation(libs.edc.junit) - testImplementation(testFixtures(project(":spi:issuerservice:issuerservice-participant-spi"))) } diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java new file mode 100644 index 000000000..a77412949 --- /dev/null +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java @@ -0,0 +1,37 @@ +/* + * 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.credentials; + +import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; +import org.eclipse.edc.issuerservice.spi.CredentialService; +import org.eclipse.edc.runtime.metamodel.annotation.Extension; +import org.eclipse.edc.runtime.metamodel.annotation.Inject; +import org.eclipse.edc.runtime.metamodel.annotation.Provider; +import org.eclipse.edc.spi.system.ServiceExtension; + +import static org.eclipse.edc.issuerservice.statuslist.StatusListServiceExtension.NAME; + +@Extension(value = NAME) +public class CredentialServiceExtension implements ServiceExtension { + public static final String NAME = "Credential Service Extension"; + + @Inject + private CredentialStore store; + + @Provider + public CredentialService getCredentialService() { + return new CredentialServiceImpl(store); + } +} diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java new file mode 100644 index 000000000..77bd17faf --- /dev/null +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java @@ -0,0 +1,43 @@ +/* + * 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.credentials; + +import org.eclipse.edc.identityhub.spi.participantcontext.model.IdentityResource; +import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; +import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; +import org.eclipse.edc.issuerservice.spi.CredentialService; +import org.eclipse.edc.spi.query.QuerySpec; +import org.eclipse.edc.spi.result.ServiceResult; + +import java.util.Collection; + +public class CredentialServiceImpl implements CredentialService { + private final CredentialStore credentialStore; + + public CredentialServiceImpl(CredentialStore credentialStore) { + this.credentialStore = credentialStore; + } + + @Override + public ServiceResult> getForParticipant(String participantId) { + var query = IdentityResource.queryByParticipantContextId(participantId).build(); + return query(query); + } + + @Override + public ServiceResult> query(QuerySpec query) { + return ServiceResult.from(credentialStore.query(query)); + } +} diff --git a/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListInfoFactoryRegistryImpl.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListInfoFactoryRegistryImpl.java similarity index 100% rename from core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListInfoFactoryRegistryImpl.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListInfoFactoryRegistryImpl.java diff --git a/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java similarity index 97% rename from core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java index d65fdd078..45d1d3652 100644 --- a/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java @@ -53,7 +53,7 @@ public StatusListService getStatusListService(ServiceExtensionContext context) { var fact = getFactory(); // Bitstring StatusList is provided by default. others can be added via extensions - fact.register("BitStringStatusListEntry", new BitstringStatusListFactory(store, typeManager.getMapper())); + fact.register("BitstringStatusListEntry", new BitstringStatusListFactory(store, typeManager.getMapper())); var tokenGenerationService = new JwtGenerationService(jwsSignerProvider); return new StatusListServiceImpl(store, transactionContext, typeManager.getMapper(JSON_LD), context.getMonitor(), tokenGenerationService, diff --git a/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java similarity index 100% rename from core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java diff --git a/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusInfo.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusInfo.java similarity index 100% rename from core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusInfo.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusInfo.java diff --git a/core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactory.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactory.java similarity index 100% rename from core/issuerservice/issuerservice-credential-revocation/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactory.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactory.java diff --git a/core/issuerservice/issuerservice-credential-revocation/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 85% rename from core/issuerservice/issuerservice-credential-revocation/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension rename to core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension index 2d00e5cbd..2da2ba7ad 100644 --- a/core/issuerservice/issuerservice-credential-revocation/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ b/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -12,3 +12,4 @@ # # org.eclipse.edc.issuerservice.statuslist.StatusListServiceExtension +org.eclipse.edc.issuerservice.credentials.CredentialServiceExtension \ No newline at end of file diff --git a/core/issuerservice/issuerservice-credential-revocation/src/test/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImplTest.java b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImplTest.java similarity index 100% rename from core/issuerservice/issuerservice-credential-revocation/src/test/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImplTest.java rename to core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImplTest.java diff --git a/core/issuerservice/issuerservice-credential-revocation/src/test/java/org/eclipse/edc/issuerservice/statuslist/TestData.java b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/TestData.java similarity index 100% rename from core/issuerservice/issuerservice-credential-revocation/src/test/java/org/eclipse/edc/issuerservice/statuslist/TestData.java rename to core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/TestData.java diff --git a/core/issuerservice/issuerservice-credential-revocation/src/test/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactoryTest.java b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactoryTest.java similarity index 100% rename from core/issuerservice/issuerservice-credential-revocation/src/test/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactoryTest.java rename to core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactoryTest.java diff --git a/dist/bom/issuerservice-base-bom/build.gradle.kts b/dist/bom/issuerservice-base-bom/build.gradle.kts index b9ac4de48..2cd2672f3 100644 --- a/dist/bom/issuerservice-base-bom/build.gradle.kts +++ b/dist/bom/issuerservice-base-bom/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { runtimeOnly(project(":core:identity-hub-keypairs")) runtimeOnly(project(":core:issuerservice:issuerservice-core")) runtimeOnly(project(":core:issuerservice:issuerservice-participants")) - runtimeOnly(project(":core:issuerservice:issuerservice-credential-revocation")) + runtimeOnly(project(":core:issuerservice:issuerservice-credentials")) runtimeOnly(project(":extensions:did:local-did-publisher")) // API modules runtimeOnly(project(":extensions:protocols:dcp:dcp-issuer:dcp-issuer-api")) diff --git a/e2e-tests/admin-api-tests/build.gradle.kts b/e2e-tests/admin-api-tests/build.gradle.kts index 0a70fff16..0d58f488c 100644 --- a/e2e-tests/admin-api-tests/build.gradle.kts +++ b/e2e-tests/admin-api-tests/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { testImplementation(project(":core:identity-hub-participants")) testImplementation(project(":extensions:api:issuer-admin-api:participant-api")) // for the DTOs testImplementation(project(":spi:issuerservice:issuerservice-participant-spi")) + testImplementation(project(":spi:issuerservice:issuerservice-credential-spi")) testImplementation(libs.edc.junit) testImplementation(libs.restAssured) testImplementation(libs.awaitility) @@ -28,16 +29,14 @@ dependencies { testImplementation(libs.testcontainers.postgres) // needed for the Participant - testImplementation(testFixtures(libs.edc.testfixtures.managementapi)) - testImplementation(testFixtures(libs.edc.sql.test.fixtures)) testImplementation(libs.edc.transaction.local) testImplementation(libs.nimbus.jwt) testImplementation(libs.jakarta.rsApi) testImplementation(libs.edc.sts.spi) testImplementation(testFixtures(project(":e2e-tests:fixtures"))) - testCompileOnly(project(":dist:bom:identityhub-with-sts-bom")) - testCompileOnly(project(":dist:bom:identityhub-feature-sql-bom")) +// testCompileOnly(project(":dist:bom:identityhub-with-sts-bom")) +// testCompileOnly(project(":dist:bom:identityhub-feature-sql-bom")) } edcBuild { diff --git a/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java index 7680d216c..4cb55d102 100644 --- a/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java +++ b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java @@ -14,21 +14,236 @@ package org.eclipse.edc.identityhub.tests; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.nimbusds.jose.JOSEException; +import com.nimbusds.jose.jwk.Curve; +import com.nimbusds.jose.jwk.gen.ECKeyGenerator; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialFormat; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialStatus; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialSubject; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.Issuer; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.VerifiableCredential; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.VerifiableCredentialContainer; +import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VcStatus; +import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; +import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; import org.eclipse.edc.identityhub.tests.fixtures.IssuerServiceEndToEndExtension; +import org.eclipse.edc.identityhub.tests.fixtures.IssuerServiceEndToEndTestContext; +import org.eclipse.edc.json.JacksonTypeManager; import org.eclipse.edc.junit.annotations.EndToEndTest; import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; +import org.eclipse.edc.spi.query.QuerySpec; +import org.eclipse.edc.spi.security.Vault; +import org.hamcrest.Matchers; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import java.time.Instant; +import java.util.Map; +import java.util.UUID; + +import static io.restassured.http.ContentType.JSON; +import static org.assertj.core.api.Assertions.assertThat; +import static org.eclipse.edc.identityhub.tests.TestData.EXAMPLE_REVOCATION_CREDENTIAL; +import static org.eclipse.edc.identityhub.tests.TestData.EXAMPLE_REVOCATION_CREDENTIAL_JWT; +import static org.eclipse.edc.identityhub.tests.TestData.EXAMPLE_REVOCATION_CREDENTIAL_JWT_WITH_STATUS_BIT_SET; +import static org.eclipse.edc.identityhub.tests.TestData.EXAMPLE_REVOCATION_CREDENTIAL_WITH_STATUS_BIT_SET; + public class CredentialApiEndToEndTest { - abstract static class Tests { + public static final String SIGNING_KEY_ALIAS = "signing-key"; + public static final int STATUS_LIST_INDEX = 94567; + private static final String STATUS_LIST_CREDENTIAL_ID = "https://example.com/credentials/status/3"; + private final ObjectMapper objectMapper = new JacksonTypeManager().getMapper() + .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + private @NotNull VerifiableCredentialResource createCredential(String credentialId) { + var cred = VerifiableCredential.Builder.newInstance() + .issuanceDate(Instant.now()) + .id(credentialId) + .type("VerifiableCredential") + .credentialSubject(CredentialSubject.Builder.newInstance().id(UUID.randomUUID().toString()).claim("foo", "bar").build()) + .credentialStatus(new CredentialStatus(credentialId + "#status", "BitstringStatusListEntry", Map.of( + "statusListIndex", STATUS_LIST_INDEX, + "statusPurpose", "revocation", + "statusListCredential", STATUS_LIST_CREDENTIAL_ID + ))) + .issuer(new Issuer(UUID.randomUUID().toString())) + .build(); + return VerifiableCredentialResource.Builder.newInstance() + .state(VcStatus.ISSUED) + .issuerId("issuer-id") + .holderId("holder-id") + .id(credentialId) + .credential(new VerifiableCredentialContainer("JWT_STRING", CredentialFormat.VC1_0_JWT, cred)) + .build(); + } + + private VerifiableCredentialResource createRevocationCredential(String credentialJson, String credentialJwt) { + try { + var credential = objectMapper.readValue(credentialJson, VerifiableCredential.class); + return VerifiableCredentialResource.Builder.newInstance() + .state(VcStatus.ISSUED) + .issuerId("issuer-id") + .holderId("holder-id") + .id(STATUS_LIST_CREDENTIAL_ID) + .credential(new VerifiableCredentialContainer(credentialJwt, CredentialFormat.VC1_0_JWT, credential)) + .build(); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + abstract class Tests { + + + @BeforeEach + void prepare(Vault vault) throws JOSEException { + // put signing key in vault + vault.storeSecret(SIGNING_KEY_ALIAS, new ECKeyGenerator(Curve.P_256).generate().toJSONString()); + } + + @AfterEach + void teardown(CredentialStore credentialStore) { + credentialStore.query(QuerySpec.max()).getContent() + .forEach(vcr -> credentialStore.deleteById(vcr.getId())); + } + + @Test + void revoke_whenNotYetRevoked(IssuerServiceEndToEndTestContext context, CredentialStore credentialStore) { + + // create revocation credential + var res = createRevocationCredential(EXAMPLE_REVOCATION_CREDENTIAL, EXAMPLE_REVOCATION_CREDENTIAL_JWT); + + // track the original bitstring + var originalBitstring = res.getVerifiableCredential().credential().getCredentialSubject().get(0).getClaim("", "encodedList"); + credentialStore.create(res).orElseThrow(f -> new RuntimeException("Failed to create credential: " + f.getFailureDetail())); + + credentialStore.create(createCredential("test-cred")); + + context.getAdminEndpoint() + .baseRequest() + .contentType(JSON) + .post("/v1alpha/credentials/test-cred/revoke") + .then() + .log().ifValidationFails() + .statusCode(204); + + // verify that the status list credential's bitstring has changed + var updatedBitstring = credentialStore.findById(STATUS_LIST_CREDENTIAL_ID).getContent() + .getVerifiableCredential().credential().getCredentialSubject().get(0).getClaim("", "encodedList"); + assertThat(updatedBitstring).isNotEqualTo(originalBitstring); + } + + @Test + void revoke_whenAlreadyRevoked(IssuerServiceEndToEndTestContext context, CredentialStore credentialStore) { + + // create a statuslist credential which has the "revocation" bit set + var res = createRevocationCredential(EXAMPLE_REVOCATION_CREDENTIAL_WITH_STATUS_BIT_SET, EXAMPLE_REVOCATION_CREDENTIAL_JWT_WITH_STATUS_BIT_SET); + + // track the original bitstring + var originalBitstring = res.getVerifiableCredential().credential().getCredentialSubject().get(0).getClaim("", "encodedList"); + credentialStore.create(res).orElseThrow(f -> new RuntimeException("Failed to create credential: " + f.getFailureDetail())); + credentialStore.create(createCredential("test-cred")); + + context.getAdminEndpoint() + .baseRequest() + .contentType(JSON) + .post("/v1alpha/credentials/test-cred/revoke") + .then() + .log().ifValidationFails() + .statusCode(204); + + // verify that the status list credential's bitstring has NOT changed + var updatedBitstring = credentialStore.findById(STATUS_LIST_CREDENTIAL_ID).getContent() + .getVerifiableCredential().credential().getCredentialSubject().get(0).getClaim("", "encodedList"); + assertThat(updatedBitstring).isEqualTo(originalBitstring); + } + + @Test + void revoke_whenCredentialNotFound(IssuerServiceEndToEndTestContext context, CredentialStore credentialStore) { + // create a statuslist credential which has the "revocation" bit set + var res = createRevocationCredential(EXAMPLE_REVOCATION_CREDENTIAL_WITH_STATUS_BIT_SET, EXAMPLE_REVOCATION_CREDENTIAL_JWT_WITH_STATUS_BIT_SET); + + // track the original bitstring + var originalBitstring = res.getVerifiableCredential().credential().getCredentialSubject().get(0).getClaim("", "encodedList"); + credentialStore.create(res).orElseThrow(f -> new RuntimeException("Failed to create credential: " + f.getFailureDetail())); + + // missing: creation of the holder credential + + context.getAdminEndpoint() + .baseRequest() + .contentType(JSON) + .post("/v1alpha/credentials/test-cred/revoke") + .then() + .log().ifValidationFails() + .statusCode(404) + .body(Matchers.containsString("was not found")); + } + + @Test + void revoke_whenStatusListCredentialNotFound(IssuerServiceEndToEndTestContext context, CredentialStore credentialStore) { + + //missing: create status list credential + + credentialStore.create(createCredential("test-cred")); + + context.getAdminEndpoint() + .baseRequest() + .contentType(JSON) + .post("/v1alpha/credentials/test-cred/revoke") + .then() + .log().ifValidationFails() + .statusCode(404) + .body(Matchers.containsString("was not found")); + + } + + @Test + void revoke_whenWrongStatusListType(IssuerServiceEndToEndTestContext context, CredentialStore credentialStore) { + // create a statuslist credential which has the "revocation" bit set + var res = createRevocationCredential(EXAMPLE_REVOCATION_CREDENTIAL, EXAMPLE_REVOCATION_CREDENTIAL_JWT); + + // track the original bitstring + var originalBitstring = res.getVerifiableCredential().credential().getCredentialSubject().get(0).getClaim("", "encodedList"); + credentialStore.create(res).orElseThrow(f -> new RuntimeException("Failed to create credential: " + f.getFailureDetail())); + + + // create credential with invalid status type + var credential = createCredential("test-cred"); + var status = credential.getVerifiableCredential().credential().getCredentialStatus(); + status.clear(); + status.add(new CredentialStatus("test-cred#status", "InvalidStatusListType", Map.of( + "statusListIndex", STATUS_LIST_INDEX, + "statusPurpose", "revocation", + "statusListCredential", STATUS_LIST_CREDENTIAL_ID + ))); + credentialStore.create(credential); + + context.getAdminEndpoint() + .baseRequest() + .contentType(JSON) + .post("/v1alpha/credentials/test-cred/revoke") + .then() + .log().ifValidationFails() + .statusCode(400) + .body(Matchers.containsString("No StatusList implementation for type 'InvalidStatusListType' found.")); + + } } @Nested @EndToEndTest @ExtendWith(IssuerServiceEndToEndExtension.InMemory.class) class InMemory extends Tests { + } @Nested @@ -37,4 +252,5 @@ class InMemory extends Tests { class Postgres extends Tests { } + } diff --git a/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/TestData.java b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/TestData.java new file mode 100644 index 000000000..51c99cdb3 --- /dev/null +++ b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/TestData.java @@ -0,0 +1,74 @@ +/* + * 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.identityhub.tests; + +public class TestData { + public static final String EXAMPLE_REVOCATION_CREDENTIAL = """ + { + "@context": [ + "https://www.w3.org/ns/credentials/v2" + ], + "id": "https://example.com/credentials/status/3", + "type": ["VerifiableCredential", "BitstringStatusListCredential"], + "issuer": "did:example:12345", + "validFrom": "2021-04-05T14:27:40Z", + "credentialSubject": { + "id": "https://example.com/status/3#list", + "type": "BitstringStatusList", + "statusPurpose": "revocation", + "encodedList": "uH4sIAAAAAAAAA-3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAIC3AYbSVKsAQAAA" + } + } + """; + public static final String EXAMPLE_REVOCATION_CREDENTIAL_WITH_STATUS_BIT_SET = """ + { + "@context": [ + "https://www.w3.org/ns/credentials/v2" + ], + "id": "https://example.com/credentials/status/3", + "type": ["VerifiableCredential", "BitstringStatusListCredential"], + "issuer": "did:example:12345", + "validFrom": "2021-04-05T14:27:40Z", + "credentialSubject": { + "id": "https://example.com/status/3#list", + "type": "BitstringStatusList", + "statusPurpose": "revocation", + "encodedList": "H4sIAAAAAAAA/+3OMQ0AAAgDsOHfNBp2kZBWQRMAAAAAAAAAAAAAAL6Z6wAAAAAAtQVQdb5gAEAAAA==" + } + } + """; + + public static final String EXAMPLE_REVOCATION_CREDENTIAL_JWT = """ + eyJraWQiOiJFeEhrQk1XOWZtYmt2VjI2Nm1ScHVQMnNVWV9OX0VXSU4xbGFwVXpPOHJvIiwiYWxnIjoiRVMyNTYifQ.eyJAY29udGV4dCI6W + yJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwiaWQiOiJodHRwczovL2V4YW1wbGUuY29tL2NyZWRlbnRpYWxzL3N0Y + XR1cy8zIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkJpdHN0cmluZ1N0YXR1c0xpc3RDcmVkZW50aWFsIl0sImlzc3VlciI6I + mRpZDpleGFtcGxlOjEyMzQ1IiwidmFsaWRGcm9tIjoiMjAyMS0wNC0wNVQxNDoyNzo0MFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6I + mh0dHBzOi8vZXhhbXBsZS5jb20vc3RhdHVzLzMjbGlzdCIsInR5cGUiOiJCaXRzdHJpbmdTdGF0dXNMaXN0Iiwic3RhdHVzUHVycG9zZSI6I + nJldm9jYXRpb24iLCJlbmNvZGVkTGlzdCI6InVINHNJQUFBQUFBQUFBLTNCTVFFQUFBRENvUFZQYlF3Zm9BQUFBQUFBQUFBQUFBQUFBQUFBQ + UlDM0FZYlNWS3NBUUFBQSJ9fQ.aPe5YXaNH-itNYYI7jE6FW3ttN2NzS5e1eNvkYw6BqW185w20xYKXQlZ7ETayqJXIcA7Q5HiyeVdKqPwkl + nyLQ + """; + + public static final String EXAMPLE_REVOCATION_CREDENTIAL_JWT_WITH_STATUS_BIT_SET = """ + eyJraWQiOiJFeEhrQk1XOWZtYmt2VjI2Nm1ScHVQMnNVWV9OX0VXSU4xbGFwVXpPOHJvIiwiYWxnIjoiRVMyNTYifQ.eyJAY29udGV4dCI6W + yJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwiaWQiOiJodHRwczovL2V4YW1wbGUuY29tL2NyZWRlbnRpYWxzL3N0Y + XR1cy8zIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkJpdHN0cmluZ1N0YXR1c0xpc3RDcmVkZW50aWFsIl0sImlzc3VlciI6I + mRpZDpleGFtcGxlOjEyMzQ1IiwidmFsaWRGcm9tIjoiMjAyMS0wNC0wNVQxNDoyNzo0MFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6I + mh0dHBzOi8vZXhhbXBsZS5jb20vc3RhdHVzLzMjbGlzdCIsInR5cGUiOiJCaXRzdHJpbmdTdGF0dXNMaXN0Iiwic3RhdHVzUHVycG9zZSI6I + nJldm9jYXRpb24iLCJlbmNvZGVkTGlzdCI6Ikg0c0lBQUFBQUFBQS8rM09NUTBBQUFnRHNPSGZOQnAya1pCV1FSTUFBQUFBQUFBQUFBQUFBT + DZaNndBQUFBQUF0UVZRZGI1Z0FFQUFBQT09In19.EI-kWzpDykZxbvedDgEG0cOJRFfEDZHJtHlnGD6fbQEm13GcLGKBMVT_KJEmsdjBBhys + Sh0KW-2S2mm3jS9w1w + """; +} diff --git a/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/fixtures/IssuerServiceRuntimeConfiguration.java b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/fixtures/IssuerServiceRuntimeConfiguration.java index a56be1e1f..5e14d866b 100644 --- a/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/fixtures/IssuerServiceRuntimeConfiguration.java +++ b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/fixtures/IssuerServiceRuntimeConfiguration.java @@ -61,7 +61,8 @@ public Map config() { put("edc.sql.schema.autocreate", "true"); put("edc.sts.account.api.url", "http://sts.com/accounts"); put("edc.sts.accounts.api.auth.header.value", "password"); - put("edc.iam.accesstoken.jti.validation", String.valueOf(true)); + put("edc.iam.accesstoken.jti.validation", String.valueOf(false)); + put("edc.issuer.statuslist.signing.key.alias", "signing-key"); } }; } diff --git a/e2e-tests/bom-tests/src/test/java/org/eclipse/edc/test/bom/BomSmokeTests.java b/e2e-tests/bom-tests/src/test/java/org/eclipse/edc/test/bom/BomSmokeTests.java index b783ee4f7..51289daf0 100644 --- a/e2e-tests/bom-tests/src/test/java/org/eclipse/edc/test/bom/BomSmokeTests.java +++ b/e2e-tests/bom-tests/src/test/java/org/eclipse/edc/test/bom/BomSmokeTests.java @@ -129,6 +129,7 @@ class IssuerService extends SmokeTest { put("web.http.issuer-api.path", "/api/issuer"); put("edc.sts.account.api.url", "https://sts.com/accounts"); put("edc.sts.accounts.api.auth.header.value", "password"); + put("edc.issuer.statuslist.signing.key.alias", "signing-key"); } }, ":dist:bom:issuerservice-bom" diff --git a/extensions/api/issuer-admin-api/credentials-api/build.gradle.kts b/extensions/api/issuer-admin-api/credentials-api/build.gradle.kts index 25465afb6..306676d3a 100644 --- a/extensions/api/issuer-admin-api/credentials-api/build.gradle.kts +++ b/extensions/api/issuer-admin-api/credentials-api/build.gradle.kts @@ -20,7 +20,7 @@ plugins { dependencies { api(libs.edc.spi.core) - api(project(":spi:issuerservice:credential-revocation-spi")) + api(project(":spi:issuerservice:issuerservice-credential-spi")) implementation(project(":extensions:api:issuer-admin-api:issuer-admin-api-configuration")) implementation(libs.edc.spi.validator) implementation(libs.edc.spi.web) diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java index 562bfa566..2017ab05f 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java @@ -16,6 +16,7 @@ import org.eclipse.edc.identityhub.spi.webcontext.IdentityHubApiContext; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.IssuerCredentialsAdminApiController; +import org.eclipse.edc.issuerservice.spi.CredentialService; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; import org.eclipse.edc.runtime.metamodel.annotation.Extension; import org.eclipse.edc.runtime.metamodel.annotation.Inject; @@ -33,6 +34,8 @@ public class IssuerCredentialsAdminApiExtension implements ServiceExtension { private WebService webService; @Inject private StatusListService statusListService; + @Inject + private CredentialService credentialService; @Override public String name() { @@ -41,7 +44,7 @@ public String name() { @Override public void initialize(ServiceExtensionContext context) { - var controller = new IssuerCredentialsAdminApiController(statusListService); + var controller = new IssuerCredentialsAdminApiController(statusListService, credentialService); webService.registerResource(IdentityHubApiContext.ISSUERADMIN, controller); } } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApi.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApi.java index 9dded1549..66e3c7853 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApi.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApi.java @@ -27,7 +27,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.ws.rs.core.Response; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.CredentialStatusResponse; -import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialResponse; +import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialDto; import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.web.spi.ApiErrorDetail; @@ -43,7 +43,7 @@ public interface IssuerCredentialsAdminApi { parameters = {@Parameter(name = "participantId", description = "ID of the participant whos credentials should be returned", required = true, in = ParameterIn.PATH)}, responses = { @ApiResponse(responseCode = "200", description = "A list of verifiable credential metadata. Note that these are not actual VerifiableCredentials.", - content = @Content(array = @ArraySchema(schema = @Schema(implementation = VerifiableCredentialResponse.class)), mediaType = "application/json")), + content = @Content(array = @ArraySchema(schema = @Schema(implementation = VerifiableCredentialDto.class)), mediaType = "application/json")), @ApiResponse(responseCode = "400", description = "Request body was malformed, or the request could not be processed", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")), @ApiResponse(responseCode = "401", description = "The request could not be completed, because either the authentication was missing or was not valid.", @@ -52,21 +52,21 @@ public interface IssuerCredentialsAdminApi { content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")) } ) - Collection getAllCredentials(String participantId); + Collection getAllCredentials(String participantId); @Operation(description = "Query credentials, possibly across multiple participants.", operationId = "queryCredentials", requestBody = @RequestBody(content = @Content(schema = @Schema(implementation = QuerySpec.class), mediaType = "application/json")), responses = { @ApiResponse(responseCode = "200", description = "A list of verifiable credential metadata. Note that these are not actual VerifiableCredentials.", - content = @Content(schema = @Schema(implementation = VerifiableCredentialResponse.class), mediaType = "application/json")), + content = @Content(array = @ArraySchema(schema = @Schema(implementation = VerifiableCredentialDto.class)), mediaType = "application/json")), @ApiResponse(responseCode = "400", description = "Request body was malformed, or the request could not be processed", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")), @ApiResponse(responseCode = "401", description = "The request could not be completed, because either the authentication was missing or was not valid.", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)), mediaType = "application/json")) } ) - VerifiableCredentialResponse queryCredentials(QuerySpec query); + Collection queryCredentials(QuerySpec query); @Operation(description = "Revokes a credential with the given ID for the given participant. Revoked credentials will be added to the Revocation List", diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java index a8d7da42e..cead224f8 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java @@ -24,12 +24,12 @@ import org.eclipse.edc.iam.verifiablecredentials.spi.model.VerifiableCredential; import org.eclipse.edc.identityhub.api.Versions; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.CredentialStatusResponse; -import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialResponse; +import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialDto; +import org.eclipse.edc.issuerservice.spi.CredentialService; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; import org.eclipse.edc.spi.query.QuerySpec; import java.util.Collection; -import java.util.List; import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; import static org.eclipse.edc.web.spi.exception.ServiceResultHandler.exceptionMapper; @@ -39,22 +39,30 @@ @Path(Versions.UNSTABLE + "/credentials") public class IssuerCredentialsAdminApiController implements IssuerCredentialsAdminApi { private final StatusListService statuslistService; + private final CredentialService credentialService; - public IssuerCredentialsAdminApiController(StatusListService statuslistService) { + public IssuerCredentialsAdminApiController(StatusListService statuslistService, CredentialService credentialService) { this.statuslistService = statuslistService; + this.credentialService = credentialService; } @GET @Path("/{participantId}") @Override - public Collection getAllCredentials(@PathParam("participantId") String participantId) { - return List.of(); + public Collection getAllCredentials(@PathParam("participantId") String participantId) { + return credentialService.getForParticipant(participantId) + .map(coll -> coll.stream().map(resource -> + new VerifiableCredentialDto(resource.getVerifiableCredential().format(), resource.getVerifiableCredential().credential())).toList()) + .orElseThrow(exceptionMapper(VerifiableCredential.class, participantId)); } @POST + @Path("/query") @Override - public VerifiableCredentialResponse queryCredentials(QuerySpec query) { - return null; + public Collection queryCredentials(QuerySpec query) { + return credentialService.query(query).map(coll -> coll.stream().map(resource -> + new VerifiableCredentialDto(resource.getVerifiableCredential().format(), resource.getVerifiableCredential().credential())).toList()) + .orElseThrow(exceptionMapper(VerifiableCredential.class, null)); } @POST diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialResponse.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialDto.java similarity index 77% rename from extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialResponse.java rename to extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialDto.java index 7f2062cae..c97865037 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialResponse.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/model/VerifiableCredentialDto.java @@ -14,6 +14,7 @@ package org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model; +import com.fasterxml.jackson.annotation.JsonProperty; import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialFormat; import org.eclipse.edc.iam.verifiablecredentials.spi.model.VerifiableCredential; @@ -23,7 +24,7 @@ * @param format The {@link CredentialFormat} of the credential * @param verifiableCredential Structured metadata about the VC, not the actual VC. This will not contain the proof! */ -public record VerifiableCredentialResponse(CredentialFormat format, - VerifiableCredential verifiableCredential) { +public record VerifiableCredentialDto(@JsonProperty("format") CredentialFormat format, + @JsonProperty("credential") VerifiableCredential verifiableCredential) { } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java b/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java index 89fca34f5..93c908e0f 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java @@ -15,59 +15,130 @@ package org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable; import io.restassured.specification.RequestSpecification; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialFormat; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialSubject; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.Issuer; import org.eclipse.edc.iam.verifiablecredentials.spi.model.VerifiableCredential; +import org.eclipse.edc.iam.verifiablecredentials.spi.model.VerifiableCredentialContainer; import org.eclipse.edc.identityhub.api.Versions; +import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VcStatus; +import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; +import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialDto; +import org.eclipse.edc.issuerservice.spi.CredentialService; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; +import org.eclipse.edc.spi.query.QuerySpec; +import org.eclipse.edc.spi.result.ServiceResult; import org.eclipse.edc.web.jersey.testfixtures.RestControllerTestBase; +import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Test; +import java.time.Instant; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + import static io.restassured.RestAssured.given; import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.matchesRegex; import static org.hamcrest.Matchers.notNullValue; -import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.when; class IssuerCredentialsAdminApiControllerTest extends RestControllerTestBase { - private final StatusListService statuslistServiceMock = mock(); + private final StatusListService statuslistService = mock(); + private final CredentialService credentialService = mock(); @Test void getAllCredentials() { + + when(credentialService.getForParticipant(eq("test-participant"))) + .thenReturn(ServiceResult.success(List.of(createCredential(), createCredential()))); var credentials = baseRequest() .get("/test-participant") .then() .statusCode(200) - .extract().body().as(VerifiableCredential[].class); + .extract().body().as(VerifiableCredentialDto[].class); assertThat(credentials).hasSize(2); + verifyNoInteractions(statuslistService); } @Test void getAllCredentials_whenNoResult() { + when(credentialService.getForParticipant(eq("test-participant"))) + .thenReturn(ServiceResult.success(List.of())); var credentials = baseRequest() .get("/test-participant") .then() .statusCode(200) - .extract().body().as(VerifiableCredential[].class); + .extract().body().as(VerifiableCredentialDto[].class); - assertThat(credentials).hasSize(2); + assertThat(credentials).isEmpty(); + verifyNoInteractions(statuslistService); } @Test void queryCredentials() { + when(credentialService.query(any(QuerySpec.class))) + .thenReturn(ServiceResult.success(List.of(createCredential(), createCredential()))); + + var credentials = baseRequest() + .body("{}") + .post("/query") + .then() + .statusCode(200) + .extract().body().as(VerifiableCredentialDto[].class); + + assertThat(credentials).hasSize(2); + verifyNoInteractions(statuslistService); } + @Test - void revokeCredential_whenAlreadyRevoked() { + void queryCredentials_whenNoResult() { + when(credentialService.query(any(QuerySpec.class))) + .thenReturn(ServiceResult.success(Collections.emptyList())); + + var credentials = baseRequest() + .body("{}") + .post("/query") + .then() + .statusCode(200) + .extract().body().as(VerifiableCredentialDto[].class); + + assertThat(credentials).isEmpty(); + verifyNoInteractions(statuslistService); } @Test - void revokeCredential_whenNotRevoked() { + void revokeCredential_whenAlreadyRevoked() { + when(statuslistService.revokeCredential(anyString())) + .thenReturn(ServiceResult.success()); + + baseRequest() + .post("/test-credential/revoke") + .then() + .statusCode(204) + .body(notNullValue()); } + @Test - void revokeCredential_whenNotFoundRevoked() { + void revokeCredential_whenNotFound() { + when(statuslistService.revokeCredential(anyString())) + .thenReturn(ServiceResult.notFound("foo")); + + baseRequest() + .post("/test-credential/revoke") + .then() + .statusCode(404) + .body(containsString("not found")); } @Test @@ -76,6 +147,7 @@ void suspendCredential() { .post("/test-credential-id/suspend") .then() .statusCode(501); + verifyNoInteractions(credentialService, statuslistService); } @Test @@ -84,38 +156,67 @@ void resumeCredential() { .post("/test-credential-id/resume") .then() .statusCode(501); + verifyNoInteractions(credentialService, statuslistService); } @Test void checkRevocationStatus_whenNotRevoked() { + when(statuslistService.getCredentialStatus(eq("test-credential-id"))) + .thenReturn(ServiceResult.success()); baseRequest() - .post("/test-credential-id/status") + .get("/test-credential-id/status") .then() .statusCode(200) - .body(isNull()); + .body(matchesRegex(".*\"status\":.*null.*")); + verifyNoInteractions(credentialService); } @Test void checkRevocationStatus_whenRevoked() { + when(statuslistService.getCredentialStatus(eq("test-credential-id"))) + .thenReturn(ServiceResult.success("revocation")); + baseRequest() - .post("/test-credential-id/status") + .get("/test-credential-id/status") .then() .statusCode(200) - .body(equalTo("revocation")); + .body(matchesRegex(".*\"status\":.*\"revocation\".*")); + verifyNoInteractions(credentialService); } @Test void checkRevocationStatus_whenNotFound() { + when(statuslistService.getCredentialStatus(eq("test-credential-id"))) + .thenReturn(ServiceResult.notFound("foo")); + baseRequest() - .post("/test-credential-id/status") + .get("/test-credential-id/status") .then() .statusCode(404) .body(notNullValue()); + + verifyNoInteractions(credentialService); } @Override protected Object controller() { - return new IssuerCredentialsAdminApiController(statuslistServiceMock); + return new IssuerCredentialsAdminApiController(statuslistService, credentialService); + } + + private @NotNull VerifiableCredentialResource createCredential() { + var cred = VerifiableCredential.Builder.newInstance() + .issuanceDate(Instant.now()) + .id(UUID.randomUUID().toString()) + .type("VerifiableCredential") + .credentialSubject(CredentialSubject.Builder.newInstance().id(UUID.randomUUID().toString()).claim("foo", "bar").build()) + .issuer(new Issuer(UUID.randomUUID().toString())) + .build(); + return VerifiableCredentialResource.Builder.newInstance() + .state(VcStatus.ISSUED) + .issuerId("issuer-id") + .holderId("holder-id") + .credential(new VerifiableCredentialContainer("JWT_STRING", CredentialFormat.VC1_0_JWT, cred)) + .build(); } private RequestSpecification baseRequest() { diff --git a/settings.gradle.kts b/settings.gradle.kts index 782642935..8029bad14 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -32,7 +32,7 @@ include(":spi:issuance-credentials-spi") // IssuerService SPI modules include(":spi:issuerservice:issuerservice-participant-spi") -include(":spi:issuerservice:credential-revocation-spi") +include(":spi:issuerservice:issuerservice-credential-spi") // IdentityHub core modules include(":core:identity-hub-core") @@ -43,7 +43,7 @@ include(":core:identity-hub-did") // IssuerService core modules include(":core:issuerservice:issuerservice-core") include(":core:issuerservice:issuerservice-participants") -include(":core:issuerservice:issuerservice-credential-revocation") +include(":core:issuerservice:issuerservice-credentials") // lib modules include(":core:lib:keypair-lib") diff --git a/spi/issuerservice/credential-revocation-spi/build.gradle.kts b/spi/issuerservice/issuerservice-credential-spi/build.gradle.kts similarity index 96% rename from spi/issuerservice/credential-revocation-spi/build.gradle.kts rename to spi/issuerservice/issuerservice-credential-spi/build.gradle.kts index b54f9c964..7b316f03f 100644 --- a/spi/issuerservice/credential-revocation-spi/build.gradle.kts +++ b/spi/issuerservice/issuerservice-credential-spi/build.gradle.kts @@ -22,7 +22,6 @@ dependencies { api(project(":spi:verifiable-credential-spi")) api(libs.edc.spi.core) - api(libs.edc.spi.vc) testFixturesImplementation(libs.edc.junit) testFixturesImplementation(libs.assertj) diff --git a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/CredentialService.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/CredentialService.java new file mode 100644 index 000000000..8f49d4350 --- /dev/null +++ b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/CredentialService.java @@ -0,0 +1,27 @@ +/* + * 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.spi; + +import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; +import org.eclipse.edc.spi.query.QuerySpec; +import org.eclipse.edc.spi.result.ServiceResult; + +import java.util.Collection; + +public interface CredentialService { + ServiceResult> getForParticipant(String participantId); + + ServiceResult> query(QuerySpec query); +} diff --git a/spi/issuerservice/credential-revocation-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfo.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfo.java similarity index 100% rename from spi/issuerservice/credential-revocation-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfo.java rename to spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfo.java diff --git a/spi/issuerservice/credential-revocation-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactory.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactory.java similarity index 100% rename from spi/issuerservice/credential-revocation-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactory.java rename to spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactory.java diff --git a/spi/issuerservice/credential-revocation-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactoryRegistry.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactoryRegistry.java similarity index 100% rename from spi/issuerservice/credential-revocation-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactoryRegistry.java rename to spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactoryRegistry.java diff --git a/spi/issuerservice/credential-revocation-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java similarity index 100% rename from spi/issuerservice/credential-revocation-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java rename to spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java From 10847e16f341b2d08be336bd0c40bb01bfcc7fc2 Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger Date: Fri, 7 Feb 2025 07:47:44 +0100 Subject: [PATCH 3/8] merged services --- .../CredentialServiceExtension.java | 37 ---------------- .../credentials/CredentialServiceImpl.java | 43 ------------------- .../statuslist/StatusListServiceImpl.java | 14 ++++++ ...rg.eclipse.edc.spi.system.ServiceExtension | 3 +- .../tests/CredentialApiEndToEndTest.java | 3 -- .../IssuerCredentialsAdminApiExtension.java | 5 +-- .../IssuerCredentialsAdminApiController.java | 9 ++-- ...suerCredentialsAdminApiControllerTest.java | 23 +++------- .../issuerservice/spi/CredentialService.java | 27 ------------ .../spi/statuslist/StatusListService.java | 8 ++++ 10 files changed, 34 insertions(+), 138 deletions(-) delete mode 100644 core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java delete mode 100644 core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java delete mode 100644 spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/CredentialService.java diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java deleted file mode 100644 index a77412949..000000000 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.credentials; - -import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; -import org.eclipse.edc.issuerservice.spi.CredentialService; -import org.eclipse.edc.runtime.metamodel.annotation.Extension; -import org.eclipse.edc.runtime.metamodel.annotation.Inject; -import org.eclipse.edc.runtime.metamodel.annotation.Provider; -import org.eclipse.edc.spi.system.ServiceExtension; - -import static org.eclipse.edc.issuerservice.statuslist.StatusListServiceExtension.NAME; - -@Extension(value = NAME) -public class CredentialServiceExtension implements ServiceExtension { - public static final String NAME = "Credential Service Extension"; - - @Inject - private CredentialStore store; - - @Provider - public CredentialService getCredentialService() { - return new CredentialServiceImpl(store); - } -} diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java deleted file mode 100644 index 77bd17faf..000000000 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.credentials; - -import org.eclipse.edc.identityhub.spi.participantcontext.model.IdentityResource; -import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; -import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; -import org.eclipse.edc.issuerservice.spi.CredentialService; -import org.eclipse.edc.spi.query.QuerySpec; -import org.eclipse.edc.spi.result.ServiceResult; - -import java.util.Collection; - -public class CredentialServiceImpl implements CredentialService { - private final CredentialStore credentialStore; - - public CredentialServiceImpl(CredentialStore credentialStore) { - this.credentialStore = credentialStore; - } - - @Override - public ServiceResult> getForParticipant(String participantId) { - var query = IdentityResource.queryByParticipantContextId(participantId).build(); - return query(query); - } - - @Override - public ServiceResult> query(QuerySpec query) { - return ServiceResult.from(credentialStore.query(query)); - } -} diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java index a4619d9e0..1fbc6d037 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java @@ -19,17 +19,20 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.nimbusds.jose.JOSEException; import org.eclipse.edc.iam.verifiablecredentials.spi.model.VerifiableCredentialContainer; +import org.eclipse.edc.identityhub.spi.participantcontext.model.IdentityResource; import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfo; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfoFactoryRegistry; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.result.ServiceResult; import org.eclipse.edc.token.spi.TokenGenerationService; import org.eclipse.edc.transaction.spi.TransactionContext; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.Map; import java.util.function.Supplier; @@ -134,6 +137,17 @@ public ServiceResult getCredentialStatus(String credentialId) { .compose(r -> from(r.getStatus()))); } + @Override + public ServiceResult> getCredentialForParticipant(String participantId) { + var query = IdentityResource.queryByParticipantContextId(participantId).build(); + return queryCredentials(query); + } + + @Override + public ServiceResult> queryCredentials(QuerySpec query) { + return ServiceResult.from(credentialStore.query(query)); + } + private ServiceResult getCredential(String credentialId) { // credential not found -> error var credentialResult = credentialStore.findById(credentialId); diff --git a/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension index 2da2ba7ad..3b243be81 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ b/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -11,5 +11,4 @@ # Cofinity-X - initial API and implementation # # -org.eclipse.edc.issuerservice.statuslist.StatusListServiceExtension -org.eclipse.edc.issuerservice.credentials.CredentialServiceExtension \ No newline at end of file +org.eclipse.edc.issuerservice.statuslist.StatusListServiceExtension \ No newline at end of file diff --git a/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java index 4cb55d102..3605ab0c1 100644 --- a/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java +++ b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java @@ -203,7 +203,6 @@ void revoke_whenStatusListCredentialNotFound(IssuerServiceEndToEndTestContext co .log().ifValidationFails() .statusCode(404) .body(Matchers.containsString("was not found")); - } @Test @@ -212,10 +211,8 @@ void revoke_whenWrongStatusListType(IssuerServiceEndToEndTestContext context, Cr var res = createRevocationCredential(EXAMPLE_REVOCATION_CREDENTIAL, EXAMPLE_REVOCATION_CREDENTIAL_JWT); // track the original bitstring - var originalBitstring = res.getVerifiableCredential().credential().getCredentialSubject().get(0).getClaim("", "encodedList"); credentialStore.create(res).orElseThrow(f -> new RuntimeException("Failed to create credential: " + f.getFailureDetail())); - // create credential with invalid status type var credential = createCredential("test-cred"); var status = credential.getVerifiableCredential().credential().getCredentialStatus(); diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java index 2017ab05f..562bfa566 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java @@ -16,7 +16,6 @@ import org.eclipse.edc.identityhub.spi.webcontext.IdentityHubApiContext; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.IssuerCredentialsAdminApiController; -import org.eclipse.edc.issuerservice.spi.CredentialService; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; import org.eclipse.edc.runtime.metamodel.annotation.Extension; import org.eclipse.edc.runtime.metamodel.annotation.Inject; @@ -34,8 +33,6 @@ public class IssuerCredentialsAdminApiExtension implements ServiceExtension { private WebService webService; @Inject private StatusListService statusListService; - @Inject - private CredentialService credentialService; @Override public String name() { @@ -44,7 +41,7 @@ public String name() { @Override public void initialize(ServiceExtensionContext context) { - var controller = new IssuerCredentialsAdminApiController(statusListService, credentialService); + var controller = new IssuerCredentialsAdminApiController(statusListService); webService.registerResource(IdentityHubApiContext.ISSUERADMIN, controller); } } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java index cead224f8..0af6dadf5 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java @@ -25,7 +25,6 @@ import org.eclipse.edc.identityhub.api.Versions; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.CredentialStatusResponse; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialDto; -import org.eclipse.edc.issuerservice.spi.CredentialService; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; import org.eclipse.edc.spi.query.QuerySpec; @@ -39,18 +38,16 @@ @Path(Versions.UNSTABLE + "/credentials") public class IssuerCredentialsAdminApiController implements IssuerCredentialsAdminApi { private final StatusListService statuslistService; - private final CredentialService credentialService; - public IssuerCredentialsAdminApiController(StatusListService statuslistService, CredentialService credentialService) { + public IssuerCredentialsAdminApiController(StatusListService statuslistService) { this.statuslistService = statuslistService; - this.credentialService = credentialService; } @GET @Path("/{participantId}") @Override public Collection getAllCredentials(@PathParam("participantId") String participantId) { - return credentialService.getForParticipant(participantId) + return statuslistService.getCredentialForParticipant(participantId) .map(coll -> coll.stream().map(resource -> new VerifiableCredentialDto(resource.getVerifiableCredential().format(), resource.getVerifiableCredential().credential())).toList()) .orElseThrow(exceptionMapper(VerifiableCredential.class, participantId)); @@ -60,7 +57,7 @@ public Collection getAllCredentials(@PathParam("partici @Path("/query") @Override public Collection queryCredentials(QuerySpec query) { - return credentialService.query(query).map(coll -> coll.stream().map(resource -> + return statuslistService.queryCredentials(query).map(coll -> coll.stream().map(resource -> new VerifiableCredentialDto(resource.getVerifiableCredential().format(), resource.getVerifiableCredential().credential())).toList()) .orElseThrow(exceptionMapper(VerifiableCredential.class, null)); } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java b/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java index 93c908e0f..6f13de18a 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java @@ -24,7 +24,6 @@ import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VcStatus; import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialDto; -import org.eclipse.edc.issuerservice.spi.CredentialService; import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.result.ServiceResult; @@ -52,12 +51,11 @@ class IssuerCredentialsAdminApiControllerTest extends RestControllerTestBase { private final StatusListService statuslistService = mock(); - private final CredentialService credentialService = mock(); @Test void getAllCredentials() { - when(credentialService.getForParticipant(eq("test-participant"))) + when(statuslistService.getCredentialForParticipant(eq("test-participant"))) .thenReturn(ServiceResult.success(List.of(createCredential(), createCredential()))); var credentials = baseRequest() .get("/test-participant") @@ -66,12 +64,11 @@ void getAllCredentials() { .extract().body().as(VerifiableCredentialDto[].class); assertThat(credentials).hasSize(2); - verifyNoInteractions(statuslistService); } @Test void getAllCredentials_whenNoResult() { - when(credentialService.getForParticipant(eq("test-participant"))) + when(statuslistService.getCredentialForParticipant(eq("test-participant"))) .thenReturn(ServiceResult.success(List.of())); var credentials = baseRequest() .get("/test-participant") @@ -80,12 +77,11 @@ void getAllCredentials_whenNoResult() { .extract().body().as(VerifiableCredentialDto[].class); assertThat(credentials).isEmpty(); - verifyNoInteractions(statuslistService); } @Test void queryCredentials() { - when(credentialService.query(any(QuerySpec.class))) + when(statuslistService.queryCredentials(any(QuerySpec.class))) .thenReturn(ServiceResult.success(List.of(createCredential(), createCredential()))); var credentials = baseRequest() @@ -96,13 +92,12 @@ void queryCredentials() { .extract().body().as(VerifiableCredentialDto[].class); assertThat(credentials).hasSize(2); - verifyNoInteractions(statuslistService); } @Test void queryCredentials_whenNoResult() { - when(credentialService.query(any(QuerySpec.class))) + when(statuslistService.queryCredentials(any(QuerySpec.class))) .thenReturn(ServiceResult.success(Collections.emptyList())); var credentials = baseRequest() @@ -113,7 +108,6 @@ void queryCredentials_whenNoResult() { .extract().body().as(VerifiableCredentialDto[].class); assertThat(credentials).isEmpty(); - verifyNoInteractions(statuslistService); } @Test @@ -147,7 +141,7 @@ void suspendCredential() { .post("/test-credential-id/suspend") .then() .statusCode(501); - verifyNoInteractions(credentialService, statuslistService); + verifyNoInteractions(statuslistService); } @Test @@ -156,7 +150,7 @@ void resumeCredential() { .post("/test-credential-id/resume") .then() .statusCode(501); - verifyNoInteractions(credentialService, statuslistService); + verifyNoInteractions(statuslistService); } @Test @@ -168,7 +162,6 @@ void checkRevocationStatus_whenNotRevoked() { .then() .statusCode(200) .body(matchesRegex(".*\"status\":.*null.*")); - verifyNoInteractions(credentialService); } @Test @@ -181,7 +174,6 @@ void checkRevocationStatus_whenRevoked() { .then() .statusCode(200) .body(matchesRegex(".*\"status\":.*\"revocation\".*")); - verifyNoInteractions(credentialService); } @Test @@ -195,12 +187,11 @@ void checkRevocationStatus_whenNotFound() { .statusCode(404) .body(notNullValue()); - verifyNoInteractions(credentialService); } @Override protected Object controller() { - return new IssuerCredentialsAdminApiController(statuslistService, credentialService); + return new IssuerCredentialsAdminApiController(statuslistService); } private @NotNull VerifiableCredentialResource createCredential() { diff --git a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/CredentialService.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/CredentialService.java deleted file mode 100644 index 8f49d4350..000000000 --- a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/CredentialService.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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.spi; - -import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; -import org.eclipse.edc.spi.query.QuerySpec; -import org.eclipse.edc.spi.result.ServiceResult; - -import java.util.Collection; - -public interface CredentialService { - ServiceResult> getForParticipant(String participantId); - - ServiceResult> query(QuerySpec query); -} diff --git a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java index aee10839d..d5bd4bed8 100644 --- a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java +++ b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java @@ -14,9 +14,13 @@ package org.eclipse.edc.issuerservice.spi.statuslist; +import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; +import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.result.ServiceResult; import org.jetbrains.annotations.Nullable; +import java.util.Collection; + /** * Service to revoke, suspend, resume and query the status of VerifiableCredentials. This is agnostic of the status list * implementation, as it delegates down to {@link StatusListInfo} objects that handle the concrete status list implementation. @@ -67,4 +71,8 @@ public interface StatusListService { * @return A string containing the credential status, null if the status is not set, or a failure to indicate an error. */ ServiceResult getCredentialStatus(String credentialId); + + ServiceResult> getCredentialForParticipant(String participantId); + + ServiceResult> queryCredentials(QuerySpec query); } From e8d2c3e29062b36733fb46ef879de4abcd3b6a30 Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger Date: Fri, 7 Feb 2025 07:51:57 +0100 Subject: [PATCH 4/8] refactoring --- .../CredentialServiceExtension.java} | 19 +++++++-------- .../CredentialServiceImpl.java} | 12 +++++----- .../StatusListInfoFactoryRegistryImpl.java | 6 ++--- .../bitstring/BitstringStatusInfo.java | 4 ++-- .../bitstring/BitstringStatusListFactory.java | 6 ++--- ...rg.eclipse.edc.spi.system.ServiceExtension | 2 +- .../CredentialServiceImplTest.java} | 23 ++++++++++--------- .../statuslist/TestData.java | 2 +- .../BitstringStatusListFactoryTest.java | 2 +- .../IssuerCredentialsAdminApiExtension.java | 6 ++--- .../IssuerCredentialsAdminApiController.java | 6 ++--- ...suerCredentialsAdminApiControllerTest.java | 4 ++-- .../resources/issuer-admin-api-version.json | 2 +- .../dcp/issuer/IssuerApiExtension.java | 18 +++++++-------- .../CredentialService.java} | 5 ++-- .../statuslist/StatusListInfo.java | 2 +- .../statuslist/StatusListInfoFactory.java | 2 +- .../StatusListInfoFactoryRegistry.java | 2 +- 18 files changed, 63 insertions(+), 60 deletions(-) rename core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/{statuslist/StatusListServiceExtension.java => credentials/CredentialServiceExtension.java} (74%) rename core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/{statuslist/StatusListServiceImpl.java => credentials/CredentialServiceImpl.java} (95%) rename core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/{ => credentials}/statuslist/StatusListInfoFactoryRegistryImpl.java (77%) rename core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/{ => credentials}/statuslist/bitstring/BitstringStatusInfo.java (96%) rename core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/{ => credentials}/statuslist/bitstring/BitstringStatusListFactory.java (91%) rename core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/{statuslist/StatusListServiceImplTest.java => credentials/CredentialServiceImplTest.java} (94%) rename core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/{ => credentials}/statuslist/TestData.java (99%) rename core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/{ => credentials}/statuslist/bitstring/BitstringStatusListFactoryTest.java (97%) rename spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/{statuslist/StatusListService.java => credentials/CredentialService.java} (95%) rename spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/{ => credentials}/statuslist/StatusListInfo.java (94%) rename spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/{ => credentials}/statuslist/StatusListInfoFactory.java (94%) rename spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/{ => credentials}/statuslist/StatusListInfoFactoryRegistry.java (95%) diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java similarity index 74% rename from core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java index 45d1d3652..d994ee785 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceExtension.java +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java @@ -12,12 +12,13 @@ * */ -package org.eclipse.edc.issuerservice.statuslist; +package org.eclipse.edc.issuerservice.credentials; import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfoFactoryRegistry; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; -import org.eclipse.edc.issuerservice.statuslist.bitstring.BitstringStatusListFactory; +import org.eclipse.edc.issuerservice.credentials.statuslist.StatusListInfoFactoryRegistryImpl; +import org.eclipse.edc.issuerservice.credentials.statuslist.bitstring.BitstringStatusListFactory; +import org.eclipse.edc.issuerservice.spi.credentials.CredentialService; +import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfoFactoryRegistry; import org.eclipse.edc.jwt.signer.spi.JwsSignerProvider; import org.eclipse.edc.runtime.metamodel.annotation.Extension; import org.eclipse.edc.runtime.metamodel.annotation.Inject; @@ -29,12 +30,12 @@ import org.eclipse.edc.token.JwtGenerationService; import org.eclipse.edc.transaction.spi.TransactionContext; -import static org.eclipse.edc.issuerservice.statuslist.StatusListServiceExtension.NAME; +import static org.eclipse.edc.issuerservice.credentials.CredentialServiceExtension.NAME; import static org.eclipse.edc.spi.constants.CoreConstants.JSON_LD; @Extension(value = NAME) -public class StatusListServiceExtension implements ServiceExtension { - public static final String NAME = "Status List Service Extension"; +public class CredentialServiceExtension implements ServiceExtension { + public static final String NAME = "Issuer Service Credential Service Extension"; @Setting(description = "Alias for the private key that is intended for signing status list credentials", key = "edc.issuer.statuslist.signing.key.alias") private String privateKeyAlias; @@ -49,14 +50,14 @@ public class StatusListServiceExtension implements ServiceExtension { private StatusListInfoFactoryRegistry factory; @Provider - public StatusListService getStatusListService(ServiceExtensionContext context) { + public CredentialService getStatusListService(ServiceExtensionContext context) { var fact = getFactory(); // Bitstring StatusList is provided by default. others can be added via extensions fact.register("BitstringStatusListEntry", new BitstringStatusListFactory(store, typeManager.getMapper())); var tokenGenerationService = new JwtGenerationService(jwsSignerProvider); - return new StatusListServiceImpl(store, transactionContext, typeManager.getMapper(JSON_LD), context.getMonitor(), tokenGenerationService, + return new CredentialServiceImpl(store, transactionContext, typeManager.getMapper(JSON_LD), context.getMonitor(), tokenGenerationService, () -> privateKeyAlias, fact); } diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java similarity index 95% rename from core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java index 1fbc6d037..1d9d4b927 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImpl.java +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImpl.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.edc.issuerservice.statuslist; +package org.eclipse.edc.issuerservice.credentials; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -22,9 +22,9 @@ import org.eclipse.edc.identityhub.spi.participantcontext.model.IdentityResource; import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfo; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfoFactoryRegistry; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; +import org.eclipse.edc.issuerservice.spi.credentials.CredentialService; +import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfo; +import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfoFactoryRegistry; import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.result.ServiceResult; @@ -43,7 +43,7 @@ import static org.eclipse.edc.spi.result.ServiceResult.success; import static org.eclipse.edc.spi.result.ServiceResult.unexpected; -public class StatusListServiceImpl implements StatusListService { +public class CredentialServiceImpl implements CredentialService { public static final TypeReference> MAP_REF = new TypeReference<>() { }; private static final String REVOCATION = "revocation"; @@ -55,7 +55,7 @@ public class StatusListServiceImpl implements StatusListService { private final Supplier privateKeyAlias; private final StatusListInfoFactoryRegistry statusListInfoFactoryRegistry; - public StatusListServiceImpl(CredentialStore credentialStore, + public CredentialServiceImpl(CredentialStore credentialStore, TransactionContext transactionContext, ObjectMapper objectMapper, Monitor monitor, diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListInfoFactoryRegistryImpl.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/StatusListInfoFactoryRegistryImpl.java similarity index 77% rename from core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListInfoFactoryRegistryImpl.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/StatusListInfoFactoryRegistryImpl.java index 67802a91d..6361b8fcb 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/StatusListInfoFactoryRegistryImpl.java +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/StatusListInfoFactoryRegistryImpl.java @@ -12,10 +12,10 @@ * */ -package org.eclipse.edc.issuerservice.statuslist; +package org.eclipse.edc.issuerservice.credentials.statuslist; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfoFactory; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfoFactoryRegistry; +import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfoFactory; +import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfoFactoryRegistry; import java.util.HashMap; import java.util.Map; diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusInfo.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusInfo.java similarity index 96% rename from core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusInfo.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusInfo.java index 3f5b25708..7f69c34cf 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusInfo.java +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusInfo.java @@ -12,12 +12,12 @@ * */ -package org.eclipse.edc.issuerservice.statuslist.bitstring; +package org.eclipse.edc.issuerservice.credentials.statuslist.bitstring; import org.eclipse.edc.iam.verifiablecredentials.spi.model.revocation.BitString; import org.eclipse.edc.iam.verifiablecredentials.spi.model.revocation.bitstringstatuslist.BitstringStatusListCredential; import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfo; +import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfo; import org.eclipse.edc.spi.result.Result; import java.util.Base64; diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactory.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactory.java similarity index 91% rename from core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactory.java rename to core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactory.java index f26e962d5..162a55dd2 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactory.java +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactory.java @@ -12,13 +12,13 @@ * */ -package org.eclipse.edc.issuerservice.statuslist.bitstring; +package org.eclipse.edc.issuerservice.credentials.statuslist.bitstring; import com.fasterxml.jackson.databind.ObjectMapper; import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialStatus; import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfo; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListInfoFactory; +import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfo; +import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfoFactory; import org.eclipse.edc.spi.result.ServiceResult; import static org.eclipse.edc.iam.verifiablecredentials.spi.VcConstants.BITSTRING_STATUS_LIST_PREFIX; diff --git a/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension index 3b243be81..315f51e9d 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ b/core/issuerservice/issuerservice-credentials/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -11,4 +11,4 @@ # Cofinity-X - initial API and implementation # # -org.eclipse.edc.issuerservice.statuslist.StatusListServiceExtension \ No newline at end of file +org.eclipse.edc.issuerservice.credentials.CredentialServiceExtension \ No newline at end of file diff --git a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImplTest.java b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImplTest.java similarity index 94% rename from core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImplTest.java rename to core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImplTest.java index 28dd005d8..16a3e9753 100644 --- a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/StatusListServiceImplTest.java +++ b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImplTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.edc.issuerservice.statuslist; +package org.eclipse.edc.issuerservice.credentials; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -33,7 +33,8 @@ import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VcStatus; import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; -import org.eclipse.edc.issuerservice.statuslist.bitstring.BitstringStatusListFactory; +import org.eclipse.edc.issuerservice.credentials.statuslist.StatusListInfoFactoryRegistryImpl; +import org.eclipse.edc.issuerservice.credentials.statuslist.bitstring.BitstringStatusListFactory; import org.eclipse.edc.json.JacksonTypeManager; import org.eclipse.edc.spi.iam.TokenRepresentation; import org.eclipse.edc.spi.monitor.Monitor; @@ -51,12 +52,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.eclipse.edc.issuerservice.statuslist.TestData.EXAMPLE_CREDENTIAL; -import static org.eclipse.edc.issuerservice.statuslist.TestData.EXAMPLE_CREDENTIAL_JWT; -import static org.eclipse.edc.issuerservice.statuslist.TestData.EXAMPLE_REVOCATION_CREDENTIAL; -import static org.eclipse.edc.issuerservice.statuslist.TestData.EXAMPLE_REVOCATION_CREDENTIAL_JWT; -import static org.eclipse.edc.issuerservice.statuslist.TestData.EXAMPLE_REVOCATION_CREDENTIAL_JWT_WITH_STATUS_BIT_SET; -import static org.eclipse.edc.issuerservice.statuslist.TestData.EXAMPLE_REVOCATION_CREDENTIAL_WITH_STATUS_BIT_SET; +import static org.eclipse.edc.issuerservice.credentials.statuslist.TestData.EXAMPLE_CREDENTIAL; +import static org.eclipse.edc.issuerservice.credentials.statuslist.TestData.EXAMPLE_CREDENTIAL_JWT; +import static org.eclipse.edc.issuerservice.credentials.statuslist.TestData.EXAMPLE_REVOCATION_CREDENTIAL; +import static org.eclipse.edc.issuerservice.credentials.statuslist.TestData.EXAMPLE_REVOCATION_CREDENTIAL_JWT; +import static org.eclipse.edc.issuerservice.credentials.statuslist.TestData.EXAMPLE_REVOCATION_CREDENTIAL_JWT_WITH_STATUS_BIT_SET; +import static org.eclipse.edc.issuerservice.credentials.statuslist.TestData.EXAMPLE_REVOCATION_CREDENTIAL_WITH_STATUS_BIT_SET; import static org.eclipse.edc.junit.assertions.AbstractResultAssert.assertThat; import static org.eclipse.edc.spi.result.ServiceFailure.Reason.BAD_REQUEST; import static org.eclipse.edc.spi.result.ServiceFailure.Reason.NOT_FOUND; @@ -73,7 +74,7 @@ import static org.mockito.Mockito.when; @SuppressWarnings("unchecked") -class StatusListServiceImplTest { +class CredentialServiceImplTest { public static final TypeReference> MAP_REF = new TypeReference<>() { }; @@ -83,7 +84,7 @@ class StatusListServiceImplTest { .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); private final CredentialStore credentialStore = mock(); - private StatusListServiceImpl revocationService; + private CredentialServiceImpl revocationService; private TokenGenerationService tokenGenerationService; private Monitor monitor; private ECKey signingKey; @@ -96,7 +97,7 @@ void setUp() throws JOSEException { monitor = mock(); var reg = new StatusListInfoFactoryRegistryImpl(); reg.register("BitstringStatusListEntry", new BitstringStatusListFactory(credentialStore, objectMapper)); - revocationService = new StatusListServiceImpl(credentialStore, new NoopTransactionContext(), objectMapper, + revocationService = new CredentialServiceImpl(credentialStore, new NoopTransactionContext(), objectMapper, monitor, tokenGenerationService, () -> "some-private-key", reg); } diff --git a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/TestData.java b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/TestData.java similarity index 99% rename from core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/TestData.java rename to core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/TestData.java index 60a699807..fdd1fd9f0 100644 --- a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/TestData.java +++ b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/TestData.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.edc.issuerservice.statuslist; +package org.eclipse.edc.issuerservice.credentials.statuslist; public class TestData { public static final String EXAMPLE_CREDENTIAL = """ diff --git a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactoryTest.java b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactoryTest.java similarity index 97% rename from core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactoryTest.java rename to core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactoryTest.java index f22917f2e..64cd91892 100644 --- a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/statuslist/bitstring/BitstringStatusListFactoryTest.java +++ b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactoryTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.edc.issuerservice.statuslist.bitstring; +package org.eclipse.edc.issuerservice.credentials.statuslist.bitstring; import com.fasterxml.jackson.databind.ObjectMapper; import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialStatus; diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java index 562bfa566..86b1b239f 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/IssuerCredentialsAdminApiExtension.java @@ -16,7 +16,7 @@ import org.eclipse.edc.identityhub.spi.webcontext.IdentityHubApiContext; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.IssuerCredentialsAdminApiController; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; +import org.eclipse.edc.issuerservice.spi.credentials.CredentialService; import org.eclipse.edc.runtime.metamodel.annotation.Extension; import org.eclipse.edc.runtime.metamodel.annotation.Inject; import org.eclipse.edc.spi.system.ServiceExtension; @@ -32,7 +32,7 @@ public class IssuerCredentialsAdminApiExtension implements ServiceExtension { @Inject private WebService webService; @Inject - private StatusListService statusListService; + private CredentialService credentialService; @Override public String name() { @@ -41,7 +41,7 @@ public String name() { @Override public void initialize(ServiceExtensionContext context) { - var controller = new IssuerCredentialsAdminApiController(statusListService); + var controller = new IssuerCredentialsAdminApiController(credentialService); webService.registerResource(IdentityHubApiContext.ISSUERADMIN, controller); } } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java index 0af6dadf5..5f83d1c4d 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/main/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiController.java @@ -25,7 +25,7 @@ import org.eclipse.edc.identityhub.api.Versions; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.CredentialStatusResponse; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialDto; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; +import org.eclipse.edc.issuerservice.spi.credentials.CredentialService; import org.eclipse.edc.spi.query.QuerySpec; import java.util.Collection; @@ -37,9 +37,9 @@ @Produces(APPLICATION_JSON) @Path(Versions.UNSTABLE + "/credentials") public class IssuerCredentialsAdminApiController implements IssuerCredentialsAdminApi { - private final StatusListService statuslistService; + private final CredentialService statuslistService; - public IssuerCredentialsAdminApiController(StatusListService statuslistService) { + public IssuerCredentialsAdminApiController(CredentialService statuslistService) { this.statuslistService = statuslistService; } diff --git a/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java b/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java index 6f13de18a..80a9ea32d 100644 --- a/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java +++ b/extensions/api/issuer-admin-api/credentials-api/src/test/java/org/eclipse/edc/issuerservice/api/admin/credentials/v1/unstable/IssuerCredentialsAdminApiControllerTest.java @@ -24,7 +24,7 @@ import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VcStatus; import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; import org.eclipse.edc.issuerservice.api.admin.credentials.v1.unstable.model.VerifiableCredentialDto; -import org.eclipse.edc.issuerservice.spi.statuslist.StatusListService; +import org.eclipse.edc.issuerservice.spi.credentials.CredentialService; import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.result.ServiceResult; import org.eclipse.edc.web.jersey.testfixtures.RestControllerTestBase; @@ -50,7 +50,7 @@ class IssuerCredentialsAdminApiControllerTest extends RestControllerTestBase { - private final StatusListService statuslistService = mock(); + private final CredentialService statuslistService = mock(); @Test void getAllCredentials() { diff --git a/extensions/api/issuer-admin-api/issuer-admin-api-configuration/src/main/resources/issuer-admin-api-version.json b/extensions/api/issuer-admin-api/issuer-admin-api-configuration/src/main/resources/issuer-admin-api-version.json index 4960433c7..25330b821 100644 --- a/extensions/api/issuer-admin-api/issuer-admin-api-configuration/src/main/resources/issuer-admin-api-version.json +++ b/extensions/api/issuer-admin-api/issuer-admin-api-configuration/src/main/resources/issuer-admin-api-version.json @@ -2,7 +2,7 @@ { "version": "1.0.0-alpha", "urlPath": "/v1alpha", - "lastUpdated": "2025-02-06T10:00:00Z", + "lastUpdated": "2025-02-07T10:00:00Z", "maturity": null } ] diff --git a/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/java/org/eclipse/edc/identityhub/protocols/dcp/issuer/IssuerApiExtension.java b/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/java/org/eclipse/edc/identityhub/protocols/dcp/issuer/IssuerApiExtension.java index 504886fc6..1e3b2b145 100644 --- a/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/java/org/eclipse/edc/identityhub/protocols/dcp/issuer/IssuerApiExtension.java +++ b/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/java/org/eclipse/edc/identityhub/protocols/dcp/issuer/IssuerApiExtension.java @@ -49,7 +49,7 @@ import static org.eclipse.edc.iam.identitytrust.spi.DcpConstants.DSPACE_DCP_V_1_0_CONTEXT; import static org.eclipse.edc.identityhub.protocols.dcp.issuer.IssuerApiExtension.NAME; import static org.eclipse.edc.identityhub.protocols.dcp.spi.DcpConstants.DCP_SCOPE_V_1_0; -import static org.eclipse.edc.identityhub.spi.webcontext.IdentityHubApiContext.ISSUER_API; +import static org.eclipse.edc.identityhub.spi.webcontext.IdentityHubApiContext.ISSUANCE_API; import static org.eclipse.edc.spi.constants.CoreConstants.JSON_LD; @Extension(value = NAME) @@ -79,18 +79,18 @@ public class IssuerApiExtension implements ServiceExtension { @Override public void initialize(ServiceExtensionContext context) { - portMappingRegistry.register(new PortMapping(ISSUER_API, apiConfiguration.port(), apiConfiguration.path())); + portMappingRegistry.register(new PortMapping(ISSUANCE_API, apiConfiguration.port(), apiConfiguration.path())); var dcpRegistry = transformerRegistry.forContext(DCP_SCOPE_V_1_0); registerTransformers(dcpRegistry, DSPACE_DCP_NAMESPACE_V_1_0); - webService.registerResource(ISSUER_API, new CredentialRequestApiController(dcpRegistry)); - webService.registerResource(ISSUER_API, new CredentialRequestStatusApiController(dcpRegistry)); - webService.registerResource(ISSUER_API, new IssuerMetadataApiController(dcpRegistry)); + webService.registerResource(ISSUANCE_API, new CredentialRequestApiController(dcpRegistry)); + webService.registerResource(ISSUANCE_API, new CredentialRequestStatusApiController(dcpRegistry)); + webService.registerResource(ISSUANCE_API, new IssuerMetadataApiController(dcpRegistry)); - webService.registerResource(ISSUER_API, new ObjectMapperProvider(typeManager, JSON_LD)); - webService.registerResource(ISSUER_API, new JerseyJsonLdInterceptor(jsonLd, typeManager, JSON_LD, DCP_SCOPE_V_1_0)); + webService.registerResource(ISSUANCE_API, new ObjectMapperProvider(typeManager, JSON_LD)); + webService.registerResource(ISSUANCE_API, new JerseyJsonLdInterceptor(jsonLd, typeManager, JSON_LD, DCP_SCOPE_V_1_0)); jsonLd.registerContext(DSPACE_DCP_V_1_0_CONTEXT, DCP_SCOPE_V_1_0); @@ -124,9 +124,9 @@ private void registerVersionInfo(ClassLoader resourceClassLoader) { @Settings record CredentialRequestApiConfiguration( - @Setting(key = "web.http." + ISSUER_API + ".port", description = "Port for " + ISSUER_API + " api context", defaultValue = 13132 + "") + @Setting(key = "web.http." + ISSUANCE_API + ".port", description = "Port for " + ISSUANCE_API + " api context", defaultValue = 13132 + "") int port, - @Setting(key = "web.http." + ISSUER_API + ".path", description = "Path for " + ISSUER_API + " api context", defaultValue = "/api/issuer") + @Setting(key = "web.http." + ISSUANCE_API + ".path", description = "Path for " + ISSUANCE_API + " api context", defaultValue = "/api/issuer") String path ) { diff --git a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/CredentialService.java similarity index 95% rename from spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java rename to spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/CredentialService.java index d5bd4bed8..c410fc757 100644 --- a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListService.java +++ b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/CredentialService.java @@ -12,9 +12,10 @@ * */ -package org.eclipse.edc.issuerservice.spi.statuslist; +package org.eclipse.edc.issuerservice.spi.credentials; import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; +import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfo; import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.result.ServiceResult; import org.jetbrains.annotations.Nullable; @@ -26,7 +27,7 @@ * implementation, as it delegates down to {@link StatusListInfo} objects that handle the concrete status list implementation. * This service handles various operations on a high level. */ -public interface StatusListService { +public interface CredentialService { /** * Revokes a credential by adding its ID to the revocation list credential. Implementations may choose to also track diff --git a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfo.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/statuslist/StatusListInfo.java similarity index 94% rename from spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfo.java rename to spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/statuslist/StatusListInfo.java index 1c55f5016..7b8bda67e 100644 --- a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfo.java +++ b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/statuslist/StatusListInfo.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.edc.issuerservice.spi.statuslist; +package org.eclipse.edc.issuerservice.spi.credentials.statuslist; import org.eclipse.edc.identityhub.spi.verifiablecredentials.model.VerifiableCredentialResource; import org.eclipse.edc.spi.result.Result; diff --git a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactory.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/statuslist/StatusListInfoFactory.java similarity index 94% rename from spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactory.java rename to spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/statuslist/StatusListInfoFactory.java index 56eeeed7e..0c9e7612a 100644 --- a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactory.java +++ b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/statuslist/StatusListInfoFactory.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.edc.issuerservice.spi.statuslist; +package org.eclipse.edc.issuerservice.spi.credentials.statuslist; import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialStatus; import org.eclipse.edc.spi.result.ServiceResult; diff --git a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactoryRegistry.java b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/statuslist/StatusListInfoFactoryRegistry.java similarity index 95% rename from spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactoryRegistry.java rename to spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/statuslist/StatusListInfoFactoryRegistry.java index 657cb887b..4a64f104e 100644 --- a/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/statuslist/StatusListInfoFactoryRegistry.java +++ b/spi/issuerservice/issuerservice-credential-spi/src/main/java/org/eclipse/edc/issuerservice/spi/credentials/statuslist/StatusListInfoFactoryRegistry.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.edc.issuerservice.spi.statuslist; +package org.eclipse.edc.issuerservice.spi.credentials.statuslist; /** * Maintains specific implementations for statuslist factories. From 30ac00db74da6d6e346a7d505f27107dd2a944cf Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger Date: Fri, 7 Feb 2025 08:11:39 +0100 Subject: [PATCH 5/8] fix api paths --- .../src/test/java/org/eclipse/edc/test/bom/BomSmokeTests.java | 3 +-- .../identityhub/protocols/dcp/issuer/IssuerApiExtension.java | 2 +- .../edc/identityhub/spi/webcontext/IdentityHubApiContext.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/e2e-tests/bom-tests/src/test/java/org/eclipse/edc/test/bom/BomSmokeTests.java b/e2e-tests/bom-tests/src/test/java/org/eclipse/edc/test/bom/BomSmokeTests.java index 51289daf0..ebd5783bf 100644 --- a/e2e-tests/bom-tests/src/test/java/org/eclipse/edc/test/bom/BomSmokeTests.java +++ b/e2e-tests/bom-tests/src/test/java/org/eclipse/edc/test/bom/BomSmokeTests.java @@ -125,8 +125,7 @@ class IssuerService extends SmokeTest { put("web.http.version.path", "/api/version"); put("web.http.did.port", valueOf(getFreePort())); put("web.http.did.path", "/api/did"); - put("web.http.issuer-api.port", valueOf(getFreePort())); - put("web.http.issuer-api.path", "/api/issuer"); + put("web.http.issuance.port", valueOf(getFreePort())); put("edc.sts.account.api.url", "https://sts.com/accounts"); put("edc.sts.accounts.api.auth.header.value", "password"); put("edc.issuer.statuslist.signing.key.alias", "signing-key"); diff --git a/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/java/org/eclipse/edc/identityhub/protocols/dcp/issuer/IssuerApiExtension.java b/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/java/org/eclipse/edc/identityhub/protocols/dcp/issuer/IssuerApiExtension.java index 1e3b2b145..0f8d712e4 100644 --- a/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/java/org/eclipse/edc/identityhub/protocols/dcp/issuer/IssuerApiExtension.java +++ b/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/java/org/eclipse/edc/identityhub/protocols/dcp/issuer/IssuerApiExtension.java @@ -126,7 +126,7 @@ private void registerVersionInfo(ClassLoader resourceClassLoader) { record CredentialRequestApiConfiguration( @Setting(key = "web.http." + ISSUANCE_API + ".port", description = "Port for " + ISSUANCE_API + " api context", defaultValue = 13132 + "") int port, - @Setting(key = "web.http." + ISSUANCE_API + ".path", description = "Path for " + ISSUANCE_API + " api context", defaultValue = "/api/issuer") + @Setting(key = "web.http." + ISSUANCE_API + ".path", description = "Path for " + ISSUANCE_API + " api context", defaultValue = "/api/issuance") String path ) { diff --git a/spi/identity-hub-spi/src/main/java/org/eclipse/edc/identityhub/spi/webcontext/IdentityHubApiContext.java b/spi/identity-hub-spi/src/main/java/org/eclipse/edc/identityhub/spi/webcontext/IdentityHubApiContext.java index 60ba1c6fc..eede2e3a1 100644 --- a/spi/identity-hub-spi/src/main/java/org/eclipse/edc/identityhub/spi/webcontext/IdentityHubApiContext.java +++ b/spi/identity-hub-spi/src/main/java/org/eclipse/edc/identityhub/spi/webcontext/IdentityHubApiContext.java @@ -18,7 +18,7 @@ public interface IdentityHubApiContext { String IDENTITY = "identity"; String IH_DID = "did"; String PRESENTATION = "presentation"; - String ISSUANCE_API = "issuance-api"; + String ISSUANCE_API = "issuance"; @Deprecated(since = "0.9.0") String RESOLUTION = "resolution"; String ISSUERADMIN = "issueradmin"; From 99e2671e88663ace27dbfce691b4f1960bc95893 Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger Date: Fri, 7 Feb 2025 08:17:53 +0100 Subject: [PATCH 6/8] fix launcher test --- .github/workflows/verify.yaml | 1 + .../dcp-issuer-api/src/main/resources/issuer-api-version.json | 2 +- resources/openapi/issuer-api.version | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 07120943f..48dfcd2b9 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -79,6 +79,7 @@ jobs: docker run -d --rm --name issuer-service \ -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" \ issuer-service:latest - name: 'Wait for Issuer-Service to be healthy' diff --git a/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/resources/issuer-api-version.json b/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/resources/issuer-api-version.json index 29e73c830..30622a4ff 100644 --- a/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/resources/issuer-api-version.json +++ b/extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/resources/issuer-api-version.json @@ -2,7 +2,7 @@ { "version": "1.0.0", "urlPath": "/v1alpha", - "lastUpdated": "2025-02-05T12:00:00Z", + "lastUpdated": "2025-02-07T08:00:00Z", "maturity": null } ] \ No newline at end of file diff --git a/resources/openapi/issuer-api.version b/resources/openapi/issuer-api.version index d1fae9b90..74243bcb1 100644 --- a/resources/openapi/issuer-api.version +++ b/resources/openapi/issuer-api.version @@ -1 +1 @@ -extensions/protocols/dcp/issuer-api/src/main/resources/issuer-api-version.json \ No newline at end of file +extensions/protocols/dcp/dcp-issuer/dcp-issuer-api/src/main/resources/issuer-api-version.json \ No newline at end of file From 96164847eaf718e93f1a5004c4625a51166afe11 Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger Date: Fri, 7 Feb 2025 09:04:08 +0100 Subject: [PATCH 7/8] cleanup --- build.gradle.kts | 1 + .../credentials/CredentialServiceExtension.java | 4 +++- .../statuslist/bitstring/BitstringStatusListFactory.java | 5 +---- .../issuerservice/credentials/CredentialServiceImplTest.java | 2 +- .../statuslist/bitstring/BitstringStatusListFactoryTest.java | 4 +--- .../edc/identityhub/tests/CredentialApiEndToEndTest.java | 1 - 6 files changed, 7 insertions(+), 10 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d898f7623..f2b51e451 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,6 +14,7 @@ plugins { `java-library` + } val edcScmConnection: String by project diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java index d994ee785..804f92df0 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceExtension.java @@ -36,6 +36,7 @@ @Extension(value = NAME) public class CredentialServiceExtension implements ServiceExtension { public static final String NAME = "Issuer Service Credential Service Extension"; + public static final String BITSTRING_STATUS_LIST_ENTRY = "BitstringStatusListEntry"; @Setting(description = "Alias for the private key that is intended for signing status list credentials", key = "edc.issuer.statuslist.signing.key.alias") private String privateKeyAlias; @@ -47,6 +48,7 @@ public class CredentialServiceExtension implements ServiceExtension { private TypeManager typeManager; @Inject private JwsSignerProvider jwsSignerProvider; + private StatusListInfoFactoryRegistry factory; @Provider @@ -54,7 +56,7 @@ public CredentialService getStatusListService(ServiceExtensionContext context) { var fact = getFactory(); // Bitstring StatusList is provided by default. others can be added via extensions - fact.register("BitstringStatusListEntry", new BitstringStatusListFactory(store, typeManager.getMapper())); + fact.register(BITSTRING_STATUS_LIST_ENTRY, new BitstringStatusListFactory(store)); var tokenGenerationService = new JwtGenerationService(jwsSignerProvider); return new CredentialServiceImpl(store, transactionContext, typeManager.getMapper(JSON_LD), context.getMonitor(), tokenGenerationService, diff --git a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactory.java b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactory.java index 162a55dd2..3f119a2b2 100644 --- a/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactory.java +++ b/core/issuerservice/issuerservice-credentials/src/main/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactory.java @@ -14,7 +14,6 @@ package org.eclipse.edc.issuerservice.credentials.statuslist.bitstring; -import com.fasterxml.jackson.databind.ObjectMapper; import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialStatus; import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; import org.eclipse.edc.issuerservice.spi.credentials.statuslist.StatusListInfo; @@ -28,11 +27,9 @@ public class BitstringStatusListFactory implements StatusListInfoFactory { private final CredentialStore credentialStore; - private final ObjectMapper objectMapper; - public BitstringStatusListFactory(CredentialStore credentialStore, ObjectMapper objectMapper) { + public BitstringStatusListFactory(CredentialStore credentialStore) { this.credentialStore = credentialStore; - this.objectMapper = objectMapper; } @Override diff --git a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImplTest.java b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImplTest.java index 16a3e9753..44d3e257e 100644 --- a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImplTest.java +++ b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/CredentialServiceImplTest.java @@ -96,7 +96,7 @@ void setUp() throws JOSEException { when(tokenGenerationService.generate(any(), any())).thenReturn(Result.success(TokenRepresentation.Builder.newInstance().token("new-token").build())); monitor = mock(); var reg = new StatusListInfoFactoryRegistryImpl(); - reg.register("BitstringStatusListEntry", new BitstringStatusListFactory(credentialStore, objectMapper)); + reg.register("BitstringStatusListEntry", new BitstringStatusListFactory(credentialStore)); revocationService = new CredentialServiceImpl(credentialStore, new NoopTransactionContext(), objectMapper, monitor, tokenGenerationService, () -> "some-private-key", reg); } diff --git a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactoryTest.java b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactoryTest.java index 64cd91892..93655a21e 100644 --- a/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactoryTest.java +++ b/core/issuerservice/issuerservice-credentials/src/test/java/org/eclipse/edc/issuerservice/credentials/statuslist/bitstring/BitstringStatusListFactoryTest.java @@ -14,7 +14,6 @@ package org.eclipse.edc.issuerservice.credentials.statuslist.bitstring; -import com.fasterxml.jackson.databind.ObjectMapper; import org.eclipse.edc.iam.verifiablecredentials.spi.model.CredentialStatus; import org.eclipse.edc.identityhub.spi.verifiablecredentials.store.CredentialStore; import org.eclipse.edc.spi.result.StoreResult; @@ -31,8 +30,7 @@ class BitstringStatusListFactoryTest { private final CredentialStore credentialStore = mock(); - private final ObjectMapper objectMapper = new ObjectMapper(); - private final BitstringStatusListFactory factory = new BitstringStatusListFactory(credentialStore, objectMapper); + private final BitstringStatusListFactory factory = new BitstringStatusListFactory(credentialStore); @Test diff --git a/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java index 3605ab0c1..bdfd27a09 100644 --- a/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java +++ b/e2e-tests/admin-api-tests/src/test/java/org/eclipse/edc/identityhub/tests/CredentialApiEndToEndTest.java @@ -173,7 +173,6 @@ void revoke_whenCredentialNotFound(IssuerServiceEndToEndTestContext context, Cre var res = createRevocationCredential(EXAMPLE_REVOCATION_CREDENTIAL_WITH_STATUS_BIT_SET, EXAMPLE_REVOCATION_CREDENTIAL_JWT_WITH_STATUS_BIT_SET); // track the original bitstring - var originalBitstring = res.getVerifiableCredential().credential().getCredentialSubject().get(0).getClaim("", "encodedList"); credentialStore.create(res).orElseThrow(f -> new RuntimeException("Failed to create credential: " + f.getFailureDetail())); // missing: creation of the holder credential From 7dbac7b5242b97dacf04386aec26a39e6b40960f Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger Date: Fri, 7 Feb 2025 10:22:57 +0100 Subject: [PATCH 8/8] removed commented deps --- e2e-tests/admin-api-tests/build.gradle.kts | 2 -- 1 file changed, 2 deletions(-) diff --git a/e2e-tests/admin-api-tests/build.gradle.kts b/e2e-tests/admin-api-tests/build.gradle.kts index 0d58f488c..4824480dd 100644 --- a/e2e-tests/admin-api-tests/build.gradle.kts +++ b/e2e-tests/admin-api-tests/build.gradle.kts @@ -35,8 +35,6 @@ dependencies { testImplementation(libs.edc.sts.spi) testImplementation(testFixtures(project(":e2e-tests:fixtures"))) -// testCompileOnly(project(":dist:bom:identityhub-with-sts-bom")) -// testCompileOnly(project(":dist:bom:identityhub-feature-sql-bom")) } edcBuild {