From 0513af99c7b58f51ad74131d2f8b7c877c4e12a2 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Thu, 27 Feb 2025 15:00:35 +0530 Subject: [PATCH 01/14] Added credential config request dto and add methods to service Signed-off-by: Piyush7034 --- .../dto/CredentialConfigurationRequest.java | 45 +++++++++++++++++++ .../certify/core/dto/CredentialDisplay.java | 22 +++++++++ .../certify/core/spi/VCIssuanceService.java | 1 + .../services/VCIssuanceServiceImpl.java | 15 ++++--- .../certify/TestVCIssuanceServiceImpl.java | 6 +++ .../controller/VCIssuanceControllerTest.java | 44 ++++++++++++++++++ 6 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java create mode 100644 certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplay.java diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java new file mode 100644 index 000000000..07f4380a5 --- /dev/null +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java @@ -0,0 +1,45 @@ +package io.mosip.certify.core.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.mosip.certify.core.constants.ErrorConstants; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class CredentialConfigurationRequest { + + @NotEmpty(message = ErrorConstants.INVALID_REQUEST) + private String vcTemplate; + + private List context; + + private List credentialType; + + private String credentialFormat; + + private String didUrl; + + @Valid + @NotNull(message = ErrorConstants.INVALID_REQUEST) + private CredentialDisplay display; + + private List order; + + private String scope; + + @JsonProperty("cryptographic_binding_methods_supported") + private List cryptographicBindingMethodsSupported; + + @JsonProperty("credential_signing_alg_values_supported") + private List credentialSigningAlgValuesSupported; + + @JsonProperty("proof_types_supported") + private Map proofTypesSupported; + + private List> pluginConfigurations; +} diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplay.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplay.java new file mode 100644 index 000000000..c765401d0 --- /dev/null +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplay.java @@ -0,0 +1,22 @@ +package io.mosip.certify.core.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.Map; + +@Data +public class CredentialDisplay { + + private String name; + + private String locale; + + private Map logo; + + @JsonProperty("background_color") + private String backgroundColor; + + @JsonProperty("text_color") + private String textColor; +} diff --git a/certify-core/src/main/java/io/mosip/certify/core/spi/VCIssuanceService.java b/certify-core/src/main/java/io/mosip/certify/core/spi/VCIssuanceService.java index c7fa28306..0858d30be 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/spi/VCIssuanceService.java +++ b/certify-core/src/main/java/io/mosip/certify/core/spi/VCIssuanceService.java @@ -5,6 +5,7 @@ */ package io.mosip.certify.core.spi; +import io.mosip.certify.core.dto.CredentialConfigurationRequest; import io.mosip.certify.core.dto.CredentialRequest; import io.mosip.certify.core.dto.CredentialResponse; diff --git a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java index 89eda48ab..2ea84373e 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java @@ -15,11 +15,7 @@ import io.mosip.certify.api.util.Action; import io.mosip.certify.api.util.ActionStatus; import io.mosip.certify.core.constants.VCFormats; -import io.mosip.certify.core.dto.CredentialMetadata; -import io.mosip.certify.core.dto.CredentialRequest; -import io.mosip.certify.core.dto.CredentialResponse; -import io.mosip.certify.core.dto.ParsedAccessToken; -import io.mosip.certify.core.dto.VCIssuanceTransaction; +import io.mosip.certify.core.dto.*; import io.mosip.certify.core.constants.Constants; import io.mosip.certify.core.constants.ErrorConstants; import io.mosip.certify.core.exception.CertifyException; @@ -135,6 +131,15 @@ public Map getDIDDocument() { throw new InvalidRequestException(ErrorConstants.UNSUPPORTED_IN_CURRENT_PLUGIN_MODE); } + @Override + public Map addCredentialConfiguration(CredentialConfigurationRequest credentialConfigurationRequest) { + Map configurationResponse = new HashMap<>(); + configurationResponse.put("id", "farmer-credential-config-001"); + configurationResponse.put("status", "active"); + + return configurationResponse; + } + private Map convertLatestToVd11(LinkedHashMap vciMetadata) { // Create a list to hold the transformed credentials List> credentialsList = new ArrayList<>(); diff --git a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java index db421af64..a1848ae42 100644 --- a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java +++ b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java @@ -1,6 +1,7 @@ package io.mosip.certify; import io.mosip.certify.core.constants.ErrorConstants; +import io.mosip.certify.core.dto.CredentialConfigurationRequest; import io.mosip.certify.core.dto.CredentialRequest; import io.mosip.certify.core.dto.CredentialResponse; import io.mosip.certify.core.exception.InvalidRequestException; @@ -31,4 +32,9 @@ public Map getCredentialIssuerMetadata(String version) { public Map getDIDDocument() { throw new InvalidRequestException(ErrorConstants.UNSUPPORTED_IN_CURRENT_PLUGIN_MODE); } + + @Override + public Map addCredentialConfiguration(CredentialConfigurationRequest credentialConfigurationRequest) { + return Map.of(); + } } diff --git a/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java index 1f64c5d17..649c80cde 100644 --- a/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java +++ b/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java @@ -1,5 +1,6 @@ package io.mosip.certify.controller; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import foundation.identity.jsonld.JsonLDObject; import io.mosip.certify.api.spi.AuditPlugin; @@ -18,8 +19,11 @@ import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; + +import java.lang.reflect.Array; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -251,4 +255,44 @@ public void getVerifiableCredential_vd12() throws Exception { .andExpect(jsonPath("$.format").exists()) .andExpect(jsonPath("$.credential").exists()); } + + @Test + public void addNewCredentialConfiguration_Success() throws Exception { + CredentialConfigurationRequest credentialConfigurationRequest = new CredentialConfigurationRequest(); + credentialConfigurationRequest.setVcTemplate("test_template"); + credentialConfigurationRequest.setContext(Arrays.asList("https://www.w3.org/2018/credentials/v1")); + credentialConfigurationRequest.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); + credentialConfigurationRequest.setCredentialFormat("ldp_vc"); + credentialConfigurationRequest.setDidUrl("did:web:test.github.io:test-env:test-folder"); + CredentialDisplay credentialDisplay = new CredentialDisplay(); + credentialDisplay.setName("Test Verifiable Credential"); + credentialDisplay.setLocale("en"); + credentialDisplay.setBackgroundColor("#FDFAF9"); + credentialDisplay.setTextColor("#7C4616"); + credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); + credentialConfigurationRequest.setDisplay(credentialDisplay); + credentialConfigurationRequest.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); + credentialConfigurationRequest.setScope("test_vc_ldp"); + credentialConfigurationRequest.setCryptographicBindingMethodsSupported(Arrays.asList("did:jwk")); + credentialConfigurationRequest.setCredentialSigningAlgValuesSupported(Arrays.asList("Ed25519Signature2020")); + Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); + credentialConfigurationRequest.setProofTypesSupported(Map.of("jwt", jwtValues)); + Map pluginConfigMap = new HashMap<>(); + pluginConfigMap.put("mosip.certify.mock.data-provider.test-one", "valueOne"); + pluginConfigMap.put("mosip.certify.mock.data-provider.test-two", "valueTwo"); + pluginConfigMap.put("mosip.certify.mock.data-provider.test-three", "valueThree"); + credentialConfigurationRequest.setPluginConfigurations(Arrays.asList(pluginConfigMap)); + + Map configurationResponse = new HashMap<>(); + configurationResponse.put("id", "farmer-credential-config-001"); + configurationResponse.put("status", "active"); + Mockito.when(vcIssuanceService.addCredentialConfiguration(credentialConfigurationRequest)).thenReturn(configurationResponse); + + mockMvc.perform(post("/issuance/credentials/configurations") + .content(objectMapper.writeValueAsBytes(credentialConfigurationRequest)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id").exists()) + .andExpect(jsonPath("$.status").exists()); + } } From 6d0e65112fbb9429854ec48e561946c1618b691e Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Mon, 3 Mar 2025 11:00:38 +0530 Subject: [PATCH 02/14] Added credential issuer metadata response dto and controller class Signed-off-by: Piyush7034 --- .../dto/CredentialConfigurationSupported.java | 31 +++++ .../core/dto/CredentialIssuerMetadata.java | 25 ++++ .../CredentialConfigController.java | 32 +++++ .../services/VCIssuanceServiceImpl.java | 5 + .../certify/TestVCIssuanceServiceImpl.java | 6 + .../CredentialConfigControllerTest.java | 126 ++++++++++++++++++ .../controller/VCIssuanceControllerTest.java | 40 ------ 7 files changed, 225 insertions(+), 40 deletions(-) create mode 100644 certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java create mode 100644 certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java create mode 100644 certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java create mode 100644 certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java new file mode 100644 index 000000000..4cd4d108c --- /dev/null +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java @@ -0,0 +1,31 @@ +package io.mosip.certify.core.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class CredentialConfigurationSupported { + + private String format; + + private String scope; + + @JsonProperty("cryptographic_binding_methods_supported") + private List cryptographicBindingMethodsSupported; + + @JsonProperty("credential_signing_alg_values_supported") + private List credentialSigningAlgValuesSupported; + + @JsonProperty("proof_types_supported") + private Map proofTypesSupported; + + @JsonProperty("credential_definition") + private CredentialDefinition credentialDefinition; + + private CredentialDisplay display; + + private List order; +} diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java new file mode 100644 index 000000000..227fed788 --- /dev/null +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java @@ -0,0 +1,25 @@ +package io.mosip.certify.core.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class CredentialIssuerMetadata { + + @JsonProperty("credential_issuer") + private String credentialIssuer; + + @JsonProperty("authorization_servers") + private List authorizationServers; + + @JsonProperty("credential_endpoint") + private String credentialEndpoint; + + private Map display; + + @JsonProperty("credential_configurations_supported") + private Map credentialConfigurationSupported; +} diff --git a/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java new file mode 100644 index 000000000..a7b7a21a2 --- /dev/null +++ b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java @@ -0,0 +1,32 @@ +package io.mosip.certify.controller; + +import io.mosip.certify.core.dto.CredentialConfigurationRequest; +import io.mosip.certify.core.dto.CredentialConfigurationSupported; +import io.mosip.certify.core.dto.CredentialIssuerMetadata; +import io.mosip.certify.core.spi.VCIssuanceService; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("/config") +public class CredentialConfigController { + + @Autowired + private VCIssuanceService vcIssuanceService; + + @PostMapping(value = "/credentials/configurations", produces = "application/json") + public Map getCredentialConfiguration(@Valid @RequestBody CredentialConfigurationRequest credentialConfigurationRequest) { + return vcIssuanceService.addCredentialConfiguration(credentialConfigurationRequest); + } + + @GetMapping(value = "/.well-known/openid-credential-issuer",produces = "application/json") + public CredentialIssuerMetadata getMetadata( + @RequestParam(name = "version", required = false, defaultValue = "latest") String version) { + return vcIssuanceService.fetchCredentialIssuerMetadata(version); + } +} diff --git a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java index 2ea84373e..063f0a4e3 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java @@ -140,6 +140,11 @@ public Map addCredentialConfiguration(CredentialConfigurationReq return configurationResponse; } + @Override + public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { + return new CredentialIssuerMetadata(); + } + private Map convertLatestToVd11(LinkedHashMap vciMetadata) { // Create a list to hold the transformed credentials List> credentialsList = new ArrayList<>(); diff --git a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java index a1848ae42..cb3d49326 100644 --- a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java +++ b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java @@ -2,6 +2,7 @@ import io.mosip.certify.core.constants.ErrorConstants; import io.mosip.certify.core.dto.CredentialConfigurationRequest; +import io.mosip.certify.core.dto.CredentialIssuerMetadata; import io.mosip.certify.core.dto.CredentialRequest; import io.mosip.certify.core.dto.CredentialResponse; import io.mosip.certify.core.exception.InvalidRequestException; @@ -37,4 +38,9 @@ public Map getDIDDocument() { public Map addCredentialConfiguration(CredentialConfigurationRequest credentialConfigurationRequest) { return Map.of(); } + + @Override + public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { + return new CredentialIssuerMetadata(); + } } diff --git a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java new file mode 100644 index 000000000..d88aa310b --- /dev/null +++ b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java @@ -0,0 +1,126 @@ +package io.mosip.certify.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.certify.core.constants.ErrorConstants; +import io.mosip.certify.core.dto.*; +import io.mosip.certify.core.exception.InvalidRequestException; +import io.mosip.certify.core.spi.VCIssuanceService; +import io.mosip.certify.services.VCICacheService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; + +@RunWith(SpringRunner.class) +@WebMvcTest(value = CredentialConfigController.class) +public class CredentialConfigControllerTest { + + ObjectMapper objectMapper = new ObjectMapper(); + + @Autowired + MockMvc mockMvc; + + @MockBean + ParsedAccessToken parsedAccessToken; + + @MockBean + VCIssuanceService vcIssuanceService; + + @MockBean + VCICacheService vciCacheService; + + @Test + public void addNewCredentialConfiguration_Success() throws Exception { + CredentialConfigurationRequest credentialConfigurationRequest = new CredentialConfigurationRequest(); + credentialConfigurationRequest.setVcTemplate("test_template"); + credentialConfigurationRequest.setContext(List.of("https://www.w3.org/2018/credentials/v1")); + credentialConfigurationRequest.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); + credentialConfigurationRequest.setCredentialFormat("ldp_vc"); + credentialConfigurationRequest.setDidUrl("did:web:test.github.io:test-env:test-folder"); + CredentialDisplay credentialDisplay = new CredentialDisplay(); + credentialDisplay.setName("Test Verifiable Credential"); + credentialDisplay.setLocale("en"); + credentialDisplay.setBackgroundColor("#FDFAF9"); + credentialDisplay.setTextColor("#7C4616"); + credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); + credentialConfigurationRequest.setDisplay(credentialDisplay); + credentialConfigurationRequest.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); + credentialConfigurationRequest.setScope("test_vc_ldp"); + credentialConfigurationRequest.setCryptographicBindingMethodsSupported(List.of("did:jwk")); + credentialConfigurationRequest.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); + Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); + credentialConfigurationRequest.setProofTypesSupported(Map.of("jwt", jwtValues)); + Map pluginConfigMap = new HashMap<>(); + pluginConfigMap.put("mosip.certify.mock.data-provider.test-one", "valueOne"); + pluginConfigMap.put("mosip.certify.mock.data-provider.test-two", "valueTwo"); + pluginConfigMap.put("mosip.certify.mock.data-provider.test-three", "valueThree"); + credentialConfigurationRequest.setPluginConfigurations(List.of(pluginConfigMap)); + + Map configurationResponse = new HashMap<>(); + configurationResponse.put("id", "farmer-credential-config-001"); + configurationResponse.put("status", "active"); + Mockito.when(vcIssuanceService.addCredentialConfiguration(credentialConfigurationRequest)).thenReturn(configurationResponse); + + mockMvc.perform(post("/config/credentials/configurations") + .content(objectMapper.writeValueAsBytes(credentialConfigurationRequest)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id").exists()) + .andExpect(jsonPath("$.status").exists()); + } + + @Test + public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { + CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); + credentialIssuerMetadata.setCredentialIssuer("https://localhost:9090"); + credentialIssuerMetadata.setAuthorizationServers(List.of("https://example.com/auth")); + credentialIssuerMetadata.setCredentialEndpoint("https://localhost:9090/v1/certify/issuance/credential"); + Map display = new HashMap<>(); + display.put("name", "Test Credential Issuer"); + display.put("locale", "en"); + credentialIssuerMetadata.setDisplay(display); + + CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); + credentialConfigurationSupported.setFormat("ldp_vc"); + credentialConfigurationSupported.setScope("test_vc_ldp"); + credentialConfigurationSupported.setCryptographicBindingMethodsSupported(List.of("did:jwk")); + credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); + Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); + credentialConfigurationSupported.setProofTypesSupported(jwtValues); + CredentialDisplay credentialDisplay = new CredentialDisplay(); + credentialDisplay.setName("Test Verifiable Credential"); + credentialDisplay.setLocale("en"); + credentialDisplay.setBackgroundColor("#FDFAF9"); + credentialDisplay.setTextColor("#7C4616"); + credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); + credentialConfigurationSupported.setDisplay(credentialDisplay); + credentialConfigurationSupported.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); + credentialIssuerMetadata.setCredentialConfigurationSupported(Map.of("TestCredential_ldp", credentialConfigurationSupported)); + + Mockito.when(vcIssuanceService.fetchCredentialIssuerMetadata(Mockito.anyString())).thenReturn(credentialIssuerMetadata); + + mockMvc.perform(get("/config/.well-known/openid-credential-issuer")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.credential_issuer").exists()) + .andExpect(jsonPath("$.credential_issuer").exists()) + .andExpect(jsonPath("$.credential_configurations_supported").exists()) + .andExpect(header().string("Content-Type", "application/json")); + + Mockito.verify(vcIssuanceService).fetchCredentialIssuerMetadata("latest"); + } +} diff --git a/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java index 649c80cde..e0f90134a 100644 --- a/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java +++ b/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java @@ -255,44 +255,4 @@ public void getVerifiableCredential_vd12() throws Exception { .andExpect(jsonPath("$.format").exists()) .andExpect(jsonPath("$.credential").exists()); } - - @Test - public void addNewCredentialConfiguration_Success() throws Exception { - CredentialConfigurationRequest credentialConfigurationRequest = new CredentialConfigurationRequest(); - credentialConfigurationRequest.setVcTemplate("test_template"); - credentialConfigurationRequest.setContext(Arrays.asList("https://www.w3.org/2018/credentials/v1")); - credentialConfigurationRequest.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); - credentialConfigurationRequest.setCredentialFormat("ldp_vc"); - credentialConfigurationRequest.setDidUrl("did:web:test.github.io:test-env:test-folder"); - CredentialDisplay credentialDisplay = new CredentialDisplay(); - credentialDisplay.setName("Test Verifiable Credential"); - credentialDisplay.setLocale("en"); - credentialDisplay.setBackgroundColor("#FDFAF9"); - credentialDisplay.setTextColor("#7C4616"); - credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); - credentialConfigurationRequest.setDisplay(credentialDisplay); - credentialConfigurationRequest.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); - credentialConfigurationRequest.setScope("test_vc_ldp"); - credentialConfigurationRequest.setCryptographicBindingMethodsSupported(Arrays.asList("did:jwk")); - credentialConfigurationRequest.setCredentialSigningAlgValuesSupported(Arrays.asList("Ed25519Signature2020")); - Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); - credentialConfigurationRequest.setProofTypesSupported(Map.of("jwt", jwtValues)); - Map pluginConfigMap = new HashMap<>(); - pluginConfigMap.put("mosip.certify.mock.data-provider.test-one", "valueOne"); - pluginConfigMap.put("mosip.certify.mock.data-provider.test-two", "valueTwo"); - pluginConfigMap.put("mosip.certify.mock.data-provider.test-three", "valueThree"); - credentialConfigurationRequest.setPluginConfigurations(Arrays.asList(pluginConfigMap)); - - Map configurationResponse = new HashMap<>(); - configurationResponse.put("id", "farmer-credential-config-001"); - configurationResponse.put("status", "active"); - Mockito.when(vcIssuanceService.addCredentialConfiguration(credentialConfigurationRequest)).thenReturn(configurationResponse); - - mockMvc.perform(post("/issuance/credentials/configurations") - .content(objectMapper.writeValueAsBytes(credentialConfigurationRequest)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.id").exists()) - .andExpect(jsonPath("$.status").exists()); - } } From 620c55441345fc4d52b27c04bacbd5885fe44c66 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Tue, 11 Mar 2025 10:13:59 +0530 Subject: [PATCH 03/14] Added get, put and delete methods for credential config Signed-off-by: Piyush7034 # Conflicts: # certify-core/src/main/java/io/mosip/certify/core/spi/VCIssuanceService.java # certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java --- .../dto/CredentialConfigurationRequest.java | 7 ++ .../spi/CredentialConfigurationService.java | 16 ++++ .../CredentialConfigController.java | 29 ++++-- .../controller/IssuerMetadataController.java | 25 +++++ .../CredentialConfigurationServiceImpl.java | 41 +++++++++ .../services/VCIssuanceServiceImpl.java | 9 -- .../certify/TestVCIssuanceServiceImpl.java | 5 - .../CredentialConfigControllerTest.java | 92 +++++++++---------- .../IssuerMetadataControllerTest.java | 75 +++++++++++++++ 9 files changed, 229 insertions(+), 70 deletions(-) create mode 100644 certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java create mode 100644 certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java create mode 100644 certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java create mode 100644 certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java index 07f4380a5..aa5644aa5 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java @@ -16,12 +16,16 @@ public class CredentialConfigurationRequest { @NotEmpty(message = ErrorConstants.INVALID_REQUEST) private String vcTemplate; + @NotNull(message = ErrorConstants.INVALID_REQUEST) private List context; + @NotNull(message = ErrorConstants.INVALID_REQUEST) private List credentialType; + @NotNull(message = ErrorConstants.INVALID_REQUEST) private String credentialFormat; + @NotNull(message = ErrorConstants.INVALID_REQUEST) private String didUrl; @Valid @@ -30,14 +34,17 @@ public class CredentialConfigurationRequest { private List order; + @NotNull(message = ErrorConstants.INVALID_REQUEST) private String scope; + @NotNull(message = ErrorConstants.INVALID_REQUEST) @JsonProperty("cryptographic_binding_methods_supported") private List cryptographicBindingMethodsSupported; @JsonProperty("credential_signing_alg_values_supported") private List credentialSigningAlgValuesSupported; + @NotNull(message = ErrorConstants.INVALID_REQUEST) @JsonProperty("proof_types_supported") private Map proofTypesSupported; diff --git a/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java b/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java new file mode 100644 index 000000000..a7afe5561 --- /dev/null +++ b/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java @@ -0,0 +1,16 @@ +package io.mosip.certify.core.spi; + +import io.mosip.certify.core.dto.CredentialConfigurationRequest; + +import java.util.Map; + +public interface CredentialConfigurationService { + + Map addCredentialConfiguration(CredentialConfigurationRequest credentialConfigurationRequest); + + CredentialConfigurationRequest getCredentialConfigurationById(String id); + + Map updateCredentialConfiguration(String id, CredentialConfigurationRequest credentialConfigurationRequest); + + void deleteCredentialConfigurationById(String id); +} diff --git a/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java index a7b7a21a2..7ab092703 100644 --- a/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java +++ b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java @@ -3,6 +3,7 @@ import io.mosip.certify.core.dto.CredentialConfigurationRequest; import io.mosip.certify.core.dto.CredentialConfigurationSupported; import io.mosip.certify.core.dto.CredentialIssuerMetadata; +import io.mosip.certify.core.spi.CredentialConfigurationService; import io.mosip.certify.core.spi.VCIssuanceService; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; @@ -13,20 +14,30 @@ @Slf4j @RestController -@RequestMapping("/config") +@RequestMapping("/credentials/configurations") public class CredentialConfigController { @Autowired - private VCIssuanceService vcIssuanceService; + private CredentialConfigurationService credentialConfigurationService; - @PostMapping(value = "/credentials/configurations", produces = "application/json") - public Map getCredentialConfiguration(@Valid @RequestBody CredentialConfigurationRequest credentialConfigurationRequest) { - return vcIssuanceService.addCredentialConfiguration(credentialConfigurationRequest); + @PostMapping(produces = "application/json") + public Map addCredentialConfiguration(@Valid @RequestBody CredentialConfigurationRequest credentialConfigurationRequest) { + return credentialConfigurationService.addCredentialConfiguration(credentialConfigurationRequest); } - @GetMapping(value = "/.well-known/openid-credential-issuer",produces = "application/json") - public CredentialIssuerMetadata getMetadata( - @RequestParam(name = "version", required = false, defaultValue = "latest") String version) { - return vcIssuanceService.fetchCredentialIssuerMetadata(version); + @GetMapping(value = "/{configurationId}", produces = "application/json") + public CredentialConfigurationRequest getCredentialConfigurationById(@PathVariable String configurationId) { + return credentialConfigurationService.getCredentialConfigurationById(configurationId); + } + + @PutMapping(value = "/{configurationId}", produces = "application/json") + public Map updateCredentialConfiguration(@PathVariable String configurationId, + @Valid @RequestBody CredentialConfigurationRequest credentialConfigurationRequest) { + return credentialConfigurationService.updateCredentialConfiguration(configurationId, credentialConfigurationRequest); + } + + @DeleteMapping(value = "/{configurationId}", produces = "application/json") + public void deleteCredentialConfigurationById(@PathVariable String configurationId) { + credentialConfigurationService.deleteCredentialConfigurationById(configurationId); } } diff --git a/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java b/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java new file mode 100644 index 000000000..0d6c13d71 --- /dev/null +++ b/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java @@ -0,0 +1,25 @@ +package io.mosip.certify.controller; + +import io.mosip.certify.core.dto.CredentialIssuerMetadata; +import io.mosip.certify.core.spi.VCIssuanceService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequestMapping("/issuer-metadata") +public class IssuerMetadataController { + + @Autowired + private VCIssuanceService vcIssuanceService; + + @GetMapping(value = "/.well-known/openid-credential-issuer", produces = "application/json") + public CredentialIssuerMetadata getCredentialIssuerMetadata( + @RequestParam(name = "version", required = false, defaultValue = "latest") String version) { + return vcIssuanceService.fetchCredentialIssuerMetadata(version); + } +} diff --git a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java new file mode 100644 index 000000000..c49b7af8f --- /dev/null +++ b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java @@ -0,0 +1,41 @@ +package io.mosip.certify.services; + +import io.mosip.certify.core.dto.CredentialConfigurationRequest; +import io.mosip.certify.core.spi.CredentialConfigurationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Service +public class CredentialConfigurationServiceImpl implements CredentialConfigurationService { + @Override + public Map addCredentialConfiguration(CredentialConfigurationRequest credentialConfigurationRequest) { + Map configurationResponse = new HashMap<>(); + configurationResponse.put("id", "farmer-credential-config-001"); + configurationResponse.put("status", "active"); + + return configurationResponse; + } + + @Override + public CredentialConfigurationRequest getCredentialConfigurationById(String id) { + return new CredentialConfigurationRequest(); + } + + @Override + public Map updateCredentialConfiguration(String id, CredentialConfigurationRequest credentialConfigurationRequest) { + Map configurationResponse = new HashMap<>(); + configurationResponse.put("id", "farmer-credential-config-001"); + configurationResponse.put("status", "active"); + + return configurationResponse; + } + + @Override + public void deleteCredentialConfigurationById(String id) { + + } +} diff --git a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java index 063f0a4e3..6f69544dd 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java @@ -131,15 +131,6 @@ public Map getDIDDocument() { throw new InvalidRequestException(ErrorConstants.UNSUPPORTED_IN_CURRENT_PLUGIN_MODE); } - @Override - public Map addCredentialConfiguration(CredentialConfigurationRequest credentialConfigurationRequest) { - Map configurationResponse = new HashMap<>(); - configurationResponse.put("id", "farmer-credential-config-001"); - configurationResponse.put("status", "active"); - - return configurationResponse; - } - @Override public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { return new CredentialIssuerMetadata(); diff --git a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java index cb3d49326..56b913dfc 100644 --- a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java +++ b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java @@ -34,11 +34,6 @@ public Map getDIDDocument() { throw new InvalidRequestException(ErrorConstants.UNSUPPORTED_IN_CURRENT_PLUGIN_MODE); } - @Override - public Map addCredentialConfiguration(CredentialConfigurationRequest credentialConfigurationRequest) { - return Map.of(); - } - @Override public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { return new CredentialIssuerMetadata(); diff --git a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java index d88aa310b..3e4931a69 100644 --- a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java +++ b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java @@ -1,13 +1,13 @@ package io.mosip.certify.controller; import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.certify.core.constants.ErrorConstants; import io.mosip.certify.core.dto.*; -import io.mosip.certify.core.exception.InvalidRequestException; +import io.mosip.certify.core.spi.CredentialConfigurationService; import io.mosip.certify.core.spi.VCIssuanceService; -import io.mosip.certify.services.VCICacheService; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -21,15 +21,13 @@ import java.util.List; import java.util.Map; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.mockito.ArgumentMatchers.eq; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; @RunWith(SpringRunner.class) @WebMvcTest(value = CredentialConfigController.class) public class CredentialConfigControllerTest { - ObjectMapper objectMapper = new ObjectMapper(); @Autowired @@ -39,14 +37,17 @@ public class CredentialConfigControllerTest { ParsedAccessToken parsedAccessToken; @MockBean - VCIssuanceService vcIssuanceService; + CredentialConfigurationService credentialConfigurationService; @MockBean - VCICacheService vciCacheService; + VCIssuanceService vcIssuanceService; - @Test - public void addNewCredentialConfiguration_Success() throws Exception { - CredentialConfigurationRequest credentialConfigurationRequest = new CredentialConfigurationRequest(); + @Mock + private CredentialConfigurationRequest credentialConfigurationRequest; + + @Before + public void setup() { + credentialConfigurationRequest = new CredentialConfigurationRequest(); credentialConfigurationRequest.setVcTemplate("test_template"); credentialConfigurationRequest.setContext(List.of("https://www.w3.org/2018/credentials/v1")); credentialConfigurationRequest.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); @@ -70,13 +71,18 @@ public void addNewCredentialConfiguration_Success() throws Exception { pluginConfigMap.put("mosip.certify.mock.data-provider.test-two", "valueTwo"); pluginConfigMap.put("mosip.certify.mock.data-provider.test-three", "valueThree"); credentialConfigurationRequest.setPluginConfigurations(List.of(pluginConfigMap)); + } + + @Test + public void addNewCredentialConfiguration_Success() throws Exception { + Map configurationResponse = new HashMap<>(); configurationResponse.put("id", "farmer-credential-config-001"); configurationResponse.put("status", "active"); - Mockito.when(vcIssuanceService.addCredentialConfiguration(credentialConfigurationRequest)).thenReturn(configurationResponse); + Mockito.when(credentialConfigurationService.addCredentialConfiguration(credentialConfigurationRequest)).thenReturn(configurationResponse); - mockMvc.perform(post("/config/credentials/configurations") + mockMvc.perform(post("/credentials/configurations") .content(objectMapper.writeValueAsBytes(credentialConfigurationRequest)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) @@ -85,42 +91,34 @@ public void addNewCredentialConfiguration_Success() throws Exception { } @Test - public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { - CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); - credentialIssuerMetadata.setCredentialIssuer("https://localhost:9090"); - credentialIssuerMetadata.setAuthorizationServers(List.of("https://example.com/auth")); - credentialIssuerMetadata.setCredentialEndpoint("https://localhost:9090/v1/certify/issuance/credential"); - Map display = new HashMap<>(); - display.put("name", "Test Credential Issuer"); - display.put("locale", "en"); - credentialIssuerMetadata.setDisplay(display); - - CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); - credentialConfigurationSupported.setFormat("ldp_vc"); - credentialConfigurationSupported.setScope("test_vc_ldp"); - credentialConfigurationSupported.setCryptographicBindingMethodsSupported(List.of("did:jwk")); - credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); - Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); - credentialConfigurationSupported.setProofTypesSupported(jwtValues); - CredentialDisplay credentialDisplay = new CredentialDisplay(); - credentialDisplay.setName("Test Verifiable Credential"); - credentialDisplay.setLocale("en"); - credentialDisplay.setBackgroundColor("#FDFAF9"); - credentialDisplay.setTextColor("#7C4616"); - credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); - credentialConfigurationSupported.setDisplay(credentialDisplay); - credentialConfigurationSupported.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); - credentialIssuerMetadata.setCredentialConfigurationSupported(Map.of("TestCredential_ldp", credentialConfigurationSupported)); + public void getCredentialConfigurationById_Success() throws Exception { - Mockito.when(vcIssuanceService.fetchCredentialIssuerMetadata(Mockito.anyString())).thenReturn(credentialIssuerMetadata); + Mockito.when(credentialConfigurationService.getCredentialConfigurationById(Mockito.anyString())).thenReturn(credentialConfigurationRequest); - mockMvc.perform(get("/config/.well-known/openid-credential-issuer")) + mockMvc.perform(get("/credentials/configurations/1")) .andExpect(status().isOk()) - .andExpect(jsonPath("$.credential_issuer").exists()) - .andExpect(jsonPath("$.credential_issuer").exists()) - .andExpect(jsonPath("$.credential_configurations_supported").exists()) - .andExpect(header().string("Content-Type", "application/json")); + .andExpect(jsonPath("$.vcTemplate").exists()) + .andExpect(jsonPath("$.context").exists()) + .andExpect(jsonPath("$.credentialType").exists()) + .andExpect(jsonPath("$.didUrl").exists()) + .andExpect(jsonPath("$.scope").exists()) + .andExpect(jsonPath("$.cryptographic_binding_methods_supported").exists()) + .andExpect(jsonPath("$.credential_signing_alg_values_supported").exists()) + .andExpect(jsonPath("$.proof_types_supported").exists()); + } + + @Test + public void updateExistingCredentialConfiguration_Success() throws Exception { + Map configurationResponse = new HashMap<>(); + configurationResponse.put("id", "farmer-credential-config-001"); + configurationResponse.put("status", "active"); + Mockito.when(credentialConfigurationService.updateCredentialConfiguration(Mockito.anyString(), eq(credentialConfigurationRequest))).thenReturn(configurationResponse); - Mockito.verify(vcIssuanceService).fetchCredentialIssuerMetadata("latest"); + mockMvc.perform(put("/credentials/configurations/1") + .content(objectMapper.writeValueAsBytes(credentialConfigurationRequest)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id").exists()) + .andExpect(jsonPath("$.status").exists()); } } diff --git a/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java new file mode 100644 index 000000000..6c786a8b2 --- /dev/null +++ b/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java @@ -0,0 +1,75 @@ +package io.mosip.certify.controller; + +import io.mosip.certify.core.dto.CredentialConfigurationSupported; +import io.mosip.certify.core.dto.CredentialDisplay; +import io.mosip.certify.core.dto.CredentialIssuerMetadata; +import io.mosip.certify.core.dto.ParsedAccessToken; +import io.mosip.certify.core.spi.VCIssuanceService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@RunWith(SpringRunner.class) +@WebMvcTest(value = IssuerMetadataController.class) +public class IssuerMetadataControllerTest { + @Autowired + MockMvc mockMvc; + + @MockBean + ParsedAccessToken parsedAccessToken; + + @MockBean + VCIssuanceService vcIssuanceService; + + @Test + public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { + CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); + credentialIssuerMetadata.setCredentialIssuer("https://localhost:9090"); + credentialIssuerMetadata.setAuthorizationServers(List.of("https://example.com/auth")); + credentialIssuerMetadata.setCredentialEndpoint("https://localhost:9090/v1/certify/issuance/credential"); + Map display = new HashMap<>(); + display.put("name", "Test Credential Issuer"); + display.put("locale", "en"); + credentialIssuerMetadata.setDisplay(display); + + CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); + credentialConfigurationSupported.setFormat("ldp_vc"); + credentialConfigurationSupported.setScope("test_vc_ldp"); + credentialConfigurationSupported.setCryptographicBindingMethodsSupported(List.of("did:jwk")); + credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); + Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); + credentialConfigurationSupported.setProofTypesSupported(jwtValues); + CredentialDisplay credentialDisplay = new CredentialDisplay(); + credentialDisplay.setName("Test Verifiable Credential"); + credentialDisplay.setLocale("en"); + credentialDisplay.setBackgroundColor("#FDFAF9"); + credentialDisplay.setTextColor("#7C4616"); + credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); + credentialConfigurationSupported.setDisplay(credentialDisplay); + credentialConfigurationSupported.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); + credentialIssuerMetadata.setCredentialConfigurationSupported(Map.of("TestCredential_ldp", credentialConfigurationSupported)); + + Mockito.when(vcIssuanceService.fetchCredentialIssuerMetadata(Mockito.anyString())).thenReturn(credentialIssuerMetadata); + + mockMvc.perform(get("/issuer-metadata/.well-known/openid-credential-issuer")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.credential_issuer").exists()) + .andExpect(jsonPath("$.credential_configurations_supported").exists()) + .andExpect(header().string("Content-Type", "application/json")); + + Mockito.verify(vcIssuanceService).fetchCredentialIssuerMetadata("latest"); + } +} From a7b0ad6a96bb5a7805158971d65fe741a7b8c417 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Tue, 11 Mar 2025 16:31:03 +0530 Subject: [PATCH 04/14] Added entity and respository for configs Signed-off-by: Piyush7034 --- .../certify/core/constants/Constants.java | 2 + .../core/dto/CredentialConfigResponse.java | 14 +++ ...t.java => CredentialConfigurationDTO.java} | 2 +- .../dto/CredentialConfigurationSupported.java | 2 +- .../core/dto/CredentialIssuerMetadata.java | 2 +- .../spi/CredentialConfigurationService.java | 14 +-- certify-service/pom.xml | 5 ++ .../CredentialConfigController.java | 37 +++++--- .../certify/entity/CredentialConfig.java | 30 +++++++ .../CredentialConfigRepository.java | 7 ++ .../services/CertifyIssuanceServiceImpl.java | 16 ++++ .../CredentialConfigurationServiceImpl.java | 90 +++++++++++++++---- .../services/VCIssuanceServiceImpl.java | 10 +-- .../certify/TestVCIssuanceServiceImpl.java | 1 - .../CredentialConfigControllerTest.java | 68 ++++++++------ .../IssuerMetadataControllerTest.java | 4 +- db_scripts/mosip_certify/ddl.sql | 1 + .../ddl/certify-credential_config.sql | 29 ++++++ db_scripts/mosip_certify/deploy.properties | 2 +- 19 files changed, 256 insertions(+), 80 deletions(-) create mode 100644 certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigResponse.java rename certify-core/src/main/java/io/mosip/certify/core/dto/{CredentialConfigurationRequest.java => CredentialConfigurationDTO.java} (97%) create mode 100644 certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java create mode 100644 certify-service/src/main/java/io/mosip/certify/repository/CredentialConfigRepository.java create mode 100644 db_scripts/mosip_certify/ddl/certify-credential_config.sql diff --git a/certify-core/src/main/java/io/mosip/certify/core/constants/Constants.java b/certify-core/src/main/java/io/mosip/certify/core/constants/Constants.java index b0d5e9a4f..a6de5f2ef 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/constants/Constants.java +++ b/certify-core/src/main/java/io/mosip/certify/core/constants/Constants.java @@ -29,4 +29,6 @@ public class Constants { public static final String CERTIFY_VC_SIGN_EC_R1 = "CERTIFY_VC_SIGN_EC_R1"; public static final String EC_SECP256K1_SIGN = "EC_SECP256K1_SIGN"; public static final String EC_SECP256R1_SIGN = "EC_SECP256R1_SIGN"; + public static final String ACTIVE = "active"; + public static final String INACTIVE = "inactive"; } diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigResponse.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigResponse.java new file mode 100644 index 000000000..edee37405 --- /dev/null +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigResponse.java @@ -0,0 +1,14 @@ +package io.mosip.certify.core.dto; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +@Data +public class CredentialConfigResponse { + + @NotEmpty + private String id; + + @NotEmpty + private String status; +} diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java similarity index 97% rename from certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java rename to certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java index aa5644aa5..d02c20ae2 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationRequest.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java @@ -11,7 +11,7 @@ import java.util.Map; @Data -public class CredentialConfigurationRequest { +public class CredentialConfigurationDTO { @NotEmpty(message = ErrorConstants.INVALID_REQUEST) private String vcTemplate; diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java index 4cd4d108c..86ea37f2c 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java @@ -25,7 +25,7 @@ public class CredentialConfigurationSupported { @JsonProperty("credential_definition") private CredentialDefinition credentialDefinition; - private CredentialDisplay display; + private List display; private List order; } diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java index 227fed788..51b8ebbe1 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java @@ -18,7 +18,7 @@ public class CredentialIssuerMetadata { @JsonProperty("credential_endpoint") private String credentialEndpoint; - private Map display; + private List> display; @JsonProperty("credential_configurations_supported") private Map credentialConfigurationSupported; diff --git a/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java b/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java index a7afe5561..bf318e62e 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java +++ b/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java @@ -1,16 +1,16 @@ package io.mosip.certify.core.spi; -import io.mosip.certify.core.dto.CredentialConfigurationRequest; - -import java.util.Map; +import com.fasterxml.jackson.core.JsonProcessingException; +import io.mosip.certify.core.dto.CredentialConfigResponse; +import io.mosip.certify.core.dto.CredentialConfigurationDTO; public interface CredentialConfigurationService { - Map addCredentialConfiguration(CredentialConfigurationRequest credentialConfigurationRequest); + CredentialConfigResponse addCredentialConfiguration(CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException; - CredentialConfigurationRequest getCredentialConfigurationById(String id); + CredentialConfigurationDTO getCredentialConfigurationById(String id) throws JsonProcessingException; - Map updateCredentialConfiguration(String id, CredentialConfigurationRequest credentialConfigurationRequest); + CredentialConfigResponse updateCredentialConfiguration(String id, CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException; - void deleteCredentialConfigurationById(String id); + String deleteCredentialConfigurationById(String id); } diff --git a/certify-service/pom.xml b/certify-service/pom.xml index 70bfcc18b..69d9024ca 100644 --- a/certify-service/pom.xml +++ b/certify-service/pom.xml @@ -25,6 +25,11 @@ + + io.mosip.certify + mock-certify-plugin + 0.4.0-SNAPSHOT + org.springframework.boot spring-boot-starter-actuator diff --git a/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java index 7ab092703..37a36cfe6 100644 --- a/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java +++ b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java @@ -1,43 +1,52 @@ package io.mosip.certify.controller; -import io.mosip.certify.core.dto.CredentialConfigurationRequest; -import io.mosip.certify.core.dto.CredentialConfigurationSupported; -import io.mosip.certify.core.dto.CredentialIssuerMetadata; +import com.fasterxml.jackson.core.JsonProcessingException; +import io.mosip.certify.core.dto.CredentialConfigResponse; +import io.mosip.certify.core.dto.CredentialConfigurationDTO; import io.mosip.certify.core.spi.CredentialConfigurationService; -import io.mosip.certify.core.spi.VCIssuanceService; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.Map; @Slf4j @RestController -@RequestMapping("/credentials/configurations") +@RequestMapping("/configurations") public class CredentialConfigController { @Autowired private CredentialConfigurationService credentialConfigurationService; @PostMapping(produces = "application/json") - public Map addCredentialConfiguration(@Valid @RequestBody CredentialConfigurationRequest credentialConfigurationRequest) { - return credentialConfigurationService.addCredentialConfiguration(credentialConfigurationRequest); + public ResponseEntity addCredentialConfiguration(@Valid @RequestBody CredentialConfigurationDTO credentialConfigurationRequest) throws JsonProcessingException { + + CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.addCredentialConfiguration(credentialConfigurationRequest); + return new ResponseEntity<>(credentialConfigResponse, HttpStatus.CREATED); } @GetMapping(value = "/{configurationId}", produces = "application/json") - public CredentialConfigurationRequest getCredentialConfigurationById(@PathVariable String configurationId) { - return credentialConfigurationService.getCredentialConfigurationById(configurationId); + public ResponseEntity getCredentialConfigurationById(@PathVariable String configurationId) throws JsonProcessingException { + + CredentialConfigurationDTO credentialConfigurationDTO = credentialConfigurationService.getCredentialConfigurationById(configurationId); + return new ResponseEntity<>(credentialConfigurationDTO, HttpStatus.OK); } @PutMapping(value = "/{configurationId}", produces = "application/json") - public Map updateCredentialConfiguration(@PathVariable String configurationId, - @Valid @RequestBody CredentialConfigurationRequest credentialConfigurationRequest) { - return credentialConfigurationService.updateCredentialConfiguration(configurationId, credentialConfigurationRequest); + public ResponseEntity updateCredentialConfiguration(@PathVariable String configurationId, + @Valid @RequestBody CredentialConfigurationDTO credentialConfigurationRequest) throws JsonProcessingException { + + CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.updateCredentialConfiguration(configurationId, credentialConfigurationRequest); + return new ResponseEntity<>(credentialConfigResponse, HttpStatus.OK); } @DeleteMapping(value = "/{configurationId}", produces = "application/json") - public void deleteCredentialConfigurationById(@PathVariable String configurationId) { - credentialConfigurationService.deleteCredentialConfigurationById(configurationId); + public ResponseEntity deleteCredentialConfigurationById(@PathVariable String configurationId) { + + String response = credentialConfigurationService.deleteCredentialConfigurationById(configurationId); + return new ResponseEntity<>(response, HttpStatus.OK); } } diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java new file mode 100644 index 000000000..c2655c04f --- /dev/null +++ b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java @@ -0,0 +1,30 @@ +package io.mosip.certify.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Entity +@Table(name="credential_config") +public class CredentialConfig { + @Id + private String id; + + private String status; + + private String configuration; + + @NotNull + @Column(name = "cr_dtimes") + private LocalDateTime createdTime; + + @Column(name = "upd_dtimes") + private LocalDateTime updatedTime; +} diff --git a/certify-service/src/main/java/io/mosip/certify/repository/CredentialConfigRepository.java b/certify-service/src/main/java/io/mosip/certify/repository/CredentialConfigRepository.java new file mode 100644 index 000000000..174b0b455 --- /dev/null +++ b/certify-service/src/main/java/io/mosip/certify/repository/CredentialConfigRepository.java @@ -0,0 +1,7 @@ +package io.mosip.certify.repository; + +import io.mosip.certify.entity.CredentialConfig; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CredentialConfigRepository extends JpaRepository { +} diff --git a/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java index 36e624a51..0ca7a118b 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java @@ -461,4 +461,20 @@ private VCIssuanceTransaction createVCITransaction() { transaction.setCNonceExpireSeconds(cNonceExpireSeconds); return vciCacheService.setVCITransaction(parsedAccessToken.getAccessTokenHash(), transaction); } + + @Override + public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { + LinkedHashMap originalIssuerMetadata = new LinkedHashMap<>(issuerMetadata.get("latest")); + + CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); + credentialIssuerMetadata.setCredentialIssuer((String) originalIssuerMetadata.get("credential_issuer")); + credentialIssuerMetadata.setAuthorizationServers((List) originalIssuerMetadata.get("authorization_servers")); + credentialIssuerMetadata.setCredentialEndpoint((String) originalIssuerMetadata.get("credential_endpoint")); + credentialIssuerMetadata.setDisplay((List>) originalIssuerMetadata.get("display")); + + Map credentialConfigurationSupported = (Map) originalIssuerMetadata.get("credential_configurations_supported"); + credentialIssuerMetadata.setCredentialConfigurationSupported(credentialConfigurationSupported); + + return credentialIssuerMetadata; + } } diff --git a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java index c49b7af8f..1b48f13c8 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java @@ -1,41 +1,95 @@ package io.mosip.certify.services; -import io.mosip.certify.core.dto.CredentialConfigurationRequest; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.certify.core.constants.Constants; +import io.mosip.certify.core.dto.CredentialConfigResponse; +import io.mosip.certify.core.dto.CredentialConfigurationDTO; +import io.mosip.certify.core.exception.CertifyException; import io.mosip.certify.core.spi.CredentialConfigurationService; +import io.mosip.certify.entity.CredentialConfig; +import io.mosip.certify.repository.CredentialConfigRepository; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -import java.util.HashMap; -import java.util.Map; +import java.time.LocalDateTime; +import java.util.Optional; +import java.util.UUID; @Slf4j -@Service +@Component public class CredentialConfigurationServiceImpl implements CredentialConfigurationService { + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private CredentialConfigRepository credentialConfigRepository; + @Override - public Map addCredentialConfiguration(CredentialConfigurationRequest credentialConfigurationRequest) { - Map configurationResponse = new HashMap<>(); - configurationResponse.put("id", "farmer-credential-config-001"); - configurationResponse.put("status", "active"); + public CredentialConfigResponse addCredentialConfiguration(CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException { + CredentialConfig credentialConfig = new CredentialConfig(); + credentialConfig.setId(UUID.randomUUID().toString()); + credentialConfig.setStatus(Constants.ACTIVE); + String configuration = objectMapper.writeValueAsString(credentialConfigurationDTO); + credentialConfig.setConfiguration(configuration); + credentialConfig.setCreatedTime(LocalDateTime.now()); + credentialConfigRepository.save(credentialConfig); + + CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); + credentialConfigResponse.setId(credentialConfig.getId()); + credentialConfigResponse.setStatus(credentialConfig.getStatus()); - return configurationResponse; + return credentialConfigResponse; } @Override - public CredentialConfigurationRequest getCredentialConfigurationById(String id) { - return new CredentialConfigurationRequest(); + public CredentialConfigurationDTO getCredentialConfigurationById(String id) throws JsonProcessingException { + Optional optional = credentialConfigRepository.findById(id); + + if(optional.isEmpty()) { + throw new CertifyException("Configuration not found with the provided id: " + id); + } + + CredentialConfig credentialConfig = optional.get(); + if(!credentialConfig.getStatus().equals(Constants.ACTIVE)) { + throw new CertifyException("Configuration not active."); + } + + String configuration = credentialConfig.getConfiguration(); + CredentialConfigurationDTO credentialConfigurationDTO = objectMapper.readValue(configuration, CredentialConfigurationDTO.class); + return credentialConfigurationDTO; } @Override - public Map updateCredentialConfiguration(String id, CredentialConfigurationRequest credentialConfigurationRequest) { - Map configurationResponse = new HashMap<>(); - configurationResponse.put("id", "farmer-credential-config-001"); - configurationResponse.put("status", "active"); + public CredentialConfigResponse updateCredentialConfiguration(String id, CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException { + Optional optional = credentialConfigRepository.findById(id); + + if(optional.isEmpty()) { + throw new CertifyException("Configuration not found with the provided id: " + id); + } + + CredentialConfig credentialConfig = optional.get(); + String configuration = objectMapper.writeValueAsString(credentialConfigurationDTO); + credentialConfig.setConfiguration(configuration); + credentialConfigRepository.save(credentialConfig); - return configurationResponse; + CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); + credentialConfigResponse.setId(credentialConfig.getId()); + credentialConfigResponse.setStatus(credentialConfig.getStatus()); + + return credentialConfigResponse; } @Override - public void deleteCredentialConfigurationById(String id) { + public String deleteCredentialConfigurationById(String id) { + Optional optional = credentialConfigRepository.findById(id); + + if(optional.isEmpty()) { + throw new CertifyException("Configuration not found with the provided id: " + id); + } + credentialConfigRepository.deleteById(id); + return "Configuration deleted with id: " + id; } } diff --git a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java index 6f69544dd..4284bd92d 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java @@ -131,11 +131,6 @@ public Map getDIDDocument() { throw new InvalidRequestException(ErrorConstants.UNSUPPORTED_IN_CURRENT_PLUGIN_MODE); } - @Override - public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { - return new CredentialIssuerMetadata(); - } - private Map convertLatestToVd11(LinkedHashMap vciMetadata) { // Create a list to hold the transformed credentials List> credentialsList = new ArrayList<>(); @@ -383,4 +378,9 @@ private VCIssuanceTransaction createVCITransaction() { transaction.setCNonceExpireSeconds(cNonceExpireSeconds); return vciCacheService.setVCITransaction(parsedAccessToken.getAccessTokenHash(), transaction); } + + @Override + public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { + return new CredentialIssuerMetadata(); + } } \ No newline at end of file diff --git a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java index 56b913dfc..2399320e5 100644 --- a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java +++ b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java @@ -1,7 +1,6 @@ package io.mosip.certify; import io.mosip.certify.core.constants.ErrorConstants; -import io.mosip.certify.core.dto.CredentialConfigurationRequest; import io.mosip.certify.core.dto.CredentialIssuerMetadata; import io.mosip.certify.core.dto.CredentialRequest; import io.mosip.certify.core.dto.CredentialResponse; diff --git a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java index 3e4931a69..2af1fe94b 100644 --- a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java +++ b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java @@ -43,49 +43,49 @@ public class CredentialConfigControllerTest { VCIssuanceService vcIssuanceService; @Mock - private CredentialConfigurationRequest credentialConfigurationRequest; + private CredentialConfigurationDTO credentialConfigurationDTO; @Before public void setup() { - credentialConfigurationRequest = new CredentialConfigurationRequest(); - credentialConfigurationRequest.setVcTemplate("test_template"); - credentialConfigurationRequest.setContext(List.of("https://www.w3.org/2018/credentials/v1")); - credentialConfigurationRequest.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); - credentialConfigurationRequest.setCredentialFormat("ldp_vc"); - credentialConfigurationRequest.setDidUrl("did:web:test.github.io:test-env:test-folder"); + credentialConfigurationDTO = new CredentialConfigurationDTO(); + credentialConfigurationDTO.setVcTemplate("test_template"); + credentialConfigurationDTO.setContext(List.of("https://www.w3.org/2018/credentials/v1")); + credentialConfigurationDTO.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); + credentialConfigurationDTO.setCredentialFormat("ldp_vc"); + credentialConfigurationDTO.setDidUrl("did:web:test.github.io:test-env:test-folder"); CredentialDisplay credentialDisplay = new CredentialDisplay(); credentialDisplay.setName("Test Verifiable Credential"); credentialDisplay.setLocale("en"); credentialDisplay.setBackgroundColor("#FDFAF9"); credentialDisplay.setTextColor("#7C4616"); credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); - credentialConfigurationRequest.setDisplay(credentialDisplay); - credentialConfigurationRequest.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); - credentialConfigurationRequest.setScope("test_vc_ldp"); - credentialConfigurationRequest.setCryptographicBindingMethodsSupported(List.of("did:jwk")); - credentialConfigurationRequest.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); + credentialConfigurationDTO.setDisplay(credentialDisplay); + credentialConfigurationDTO.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); + credentialConfigurationDTO.setScope("test_vc_ldp"); + credentialConfigurationDTO.setCryptographicBindingMethodsSupported(List.of("did:jwk")); + credentialConfigurationDTO.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); - credentialConfigurationRequest.setProofTypesSupported(Map.of("jwt", jwtValues)); + credentialConfigurationDTO.setProofTypesSupported(Map.of("jwt", jwtValues)); Map pluginConfigMap = new HashMap<>(); pluginConfigMap.put("mosip.certify.mock.data-provider.test-one", "valueOne"); pluginConfigMap.put("mosip.certify.mock.data-provider.test-two", "valueTwo"); pluginConfigMap.put("mosip.certify.mock.data-provider.test-three", "valueThree"); - credentialConfigurationRequest.setPluginConfigurations(List.of(pluginConfigMap)); + credentialConfigurationDTO.setPluginConfigurations(List.of(pluginConfigMap)); } @Test public void addNewCredentialConfiguration_Success() throws Exception { - Map configurationResponse = new HashMap<>(); - configurationResponse.put("id", "farmer-credential-config-001"); - configurationResponse.put("status", "active"); - Mockito.when(credentialConfigurationService.addCredentialConfiguration(credentialConfigurationRequest)).thenReturn(configurationResponse); + CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); + credentialConfigResponse.setId("farmer-credential-config-001"); + credentialConfigResponse.setStatus("active"); + Mockito.when(credentialConfigurationService.addCredentialConfiguration(credentialConfigurationDTO)).thenReturn(credentialConfigResponse); - mockMvc.perform(post("/credentials/configurations") - .content(objectMapper.writeValueAsBytes(credentialConfigurationRequest)) + mockMvc.perform(post("/configurations") + .content(objectMapper.writeValueAsBytes(credentialConfigurationDTO)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) + .andExpect(status().isCreated()) .andExpect(jsonPath("$.id").exists()) .andExpect(jsonPath("$.status").exists()); } @@ -93,9 +93,9 @@ public void addNewCredentialConfiguration_Success() throws Exception { @Test public void getCredentialConfigurationById_Success() throws Exception { - Mockito.when(credentialConfigurationService.getCredentialConfigurationById(Mockito.anyString())).thenReturn(credentialConfigurationRequest); + Mockito.when(credentialConfigurationService.getCredentialConfigurationById(Mockito.anyString())).thenReturn(credentialConfigurationDTO); - mockMvc.perform(get("/credentials/configurations/1")) + mockMvc.perform(get("/configurations/1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.vcTemplate").exists()) .andExpect(jsonPath("$.context").exists()) @@ -109,16 +109,26 @@ public void getCredentialConfigurationById_Success() throws Exception { @Test public void updateExistingCredentialConfiguration_Success() throws Exception { - Map configurationResponse = new HashMap<>(); - configurationResponse.put("id", "farmer-credential-config-001"); - configurationResponse.put("status", "active"); - Mockito.when(credentialConfigurationService.updateCredentialConfiguration(Mockito.anyString(), eq(credentialConfigurationRequest))).thenReturn(configurationResponse); + CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); + credentialConfigResponse.setId("farmer-credential-config-001"); + credentialConfigResponse.setStatus("active"); + Mockito.when(credentialConfigurationService.updateCredentialConfiguration(Mockito.anyString(), eq(credentialConfigurationDTO))).thenReturn(credentialConfigResponse); - mockMvc.perform(put("/credentials/configurations/1") - .content(objectMapper.writeValueAsBytes(credentialConfigurationRequest)) + mockMvc.perform(put("/configurations/1") + .content(objectMapper.writeValueAsBytes(credentialConfigurationDTO)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").exists()) .andExpect(jsonPath("$.status").exists()); } + + @Test + public void deleteExistingCredentialConfiguration_Success() throws Exception { + String response = "Configuration deleted with id: 1"; + Mockito.when(credentialConfigurationService.deleteCredentialConfigurationById(Mockito.anyString())).thenReturn(response); + + mockMvc.perform(delete("/configurations/1")) + .andExpect(status().isOk()) + .andExpect(content().string(response)); + } } diff --git a/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java index 6c786a8b2..df1facce7 100644 --- a/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java +++ b/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java @@ -43,7 +43,7 @@ public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { Map display = new HashMap<>(); display.put("name", "Test Credential Issuer"); display.put("locale", "en"); - credentialIssuerMetadata.setDisplay(display); + credentialIssuerMetadata.setDisplay(List.of(display)); CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); credentialConfigurationSupported.setFormat("ldp_vc"); @@ -58,7 +58,7 @@ public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { credentialDisplay.setBackgroundColor("#FDFAF9"); credentialDisplay.setTextColor("#7C4616"); credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); - credentialConfigurationSupported.setDisplay(credentialDisplay); + credentialConfigurationSupported.setDisplay(List.of(credentialDisplay)); credentialConfigurationSupported.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); credentialIssuerMetadata.setCredentialConfigurationSupported(Map.of("TestCredential_ldp", credentialConfigurationSupported)); diff --git a/db_scripts/mosip_certify/ddl.sql b/db_scripts/mosip_certify/ddl.sql index 6506c911e..d99204900 100644 --- a/db_scripts/mosip_certify/ddl.sql +++ b/db_scripts/mosip_certify/ddl.sql @@ -6,5 +6,6 @@ \ir ddl/certify-ca_cert_store.sql \ir ddl/certify-rendering_template.sql \ir ddl/certify-credential_template.sql +\ir ddl/certify-credential_config.sql diff --git a/db_scripts/mosip_certify/ddl/certify-credential_config.sql b/db_scripts/mosip_certify/ddl/certify-credential_config.sql new file mode 100644 index 000000000..4480bcff1 --- /dev/null +++ b/db_scripts/mosip_certify/ddl/certify-credential_config.sql @@ -0,0 +1,29 @@ +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at https://mozilla.org/MPL/2.0/. +-- ------------------------------------------------------------------------------------------------- +-- Database Name: inji_certify +-- Table Name : credential_config +-- Purpose : Credential Configuration Table +-- +-- +-- Modified Date Modified By Comments / Remarks +-- ------------------------------------------------------------------------------------------ +-- ------------------------------------------------------------------------------------------ + +CREATE TABLE credential_config ( + id VARCHAR(128) NOT NULL, + status VARCHAR NOT NULL, + configuration VARCHAR NOT NULL, + cr_dtimes timestamp NOT NULL default now(), + upd_dtimes timestamp, + CONSTRAINT pk_cred_config_id PRIMARY KEY (id) +); + +COMMENT ON TABLE credential_config IS 'Credential Config: Contains details of credential configuration.'; + +COMMENT ON COLUMN credential_config.id IS 'Credential Config Id: Unique id assigned to save and identify configuration.'; +COMMENT ON COLUMN credential_config.status IS 'Credential Config Status: Status of the credential configuration.'; +COMMENT ON COLUMN credential_config.configuration IS 'Credential Config Configuration: Congiguration JSON of the new config'; +COMMENT ON COLUMN credential_config.cr_dtimes IS 'Date when the config was inserted in table.'; +COMMENT ON COLUMN credential_config.upd_dtimes IS 'Date when the config was last updated in table.'; \ No newline at end of file diff --git a/db_scripts/mosip_certify/deploy.properties b/db_scripts/mosip_certify/deploy.properties index c8ffab055..592f854e9 100644 --- a/db_scripts/mosip_certify/deploy.properties +++ b/db_scripts/mosip_certify/deploy.properties @@ -1,4 +1,4 @@ -DB_SERVERIP= +DB_SERVERIP=localhost DB_PORT=5432 SU_USER=postgres DEFAULT_DB_NAME=postgres From ae60d2a5b48db538146d1e6c808948af2d834670 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Wed, 12 Mar 2025 14:15:12 +0530 Subject: [PATCH 05/14] Added unit tests for creddential config service Signed-off-by: Piyush7034 --- certify-service/pom.xml | 5 - ...redentialConfigurationServiceImplTest.java | 199 ++++++++++++++++++ 2 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java diff --git a/certify-service/pom.xml b/certify-service/pom.xml index 69d9024ca..70bfcc18b 100644 --- a/certify-service/pom.xml +++ b/certify-service/pom.xml @@ -25,11 +25,6 @@ - - io.mosip.certify - mock-certify-plugin - 0.4.0-SNAPSHOT - org.springframework.boot spring-boot-starter-actuator diff --git a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java new file mode 100644 index 000000000..88f1e9d95 --- /dev/null +++ b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java @@ -0,0 +1,199 @@ +package io.mosip.certify.services; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.certify.core.dto.CredentialConfigResponse; +import io.mosip.certify.core.dto.CredentialConfigurationDTO; +import io.mosip.certify.core.exception.CertifyException; +import io.mosip.certify.entity.CredentialConfig; +import io.mosip.certify.repository.CredentialConfigRepository; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; + +import java.time.LocalDateTime; +import java.util.*; + +import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class CredentialConfigurationServiceImplTest { + @Mock + ObjectMapper objectMapper; + + @Mock + private CredentialConfigRepository credentialConfigRepository; + + @InjectMocks + private CredentialConfigurationServiceImpl credentialConfigurationService; + + @Mock + private CredentialConfigurationDTO credentialConfigurationDTO; + + @Mock + private CredentialConfig credentialConfig; + + @Before + public void setup() { + MockitoAnnotations.openMocks(this); + credentialConfigurationDTO = new CredentialConfigurationDTO(); + credentialConfigurationDTO.setVcTemplate("test_template"); + credentialConfigurationDTO.setContext(List.of("https://www.w3.org/2018/credentials/v1")); + credentialConfigurationDTO.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); + credentialConfigurationDTO.setCredentialFormat("ldp_vc"); + credentialConfigurationDTO.setDidUrl("did:web:test.github.io:test-env:test-folder"); + credentialConfigurationDTO.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); + credentialConfigurationDTO.setScope("test_vc_ldp"); + credentialConfigurationDTO.setCryptographicBindingMethodsSupported(List.of("did:jwk")); + credentialConfigurationDTO.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); + + credentialConfig = new CredentialConfig(); + String id = UUID.randomUUID().toString(); + credentialConfig.setId(id); + credentialConfig.setStatus("active"); + credentialConfig.setConfiguration("test-config-string"); + credentialConfig.setCreatedTime(LocalDateTime.now()); + } + + @Test + public void addNewCredentialConfig_Success() throws JsonProcessingException { + when(objectMapper.writeValueAsString(any(CredentialConfigurationDTO.class))) + .thenReturn("test-config-string"); + when(credentialConfigRepository.save(any(CredentialConfig.class))).thenReturn(credentialConfig); + + CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.addCredentialConfiguration(credentialConfigurationDTO); + + Assert.assertNotNull(credentialConfigResponse); + Assert.assertNotNull(credentialConfigResponse.getId()); + Assert.assertNotNull(credentialConfigResponse.getStatus()); + Assert.assertEquals("active", credentialConfigResponse.getStatus()); + } + + + @Test + public void addCredentialConfiguration_JsonProcessingException() throws JsonProcessingException { + when(objectMapper.writeValueAsString(any(CredentialConfigurationDTO.class))) + .thenThrow(new JsonProcessingException("Error processing JSON") {}); + + assertThrows(JsonProcessingException.class, () -> + credentialConfigurationService.addCredentialConfiguration(credentialConfigurationDTO)); + + verify(objectMapper).writeValueAsString(credentialConfigurationDTO); + verify(credentialConfigRepository, never()).save(any()); + } + + @Test + public void getCredentialConfigById_Success() throws JsonProcessingException { + Optional optional = Optional.of(credentialConfig); + when(credentialConfigRepository.findById(anyString())).thenReturn(optional); + when(objectMapper.readValue("test-config-string", CredentialConfigurationDTO.class)) + .thenReturn(credentialConfigurationDTO); + + CredentialConfigurationDTO credentialConfigurationDTOResponse = credentialConfigurationService.getCredentialConfigurationById("test"); + + Assert.assertNotNull(credentialConfigurationDTOResponse); + Assert.assertNotNull(credentialConfigurationDTOResponse.getCredentialType()); + Assert.assertNotNull(credentialConfigurationDTOResponse.getCredentialFormat()); + Assert.assertNotNull(credentialConfigurationDTOResponse.getContext()); + Assert.assertNotNull(credentialConfigurationDTOResponse.getVcTemplate()); + Assert.assertEquals("test_template", credentialConfigurationDTOResponse.getVcTemplate()); + Assert.assertEquals(List.of("https://www.w3.org/2018/credentials/v1"), credentialConfigurationDTOResponse.getContext()); + Assert.assertEquals(Arrays.asList("VerifiableCredential", "TestVerifiableCredential"), credentialConfigurationDTOResponse.getCredentialType()); + Assert.assertEquals("ldp_vc", credentialConfigurationDTOResponse.getCredentialFormat()); + } + + @Test + public void getCredentialConfigurationById_ConfigNotFound() { + when(credentialConfigRepository.findById("12345678")) + .thenReturn(Optional.empty()); + + CertifyException exception = assertThrows(CertifyException.class, () -> + credentialConfigurationService.getCredentialConfigurationById("12345678")); + + assertEquals("Configuration not found with the provided id: " + "12345678", exception.getMessage()); + } + + @Test + public void getCredentialConfigurationById_JsonProcessingException() throws JsonProcessingException { + Optional optional = Optional.of(credentialConfig); + when(credentialConfigRepository.findById("12345678")) + .thenReturn(optional); + + when(objectMapper.readValue(anyString(), eq(CredentialConfigurationDTO.class))) + .thenThrow(new JsonProcessingException("Error processing JSON") {}); + + assertThrows(JsonProcessingException.class, () -> + credentialConfigurationService.getCredentialConfigurationById("12345678")); + } + + @Test + public void updateExistingCredentialConfig_Success() throws JsonProcessingException { + Optional optional = Optional.of(credentialConfig); + when(credentialConfigRepository.findById(anyString())).thenReturn(optional); + when(objectMapper.writeValueAsString(any(CredentialConfigurationDTO.class))) + .thenReturn("test-config-string"); + + CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.updateCredentialConfiguration("12345678", credentialConfigurationDTO); + + Assert.assertNotNull(credentialConfigResponse); + Assert.assertNotNull(credentialConfigResponse.getId()); + Assert.assertNotNull(credentialConfigResponse.getStatus()); + Assert.assertEquals("active", credentialConfigResponse.getStatus()); + } + + @Test + public void updateExistingCredentialConfiguration_ConfigNotFound() { + when(credentialConfigRepository.findById(anyString())) + .thenReturn(Optional.empty()); + + CertifyException exception = assertThrows(CertifyException.class, () -> + credentialConfigurationService.getCredentialConfigurationById("12345678")); + + assertEquals("Configuration not found with the provided id: " + "12345678", exception.getMessage()); + } + + @Test + public void updateExistingCredentialConfiguration_JsonProcessingException() throws JsonProcessingException { + Optional optional = Optional.of(credentialConfig); + when(credentialConfigRepository.findById("12345678")) + .thenReturn(optional); + + when(objectMapper.writeValueAsString(any(CredentialConfigurationDTO.class))) + .thenThrow(new JsonProcessingException("Error processing JSON") {}); + + assertThrows(JsonProcessingException.class, () -> + credentialConfigurationService.updateCredentialConfiguration("12345678", credentialConfigurationDTO)); + } + + @Test + public void deleteCredentialConfig_Success() throws JsonProcessingException { + Optional optional = Optional.of(credentialConfig); + when(credentialConfigRepository.findById(anyString())).thenReturn(optional); + doNothing().when(credentialConfigRepository).deleteById(anyString()); + + String result = credentialConfigurationService.deleteCredentialConfigurationById("12345678"); + + Assert.assertNotNull(result); + assertEquals("Configuration deleted with id: " + "12345678", result); + } + + @Test + public void deleteCredentialConfiguration_ConfigNotFound() { + when(credentialConfigRepository.findById(anyString())) + .thenReturn(Optional.empty()); + + CertifyException exception = assertThrows(CertifyException.class, () -> + credentialConfigurationService.deleteCredentialConfigurationById("12345678")); + + assertEquals("Configuration not found with the provided id: " + "12345678", exception.getMessage()); + } +} From d2cb80c3340999ac64b8b4c317a474397d3201d4 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Mon, 17 Mar 2025 19:28:49 +0530 Subject: [PATCH 06/14] Added seperate attributes for credential config entity Signed-off-by: Piyush7034 --- .../core/dto/CredentialConfigurationDTO.java | 7 +- .../dto/CredentialConfigurationSupported.java | 2 +- ...Display.java => CredentialDisplayDTO.java} | 2 +- .../spi/CredentialConfigurationService.java | 3 + .../CredentialConfigController.java | 17 +- .../controller/IssuerMetadataController.java | 5 +- .../certify/entity/CredentialConfig.java | 62 ++++++- .../certify/entity/CredentialDisplay.java | 32 ++++ .../CredentialDisplayRepository.java | 7 + .../services/CertifyIssuanceServiceImpl.java | 16 -- .../CredentialConfigurationServiceImpl.java | 159 ++++++++++++++++-- .../services/VCIssuanceServiceImpl.java | 5 - .../certify/TestVCIssuanceServiceImpl.java | 5 - .../CredentialConfigControllerTest.java | 55 ++++-- .../IssuerMetadataControllerTest.java | 75 --------- ...redentialConfigurationServiceImplTest.java | 105 +++++------- .../resources/application-test.properties | 1 + .../ddl/certify-credential_config.sql | 44 +++-- .../ddl/certify-credential_display.sql | 29 ++++ 19 files changed, 418 insertions(+), 213 deletions(-) rename certify-core/src/main/java/io/mosip/certify/core/dto/{CredentialDisplay.java => CredentialDisplayDTO.java} (91%) create mode 100644 certify-service/src/main/java/io/mosip/certify/entity/CredentialDisplay.java create mode 100644 certify-service/src/main/java/io/mosip/certify/repository/CredentialDisplayRepository.java delete mode 100644 certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java create mode 100644 db_scripts/mosip_certify/ddl/certify-credential_display.sql diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java index d02c20ae2..54a44a4cc 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java @@ -30,7 +30,7 @@ public class CredentialConfigurationDTO { @Valid @NotNull(message = ErrorConstants.INVALID_REQUEST) - private CredentialDisplay display; + private CredentialDisplayDTO display; private List order; @@ -41,6 +41,7 @@ public class CredentialConfigurationDTO { @JsonProperty("cryptographic_binding_methods_supported") private List cryptographicBindingMethodsSupported; + @NotNull @JsonProperty("credential_signing_alg_values_supported") private List credentialSigningAlgValuesSupported; @@ -48,5 +49,9 @@ public class CredentialConfigurationDTO { @JsonProperty("proof_types_supported") private Map proofTypesSupported; + @NotNull(message = ErrorConstants.INVALID_REQUEST) + @JsonProperty("credentialSubject") + private Map credentialSubject; + private List> pluginConfigurations; } diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java index 86ea37f2c..10f39956e 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java @@ -25,7 +25,7 @@ public class CredentialConfigurationSupported { @JsonProperty("credential_definition") private CredentialDefinition credentialDefinition; - private List display; + private CredentialDisplayDTO display; private List order; } diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplay.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplayDTO.java similarity index 91% rename from certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplay.java rename to certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplayDTO.java index c765401d0..1127aa48b 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplay.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplayDTO.java @@ -6,7 +6,7 @@ import java.util.Map; @Data -public class CredentialDisplay { +public class CredentialDisplayDTO { private String name; diff --git a/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java b/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java index bf318e62e..1c83172c0 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java +++ b/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import io.mosip.certify.core.dto.CredentialConfigResponse; import io.mosip.certify.core.dto.CredentialConfigurationDTO; +import io.mosip.certify.core.dto.CredentialIssuerMetadata; public interface CredentialConfigurationService { @@ -13,4 +14,6 @@ public interface CredentialConfigurationService { CredentialConfigResponse updateCredentialConfiguration(String id, CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException; String deleteCredentialConfigurationById(String id); + + CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version); } diff --git a/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java index 37a36cfe6..a7422d4cb 100644 --- a/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java +++ b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import io.mosip.certify.core.dto.CredentialConfigResponse; import io.mosip.certify.core.dto.CredentialConfigurationDTO; +import io.mosip.certify.core.dto.CredentialIssuerMetadata; import io.mosip.certify.core.spi.CredentialConfigurationService; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; @@ -15,27 +16,27 @@ @Slf4j @RestController -@RequestMapping("/configurations") +@RequestMapping("/credentials") public class CredentialConfigController { @Autowired private CredentialConfigurationService credentialConfigurationService; - @PostMapping(produces = "application/json") + @PostMapping(value = "/configurations", produces = "application/json") public ResponseEntity addCredentialConfiguration(@Valid @RequestBody CredentialConfigurationDTO credentialConfigurationRequest) throws JsonProcessingException { CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.addCredentialConfiguration(credentialConfigurationRequest); return new ResponseEntity<>(credentialConfigResponse, HttpStatus.CREATED); } - @GetMapping(value = "/{configurationId}", produces = "application/json") + @GetMapping(value = "/configurations/{configurationId}", produces = "application/json") public ResponseEntity getCredentialConfigurationById(@PathVariable String configurationId) throws JsonProcessingException { CredentialConfigurationDTO credentialConfigurationDTO = credentialConfigurationService.getCredentialConfigurationById(configurationId); return new ResponseEntity<>(credentialConfigurationDTO, HttpStatus.OK); } - @PutMapping(value = "/{configurationId}", produces = "application/json") + @PutMapping(value = "/configurations/{configurationId}", produces = "application/json") public ResponseEntity updateCredentialConfiguration(@PathVariable String configurationId, @Valid @RequestBody CredentialConfigurationDTO credentialConfigurationRequest) throws JsonProcessingException { @@ -43,10 +44,16 @@ public ResponseEntity updateCredentialConfiguration(@P return new ResponseEntity<>(credentialConfigResponse, HttpStatus.OK); } - @DeleteMapping(value = "/{configurationId}", produces = "application/json") + @DeleteMapping(value = "/configurations/{configurationId}", produces = "application/json") public ResponseEntity deleteCredentialConfigurationById(@PathVariable String configurationId) { String response = credentialConfigurationService.deleteCredentialConfigurationById(configurationId); return new ResponseEntity<>(response, HttpStatus.OK); } + + @GetMapping(value = "/.well-known/openid-credential-issuer", produces = "application/json") + public CredentialIssuerMetadata getCredentialIssuerMetadata( + @RequestParam(name = "version", required = false, defaultValue = "latest") String version) { + return credentialConfigurationService.fetchCredentialIssuerMetadata(version); + } } diff --git a/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java b/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java index 0d6c13d71..345e58dba 100644 --- a/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java +++ b/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java @@ -1,6 +1,7 @@ package io.mosip.certify.controller; import io.mosip.certify.core.dto.CredentialIssuerMetadata; +import io.mosip.certify.core.spi.CredentialConfigurationService; import io.mosip.certify.core.spi.VCIssuanceService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -15,11 +16,11 @@ public class IssuerMetadataController { @Autowired - private VCIssuanceService vcIssuanceService; + private CredentialConfigurationService credentialConfigurationService; @GetMapping(value = "/.well-known/openid-credential-issuer", produces = "application/json") public CredentialIssuerMetadata getCredentialIssuerMetadata( @RequestParam(name = "version", required = false, defaultValue = "latest") String version) { - return vcIssuanceService.fetchCredentialIssuerMetadata(version); + return credentialConfigurationService.fetchCredentialIssuerMetadata(version); } } diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java index c2655c04f..d8cb4f566 100644 --- a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java +++ b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java @@ -1,14 +1,15 @@ package io.mosip.certify.entity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import jakarta.validation.constraints.NotBlank; +import jakarta.persistence.*; +import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import lombok.Data; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; @Data @Entity @@ -19,7 +20,56 @@ public class CredentialConfig { private String status; - private String configuration; + @NotNull(message = "Invalid request") + private String vcTemplate; + + @NotNull(message = "Invalid request") + @Column(name = "context", columnDefinition = "TEXT[]") + private List context; + + @NotNull(message = "Invalid request") + @Column(name="credentialType", columnDefinition = "TEXT[]") + private List credentialType; + + @NotNull(message = "Invalid request") + private String credentialFormat; + + @NotNull(message = "Invalid request") + private String didUrl; + + @Valid + @NotNull(message = "Invalid request") + @OneToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "display_id") + private CredentialDisplay display; + + @Column(name = "display_order", columnDefinition = "TEXT[]") + private List order; + + @NotNull(message = "Invalid request") + private String scope; + + @NotNull(message = "Invalid request") + @Column(name = "cryptographic_binding_methods_supported", columnDefinition = "TEXT[]") + private List cryptographicBindingMethodsSupported; + + @NotNull(message = "Invalid request") + @Column(name = "credential_signing_alg_values_supported", columnDefinition = "TEXT[]") + private List credentialSigningAlgValuesSupported; + + @NotNull(message = "Invalid request") + @JdbcTypeCode(SqlTypes.JSON) + @Column(name = "proof_types_supported", columnDefinition = "jsonb") + private Map proofTypesSupported; + + @NotNull(message = "Invalid request") + @JdbcTypeCode(SqlTypes.JSON) + @Column(name = "credential_subject", columnDefinition = "jsonb") + private Map credentialSubject; + + @JdbcTypeCode(SqlTypes.JSON) + @Column(name = "plugin_configurations", columnDefinition = "jsonb[]") + private List> pluginConfigurations; @NotNull @Column(name = "cr_dtimes") diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialDisplay.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialDisplay.java new file mode 100644 index 000000000..c90222b43 --- /dev/null +++ b/certify-service/src/main/java/io/mosip/certify/entity/CredentialDisplay.java @@ -0,0 +1,32 @@ +package io.mosip.certify.entity; + +import jakarta.persistence.*; +import lombok.Data; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.util.Map; + +@Entity +@Table(name = "credential_display") +@Data +public class CredentialDisplay { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + private String locale; + + @JdbcTypeCode(SqlTypes.JSON) + @Column(columnDefinition = "jsonb") + private Map logo; + + @Column(name = "background_color") + private String backgroundColor; + + @Column(name = "text_color") + private String textColor; +} \ No newline at end of file diff --git a/certify-service/src/main/java/io/mosip/certify/repository/CredentialDisplayRepository.java b/certify-service/src/main/java/io/mosip/certify/repository/CredentialDisplayRepository.java new file mode 100644 index 000000000..6087f496d --- /dev/null +++ b/certify-service/src/main/java/io/mosip/certify/repository/CredentialDisplayRepository.java @@ -0,0 +1,7 @@ +package io.mosip.certify.repository; + +import io.mosip.certify.entity.CredentialDisplay; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CredentialDisplayRepository extends JpaRepository { +} diff --git a/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java index 0ca7a118b..36e624a51 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java @@ -461,20 +461,4 @@ private VCIssuanceTransaction createVCITransaction() { transaction.setCNonceExpireSeconds(cNonceExpireSeconds); return vciCacheService.setVCITransaction(parsedAccessToken.getAccessTokenHash(), transaction); } - - @Override - public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { - LinkedHashMap originalIssuerMetadata = new LinkedHashMap<>(issuerMetadata.get("latest")); - - CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); - credentialIssuerMetadata.setCredentialIssuer((String) originalIssuerMetadata.get("credential_issuer")); - credentialIssuerMetadata.setAuthorizationServers((List) originalIssuerMetadata.get("authorization_servers")); - credentialIssuerMetadata.setCredentialEndpoint((String) originalIssuerMetadata.get("credential_endpoint")); - credentialIssuerMetadata.setDisplay((List>) originalIssuerMetadata.get("display")); - - Map credentialConfigurationSupported = (Map) originalIssuerMetadata.get("credential_configurations_supported"); - credentialIssuerMetadata.setCredentialConfigurationSupported(credentialConfigurationSupported); - - return credentialIssuerMetadata; - } } diff --git a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java index 1b48f13c8..ca93b8469 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java @@ -3,36 +3,66 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.certify.core.constants.Constants; -import io.mosip.certify.core.dto.CredentialConfigResponse; -import io.mosip.certify.core.dto.CredentialConfigurationDTO; +import io.mosip.certify.core.dto.*; import io.mosip.certify.core.exception.CertifyException; import io.mosip.certify.core.spi.CredentialConfigurationService; import io.mosip.certify.entity.CredentialConfig; +import io.mosip.certify.entity.CredentialDisplay; import io.mosip.certify.repository.CredentialConfigRepository; +import io.mosip.certify.repository.CredentialDisplayRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.time.LocalDateTime; -import java.util.Optional; -import java.util.UUID; +import java.util.*; @Slf4j @Component public class CredentialConfigurationServiceImpl implements CredentialConfigurationService { - @Autowired - private ObjectMapper objectMapper; @Autowired private CredentialConfigRepository credentialConfigRepository; + @Autowired + private CredentialDisplayRepository credentialDisplayRepository; + + @Value("${mosip.certify.identifier}") + private String credentialIssuer; + + @Value("#{'${mosip.certify.authorization.url}'.split(',')}") + private List authServers; + + @Value("${server.servlet.path}") + private String servletPath; + @Override public CredentialConfigResponse addCredentialConfiguration(CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException { CredentialConfig credentialConfig = new CredentialConfig(); credentialConfig.setId(UUID.randomUUID().toString()); credentialConfig.setStatus(Constants.ACTIVE); - String configuration = objectMapper.writeValueAsString(credentialConfigurationDTO); - credentialConfig.setConfiguration(configuration); + credentialConfig.setVcTemplate(credentialConfigurationDTO.getVcTemplate()); + credentialConfig.setContext(credentialConfigurationDTO.getContext()); + credentialConfig.setCredentialType(credentialConfigurationDTO.getCredentialType()); + credentialConfig.setCredentialFormat(credentialConfigurationDTO.getCredentialFormat()); + credentialConfig.setDidUrl(credentialConfigurationDTO.getDidUrl()); + + CredentialDisplay credentialDisplayEntity = new CredentialDisplay(); + credentialDisplayEntity.setBackgroundColor(credentialConfigurationDTO.getDisplay().getBackgroundColor()); + credentialDisplayEntity.setName(credentialConfigurationDTO.getDisplay().getName()); + credentialDisplayEntity.setLogo(credentialConfigurationDTO.getDisplay().getLogo()); + credentialDisplayEntity.setLocale(credentialConfigurationDTO.getDisplay().getLocale()); + credentialDisplayEntity.setTextColor(credentialConfigurationDTO.getDisplay().getTextColor()); + credentialConfig.setDisplay(credentialDisplayEntity); + + credentialConfig.setOrder(credentialConfigurationDTO.getOrder()); + credentialConfig.setScope(credentialConfigurationDTO.getScope()); + credentialConfig.setCryptographicBindingMethodsSupported(credentialConfigurationDTO.getCryptographicBindingMethodsSupported()); + credentialConfig.setCredentialSigningAlgValuesSupported(credentialConfigurationDTO.getCredentialSigningAlgValuesSupported()); + credentialConfig.setProofTypesSupported(credentialConfigurationDTO.getProofTypesSupported()); + credentialConfig.setCredentialSubject(credentialConfigurationDTO.getCredentialSubject()); +// credentialConfig.setPluginConfigurations(credentialConfigurationDTO.getPluginConfigurations()); credentialConfig.setCreatedTime(LocalDateTime.now()); credentialConfigRepository.save(credentialConfig); @@ -56,8 +86,27 @@ public CredentialConfigurationDTO getCredentialConfigurationById(String id) thro throw new CertifyException("Configuration not active."); } - String configuration = credentialConfig.getConfiguration(); - CredentialConfigurationDTO credentialConfigurationDTO = objectMapper.readValue(configuration, CredentialConfigurationDTO.class); + CredentialConfigurationDTO credentialConfigurationDTO = new CredentialConfigurationDTO(); + credentialConfigurationDTO.setVcTemplate(credentialConfig.getVcTemplate()); + credentialConfigurationDTO.setContext(credentialConfig.getContext()); + credentialConfigurationDTO.setCredentialType(credentialConfig.getCredentialType()); + credentialConfigurationDTO.setCredentialFormat(credentialConfig.getCredentialFormat()); + credentialConfigurationDTO.setDidUrl(credentialConfig.getDidUrl()); + + CredentialDisplayDTO credentialDisplayDTO = new CredentialDisplayDTO(); + credentialDisplayDTO.setBackgroundColor(credentialConfig.getDisplay().getBackgroundColor()); + credentialDisplayDTO.setName(credentialConfig.getDisplay().getName()); + credentialDisplayDTO.setLogo(credentialConfig.getDisplay().getLogo()); + credentialDisplayDTO.setLocale(credentialConfig.getDisplay().getLocale()); + credentialDisplayDTO.setTextColor(credentialConfig.getDisplay().getTextColor()); + credentialConfigurationDTO.setDisplay(credentialDisplayDTO); + + credentialConfigurationDTO.setOrder(credentialConfig.getOrder()); + credentialConfigurationDTO.setScope(credentialConfig.getScope()); + credentialConfigurationDTO.setCryptographicBindingMethodsSupported(credentialConfig.getCryptographicBindingMethodsSupported()); + credentialConfigurationDTO.setCredentialSigningAlgValuesSupported(credentialConfig.getCredentialSigningAlgValuesSupported()); + credentialConfigurationDTO.setProofTypesSupported(credentialConfig.getProofTypesSupported()); + credentialConfigurationDTO.setCredentialSubject(credentialConfig.getCredentialSubject()); return credentialConfigurationDTO; } @@ -70,8 +119,26 @@ public CredentialConfigResponse updateCredentialConfiguration(String id, Credent } CredentialConfig credentialConfig = optional.get(); - String configuration = objectMapper.writeValueAsString(credentialConfigurationDTO); - credentialConfig.setConfiguration(configuration); + credentialConfig.setVcTemplate(credentialConfigurationDTO.getVcTemplate()); + credentialConfig.setContext(credentialConfigurationDTO.getContext()); + credentialConfig.setCredentialType(credentialConfigurationDTO.getCredentialType()); + credentialConfig.setCredentialFormat(credentialConfigurationDTO.getCredentialFormat()); + credentialConfig.setDidUrl(credentialConfigurationDTO.getDidUrl()); + + CredentialDisplay credentialDisplayEntity = new CredentialDisplay(); + credentialDisplayEntity.setBackgroundColor(credentialConfigurationDTO.getDisplay().getBackgroundColor()); + credentialDisplayEntity.setName(credentialConfigurationDTO.getDisplay().getName()); + credentialDisplayEntity.setLogo(credentialConfigurationDTO.getDisplay().getLogo()); + credentialDisplayEntity.setLocale(credentialConfigurationDTO.getDisplay().getLocale()); + credentialDisplayEntity.setTextColor(credentialConfigurationDTO.getDisplay().getTextColor()); + credentialConfig.setDisplay(credentialDisplayEntity); + + credentialConfig.setOrder(credentialConfigurationDTO.getOrder()); + credentialConfig.setScope(credentialConfigurationDTO.getScope()); + credentialConfig.setCryptographicBindingMethodsSupported(credentialConfigurationDTO.getCryptographicBindingMethodsSupported()); + credentialConfig.setCredentialSigningAlgValuesSupported(credentialConfigurationDTO.getCredentialSigningAlgValuesSupported()); + credentialConfig.setProofTypesSupported(credentialConfigurationDTO.getProofTypesSupported()); + credentialConfig.setCredentialSubject(credentialConfigurationDTO.getCredentialSubject()); credentialConfigRepository.save(credentialConfig); CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); @@ -89,7 +156,75 @@ public String deleteCredentialConfigurationById(String id) { throw new CertifyException("Configuration not found with the provided id: " + id); } + CredentialConfig credentialConfig = optional.get(); + + Optional optionalCredentialDisplay = credentialDisplayRepository.findById(credentialConfig.getDisplay().getId()); + if(optionalCredentialDisplay.isEmpty()) { + throw new CertifyException("Credential display not found for the provided configuration id: " + id); + } + + credentialDisplayRepository.deleteById(credentialConfig.getDisplay().getId()); credentialConfigRepository.deleteById(id); return "Configuration deleted with id: " + id; } + + @Override + public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { + CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); + credentialIssuerMetadata.setCredentialIssuer(credentialIssuer); + credentialIssuerMetadata.setAuthorizationServers(authServers); + String credentialEndpoint = credentialIssuer + servletPath + "/issuance" + (!version.equals("latest") ? "/" +version : "") + "/credential" ; + credentialIssuerMetadata.setCredentialEndpoint(credentialEndpoint); +// credentialIssuerMetadata.setDisplay((List>) originalIssuerMetadata.get("display")); + List credentialConfigList = credentialConfigRepository.findAll(); + Map credentialConfigurationSupportedMap = new HashMap<>(); + credentialConfigList.stream() + .forEach(credentialConfig -> { + CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); + credentialConfigurationSupported.setFormat(credentialConfig.getCredentialFormat()); + credentialConfigurationSupported.setScope(credentialConfig.getScope()); + credentialConfigurationSupported.setCryptographicBindingMethodsSupported(credentialConfig.getCryptographicBindingMethodsSupported()); + credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(credentialConfig.getCredentialSigningAlgValuesSupported()); + credentialConfigurationSupported.setProofTypesSupported(credentialConfig.getProofTypesSupported()); + + CredentialDisplayDTO credentialDisplayDTO = new CredentialDisplayDTO(); + credentialDisplayDTO.setBackgroundColor(credentialConfig.getDisplay().getBackgroundColor()); + credentialDisplayDTO.setName(credentialConfig.getDisplay().getName()); + credentialDisplayDTO.setLogo(credentialConfig.getDisplay().getLogo()); + credentialDisplayDTO.setLocale(credentialConfig.getDisplay().getLocale()); + credentialDisplayDTO.setTextColor(credentialConfig.getDisplay().getTextColor()); + credentialConfigurationSupported.setDisplay(credentialDisplayDTO); + credentialConfigurationSupported.setOrder(credentialConfig.getOrder()); + + CredentialDefinition credentialDefinition = new CredentialDefinition(); + credentialDefinition.setType(credentialConfig.getCredentialType()); + credentialDefinition.setContext(credentialConfig.getContext()); + credentialDefinition.setCredentialSubject(credentialConfig.getCredentialSubject()); + credentialConfigurationSupported.setCredentialDefinition(credentialDefinition); + + String credentialType = credentialConfig.getCredentialType().get(1); + + credentialConfigurationSupportedMap.put(credentialType, credentialConfigurationSupported); + }); + + credentialIssuerMetadata.setCredentialConfigurationSupported(credentialConfigurationSupportedMap); + return credentialIssuerMetadata; + } + + +// @Override +// public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { +// LinkedHashMap originalIssuerMetadata = new LinkedHashMap<>(issuerMetadata.get("latest")); +// +// CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); +// credentialIssuerMetadata.setCredentialIssuer((String) originalIssuerMetadata.get("credential_issuer")); +// credentialIssuerMetadata.setAuthorizationServers((List) originalIssuerMetadata.get("authorization_servers")); +// credentialIssuerMetadata.setCredentialEndpoint((String) originalIssuerMetadata.get("credential_endpoint")); +// credentialIssuerMetadata.setDisplay((List>) originalIssuerMetadata.get("display")); +// +// Map credentialConfigurationSupported = (Map) originalIssuerMetadata.get("credential_configurations_supported"); +// credentialIssuerMetadata.setCredentialConfigurationSupported(credentialConfigurationSupported); +// +// return credentialIssuerMetadata; +// } } diff --git a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java index 4284bd92d..90df502c8 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java @@ -378,9 +378,4 @@ private VCIssuanceTransaction createVCITransaction() { transaction.setCNonceExpireSeconds(cNonceExpireSeconds); return vciCacheService.setVCITransaction(parsedAccessToken.getAccessTokenHash(), transaction); } - - @Override - public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { - return new CredentialIssuerMetadata(); - } } \ No newline at end of file diff --git a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java index 2399320e5..8dd6ef47d 100644 --- a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java +++ b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java @@ -32,9 +32,4 @@ public Map getCredentialIssuerMetadata(String version) { public Map getDIDDocument() { throw new InvalidRequestException(ErrorConstants.UNSUPPORTED_IN_CURRENT_PLUGIN_MODE); } - - @Override - public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { - return new CredentialIssuerMetadata(); - } } diff --git a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java index 2af1fe94b..35ed066db 100644 --- a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java +++ b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java @@ -39,9 +39,6 @@ public class CredentialConfigControllerTest { @MockBean CredentialConfigurationService credentialConfigurationService; - @MockBean - VCIssuanceService vcIssuanceService; - @Mock private CredentialConfigurationDTO credentialConfigurationDTO; @@ -53,7 +50,7 @@ public void setup() { credentialConfigurationDTO.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); credentialConfigurationDTO.setCredentialFormat("ldp_vc"); credentialConfigurationDTO.setDidUrl("did:web:test.github.io:test-env:test-folder"); - CredentialDisplay credentialDisplay = new CredentialDisplay(); + CredentialDisplayDTO credentialDisplay = new CredentialDisplayDTO(); credentialDisplay.setName("Test Verifiable Credential"); credentialDisplay.setLocale("en"); credentialDisplay.setBackgroundColor("#FDFAF9"); @@ -71,18 +68,17 @@ public void setup() { pluginConfigMap.put("mosip.certify.mock.data-provider.test-two", "valueTwo"); pluginConfigMap.put("mosip.certify.mock.data-provider.test-three", "valueThree"); credentialConfigurationDTO.setPluginConfigurations(List.of(pluginConfigMap)); + credentialConfigurationDTO.setCredentialSubject(Map.of("name", "Full Name")); } @Test public void addNewCredentialConfiguration_Success() throws Exception { - - CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); credentialConfigResponse.setId("farmer-credential-config-001"); credentialConfigResponse.setStatus("active"); Mockito.when(credentialConfigurationService.addCredentialConfiguration(credentialConfigurationDTO)).thenReturn(credentialConfigResponse); - mockMvc.perform(post("/configurations") + mockMvc.perform(post("/credentials/configurations") .content(objectMapper.writeValueAsBytes(credentialConfigurationDTO)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isCreated()) @@ -95,7 +91,7 @@ public void getCredentialConfigurationById_Success() throws Exception { Mockito.when(credentialConfigurationService.getCredentialConfigurationById(Mockito.anyString())).thenReturn(credentialConfigurationDTO); - mockMvc.perform(get("/configurations/1")) + mockMvc.perform(get("/credentials/configurations/1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.vcTemplate").exists()) .andExpect(jsonPath("$.context").exists()) @@ -114,7 +110,7 @@ public void updateExistingCredentialConfiguration_Success() throws Exception { credentialConfigResponse.setStatus("active"); Mockito.when(credentialConfigurationService.updateCredentialConfiguration(Mockito.anyString(), eq(credentialConfigurationDTO))).thenReturn(credentialConfigResponse); - mockMvc.perform(put("/configurations/1") + mockMvc.perform(put("/credentials/configurations/1") .content(objectMapper.writeValueAsBytes(credentialConfigurationDTO)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) @@ -127,8 +123,47 @@ public void deleteExistingCredentialConfiguration_Success() throws Exception { String response = "Configuration deleted with id: 1"; Mockito.when(credentialConfigurationService.deleteCredentialConfigurationById(Mockito.anyString())).thenReturn(response); - mockMvc.perform(delete("/configurations/1")) + mockMvc.perform(delete("/credentials/configurations/1")) .andExpect(status().isOk()) .andExpect(content().string(response)); } + + @Test + public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { + CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); + credentialIssuerMetadata.setCredentialIssuer("https://localhost:9090"); + credentialIssuerMetadata.setAuthorizationServers(List.of("https://example.com/auth")); + credentialIssuerMetadata.setCredentialEndpoint("https://localhost:9090/v1/certify/issuance/credential"); + Map display = new HashMap<>(); + display.put("name", "Test Credential Issuer"); + display.put("locale", "en"); + credentialIssuerMetadata.setDisplay(List.of(display)); + + CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); + credentialConfigurationSupported.setFormat("ldp_vc"); + credentialConfigurationSupported.setScope("test_vc_ldp"); + credentialConfigurationSupported.setCryptographicBindingMethodsSupported(List.of("did:jwk")); + credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); + Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); + credentialConfigurationSupported.setProofTypesSupported(jwtValues); + CredentialDisplayDTO credentialDisplay = new CredentialDisplayDTO(); + credentialDisplay.setName("Test Verifiable Credential"); + credentialDisplay.setLocale("en"); + credentialDisplay.setBackgroundColor("#FDFAF9"); + credentialDisplay.setTextColor("#7C4616"); + credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); + credentialConfigurationSupported.setDisplay(credentialDisplay); + credentialConfigurationSupported.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); + credentialIssuerMetadata.setCredentialConfigurationSupported(Map.of("TestCredential_ldp", credentialConfigurationSupported)); + + Mockito.when(credentialConfigurationService.fetchCredentialIssuerMetadata(Mockito.anyString())).thenReturn(credentialIssuerMetadata); + + mockMvc.perform(get("/credentials/.well-known/openid-credential-issuer")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.credential_issuer").exists()) + .andExpect(jsonPath("$.credential_configurations_supported").exists()) + .andExpect(header().string("Content-Type", "application/json")); + + Mockito.verify(credentialConfigurationService).fetchCredentialIssuerMetadata("latest"); + } } diff --git a/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java deleted file mode 100644 index df1facce7..000000000 --- a/certify-service/src/test/java/io/mosip/certify/controller/IssuerMetadataControllerTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package io.mosip.certify.controller; - -import io.mosip.certify.core.dto.CredentialConfigurationSupported; -import io.mosip.certify.core.dto.CredentialDisplay; -import io.mosip.certify.core.dto.CredentialIssuerMetadata; -import io.mosip.certify.core.dto.ParsedAccessToken; -import io.mosip.certify.core.spi.VCIssuanceService; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -@RunWith(SpringRunner.class) -@WebMvcTest(value = IssuerMetadataController.class) -public class IssuerMetadataControllerTest { - @Autowired - MockMvc mockMvc; - - @MockBean - ParsedAccessToken parsedAccessToken; - - @MockBean - VCIssuanceService vcIssuanceService; - - @Test - public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { - CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); - credentialIssuerMetadata.setCredentialIssuer("https://localhost:9090"); - credentialIssuerMetadata.setAuthorizationServers(List.of("https://example.com/auth")); - credentialIssuerMetadata.setCredentialEndpoint("https://localhost:9090/v1/certify/issuance/credential"); - Map display = new HashMap<>(); - display.put("name", "Test Credential Issuer"); - display.put("locale", "en"); - credentialIssuerMetadata.setDisplay(List.of(display)); - - CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); - credentialConfigurationSupported.setFormat("ldp_vc"); - credentialConfigurationSupported.setScope("test_vc_ldp"); - credentialConfigurationSupported.setCryptographicBindingMethodsSupported(List.of("did:jwk")); - credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); - Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); - credentialConfigurationSupported.setProofTypesSupported(jwtValues); - CredentialDisplay credentialDisplay = new CredentialDisplay(); - credentialDisplay.setName("Test Verifiable Credential"); - credentialDisplay.setLocale("en"); - credentialDisplay.setBackgroundColor("#FDFAF9"); - credentialDisplay.setTextColor("#7C4616"); - credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); - credentialConfigurationSupported.setDisplay(List.of(credentialDisplay)); - credentialConfigurationSupported.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); - credentialIssuerMetadata.setCredentialConfigurationSupported(Map.of("TestCredential_ldp", credentialConfigurationSupported)); - - Mockito.when(vcIssuanceService.fetchCredentialIssuerMetadata(Mockito.anyString())).thenReturn(credentialIssuerMetadata); - - mockMvc.perform(get("/issuer-metadata/.well-known/openid-credential-issuer")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.credential_issuer").exists()) - .andExpect(jsonPath("$.credential_configurations_supported").exists()) - .andExpect(header().string("Content-Type", "application/json")); - - Mockito.verify(vcIssuanceService).fetchCredentialIssuerMetadata("latest"); - } -} diff --git a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java index 88f1e9d95..d6e2c8002 100644 --- a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java +++ b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java @@ -4,9 +4,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.certify.core.dto.CredentialConfigResponse; import io.mosip.certify.core.dto.CredentialConfigurationDTO; +import io.mosip.certify.core.dto.CredentialDisplayDTO; import io.mosip.certify.core.exception.CertifyException; import io.mosip.certify.entity.CredentialConfig; +import io.mosip.certify.entity.CredentialDisplay; import io.mosip.certify.repository.CredentialConfigRepository; +import io.mosip.certify.repository.CredentialDisplayRepository; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -15,8 +18,8 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.test.util.ReflectionTestUtils; -import java.time.LocalDateTime; import java.util.*; import static org.junit.Assert.assertThrows; @@ -27,12 +30,13 @@ @RunWith(MockitoJUnitRunner.class) public class CredentialConfigurationServiceImplTest { - @Mock - ObjectMapper objectMapper; @Mock private CredentialConfigRepository credentialConfigRepository; + @Mock + private CredentialDisplayRepository credentialDisplayRepository; + @InjectMocks private CredentialConfigurationServiceImpl credentialConfigurationService; @@ -42,32 +46,46 @@ public class CredentialConfigurationServiceImplTest { @Mock private CredentialConfig credentialConfig; + @Mock + private CredentialDisplay credentialDisplay; + @Before public void setup() { MockitoAnnotations.openMocks(this); - credentialConfigurationDTO = new CredentialConfigurationDTO(); - credentialConfigurationDTO.setVcTemplate("test_template"); - credentialConfigurationDTO.setContext(List.of("https://www.w3.org/2018/credentials/v1")); - credentialConfigurationDTO.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); - credentialConfigurationDTO.setCredentialFormat("ldp_vc"); - credentialConfigurationDTO.setDidUrl("did:web:test.github.io:test-env:test-folder"); - credentialConfigurationDTO.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); - credentialConfigurationDTO.setScope("test_vc_ldp"); - credentialConfigurationDTO.setCryptographicBindingMethodsSupported(List.of("did:jwk")); - credentialConfigurationDTO.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); - credentialConfig = new CredentialConfig(); String id = UUID.randomUUID().toString(); credentialConfig.setId(id); credentialConfig.setStatus("active"); - credentialConfig.setConfiguration("test-config-string"); - credentialConfig.setCreatedTime(LocalDateTime.now()); + credentialConfig.setVcTemplate("test_template"); + credentialConfig.setContext(List.of("https://www.w3.org/2018/credentials/v1")); + credentialConfig.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); + credentialConfig.setCredentialFormat("ldp_vc"); + credentialConfig.setDidUrl("did:web:test.github.io:test-env:test-folder"); + credentialConfig.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); + credentialConfig.setScope("test_vc_ldp"); + credentialConfig.setCryptographicBindingMethodsSupported(List.of("did:jwk")); + credentialConfig.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); + credentialConfig.setCredentialSubject(Map.of("name", "Full Name")); + + credentialDisplay = new CredentialDisplay(); + credentialDisplay.setId(1L); + credentialDisplay.setName("Test Credential"); + credentialDisplay.setLocale("en"); + credentialDisplay.setTextColor("#FFFFFF"); + credentialDisplay.setBackgroundColor("#12107c"); + credentialDisplay.setLogo(Map.of("test1", "value1")); + credentialConfig.setDisplay(credentialDisplay); + + credentialConfigurationDTO = new CredentialConfigurationDTO(); + credentialConfigurationDTO.setDisplay(new CredentialDisplayDTO()); + + ReflectionTestUtils.setField(credentialConfigurationService, "credentialIssuer", "http://example.com"); + ReflectionTestUtils.setField(credentialConfigurationService, "authServers", List.of("http://auth.com")); + ReflectionTestUtils.setField(credentialConfigurationService, "servletPath", "v1/test"); } @Test public void addNewCredentialConfig_Success() throws JsonProcessingException { - when(objectMapper.writeValueAsString(any(CredentialConfigurationDTO.class))) - .thenReturn("test-config-string"); when(credentialConfigRepository.save(any(CredentialConfig.class))).thenReturn(credentialConfig); CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.addCredentialConfiguration(credentialConfigurationDTO); @@ -78,25 +96,10 @@ public void addNewCredentialConfig_Success() throws JsonProcessingException { Assert.assertEquals("active", credentialConfigResponse.getStatus()); } - - @Test - public void addCredentialConfiguration_JsonProcessingException() throws JsonProcessingException { - when(objectMapper.writeValueAsString(any(CredentialConfigurationDTO.class))) - .thenThrow(new JsonProcessingException("Error processing JSON") {}); - - assertThrows(JsonProcessingException.class, () -> - credentialConfigurationService.addCredentialConfiguration(credentialConfigurationDTO)); - - verify(objectMapper).writeValueAsString(credentialConfigurationDTO); - verify(credentialConfigRepository, never()).save(any()); - } - @Test public void getCredentialConfigById_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); when(credentialConfigRepository.findById(anyString())).thenReturn(optional); - when(objectMapper.readValue("test-config-string", CredentialConfigurationDTO.class)) - .thenReturn(credentialConfigurationDTO); CredentialConfigurationDTO credentialConfigurationDTOResponse = credentialConfigurationService.getCredentialConfigurationById("test"); @@ -122,25 +125,10 @@ public void getCredentialConfigurationById_ConfigNotFound() { assertEquals("Configuration not found with the provided id: " + "12345678", exception.getMessage()); } - @Test - public void getCredentialConfigurationById_JsonProcessingException() throws JsonProcessingException { - Optional optional = Optional.of(credentialConfig); - when(credentialConfigRepository.findById("12345678")) - .thenReturn(optional); - - when(objectMapper.readValue(anyString(), eq(CredentialConfigurationDTO.class))) - .thenThrow(new JsonProcessingException("Error processing JSON") {}); - - assertThrows(JsonProcessingException.class, () -> - credentialConfigurationService.getCredentialConfigurationById("12345678")); - } - @Test public void updateExistingCredentialConfig_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); when(credentialConfigRepository.findById(anyString())).thenReturn(optional); - when(objectMapper.writeValueAsString(any(CredentialConfigurationDTO.class))) - .thenReturn("test-config-string"); CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.updateCredentialConfiguration("12345678", credentialConfigurationDTO); @@ -156,34 +144,23 @@ public void updateExistingCredentialConfiguration_ConfigNotFound() { .thenReturn(Optional.empty()); CertifyException exception = assertThrows(CertifyException.class, () -> - credentialConfigurationService.getCredentialConfigurationById("12345678")); + credentialConfigurationService.updateCredentialConfiguration("12345678", new CredentialConfigurationDTO())); assertEquals("Configuration not found with the provided id: " + "12345678", exception.getMessage()); } - @Test - public void updateExistingCredentialConfiguration_JsonProcessingException() throws JsonProcessingException { - Optional optional = Optional.of(credentialConfig); - when(credentialConfigRepository.findById("12345678")) - .thenReturn(optional); - - when(objectMapper.writeValueAsString(any(CredentialConfigurationDTO.class))) - .thenThrow(new JsonProcessingException("Error processing JSON") {}); - - assertThrows(JsonProcessingException.class, () -> - credentialConfigurationService.updateCredentialConfiguration("12345678", credentialConfigurationDTO)); - } - @Test public void deleteCredentialConfig_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); + Optional optionalCredentialDisplay = Optional.of(credentialDisplay); when(credentialConfigRepository.findById(anyString())).thenReturn(optional); + when(credentialDisplayRepository.findById(anyLong())).thenReturn(optionalCredentialDisplay); doNothing().when(credentialConfigRepository).deleteById(anyString()); String result = credentialConfigurationService.deleteCredentialConfigurationById("12345678"); Assert.assertNotNull(result); - assertEquals("Configuration deleted with id: " + "12345678", result); + assertEquals("Configuration deleted with id: 12345678", result); } @Test @@ -194,6 +171,6 @@ public void deleteCredentialConfiguration_ConfigNotFound() { CertifyException exception = assertThrows(CertifyException.class, () -> credentialConfigurationService.deleteCredentialConfigurationById("12345678")); - assertEquals("Configuration not found with the provided id: " + "12345678", exception.getMessage()); + assertEquals("Configuration not found with the provided id: 12345678", exception.getMessage()); } } diff --git a/certify-service/src/test/resources/application-test.properties b/certify-service/src/test/resources/application-test.properties index ceb094932..66737c741 100644 --- a/certify-service/src/test/resources/application-test.properties +++ b/certify-service/src/test/resources/application-test.properties @@ -14,6 +14,7 @@ mosip.certify.data-provider-plugin.issuer.vc-sign-algo=Ed25519Signature2018 ## ------------------------------------------ Discovery openid-configuration ------------------------------------------- mosipbox.public.url=http://localhost:8090 +mosip.certify.authorization.url=http://localhost:8088 mosip.certify.discovery.issuer-id=${mosipbox.public.url}${server.servlet.path} mosip.certify.data-provider-plugin.issuer-public-key-uri=http://localhost/pub.key.json mosip.certify.data-provider-plugin.issuer-uri=http://localhost/pub.key.json diff --git a/db_scripts/mosip_certify/ddl/certify-credential_config.sql b/db_scripts/mosip_certify/ddl/certify-credential_config.sql index 4480bcff1..ea90c7e19 100644 --- a/db_scripts/mosip_certify/ddl/certify-credential_config.sql +++ b/db_scripts/mosip_certify/ddl/certify-credential_config.sql @@ -12,18 +12,42 @@ -- ------------------------------------------------------------------------------------------ CREATE TABLE credential_config ( - id VARCHAR(128) NOT NULL, - status VARCHAR NOT NULL, - configuration VARCHAR NOT NULL, - cr_dtimes timestamp NOT NULL default now(), - upd_dtimes timestamp, - CONSTRAINT pk_cred_config_id PRIMARY KEY (id) + id VARCHAR(255) PRIMARY KEY, + status VARCHAR(255), + vc_template VARCHAR NOT NULL, + context TEXT[] NOT NULL, + credential_type TEXT[] NOT NULL, + credential_format VARCHAR(255) NOT NULL, + did_url VARCHAR NOT NULL, + display_id INT NOT NULL, + display_order TEXT[] NOT NULL, + scope VARCHAR(255) NOT NULL, + cryptographic_binding_methods_supported TEXT[] NOT NULL, + credential_signing_alg_values_supported TEXT[] NOT NULL, + proof_types_supported JSONB NOT NULL, -- JSONB type + credential_subject JSONB NOT NULL, + plugin_configurations JSONB[], + cr_dtimes TIMESTAMP NOT NULL, + upd_dtimes TIMESTAMP, + FOREIGN KEY (display_id) REFERENCES credential_display(id) ); COMMENT ON TABLE credential_config IS 'Credential Config: Contains details of credential configuration.'; -COMMENT ON COLUMN credential_config.id IS 'Credential Config Id: Unique id assigned to save and identify configuration.'; +COMMENT ON COLUMN credential_config.id IS 'Credential Config ID: Unique id assigned to save and identify configuration.'; COMMENT ON COLUMN credential_config.status IS 'Credential Config Status: Status of the credential configuration.'; -COMMENT ON COLUMN credential_config.configuration IS 'Credential Config Configuration: Congiguration JSON of the new config'; -COMMENT ON COLUMN credential_config.cr_dtimes IS 'Date when the config was inserted in table.'; -COMMENT ON COLUMN credential_config.upd_dtimes IS 'Date when the config was last updated in table.'; \ No newline at end of file +COMMENT ON COLUMN credential_config.vc_template IS 'VC Template: Template used for the verifiable credential.'; +COMMENT ON COLUMN credential_config.context IS 'Context: Array of context URIs for the credential.'; +COMMENT ON COLUMN credential_config.credential_type IS 'Credential Type: Array of credential types supported.'; +COMMENT ON COLUMN credential_config.credential_format IS 'Credential Format: Format of the credential (e.g., JWT, JSON-LD).'; +COMMENT ON COLUMN credential_config.did_url IS 'DID URL: Decentralized Identifier URL for the issuer.'; +COMMENT ON COLUMN credential_config.display_id IS 'Display ID: Foreign key reference to credential_display table.'; +COMMENT ON COLUMN credential_config.display_order IS 'Display Order: Array defining the order of display elements.'; +COMMENT ON COLUMN credential_config.scope IS 'Scope: Authorization scope for the credential.'; +COMMENT ON COLUMN credential_config.cryptographic_binding_methods_supported IS 'Cryptographic Binding Methods: Array of supported binding methods.'; +COMMENT ON COLUMN credential_config.credential_signing_alg_values_supported IS 'Credential Signing Algorithms: Array of supported signing algorithms.'; +COMMENT ON COLUMN credential_config.proof_types_supported IS 'Proof Types: JSON object containing supported proof types and their configurations.'; +COMMENT ON COLUMN credential_config.credential_subject IS 'Credential Subject: JSON object containing subject attributes schema.'; +COMMENT ON COLUMN credential_config.plugin_configurations IS 'Plugin Configurations: Array of JSON objects for plugin configurations.'; +COMMENT ON COLUMN credential_config.cr_dtimes IS 'Created DateTime: Date and time when the config was inserted in table.'; +COMMENT ON COLUMN credential_config.upd_dtimes IS 'Updated DateTime: Date and time when the config was last updated in table.'; \ No newline at end of file diff --git a/db_scripts/mosip_certify/ddl/certify-credential_display.sql b/db_scripts/mosip_certify/ddl/certify-credential_display.sql new file mode 100644 index 000000000..16b174ef0 --- /dev/null +++ b/db_scripts/mosip_certify/ddl/certify-credential_display.sql @@ -0,0 +1,29 @@ +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at https://mozilla.org/MPL/2.0/. +-- ------------------------------------------------------------------------------------------------- +-- Database Name: inji_certify +-- Table Name : credential_display +-- Purpose : Credential Display Table +-- +-- +-- Modified Date Modified By Comments / Remarks +-- ------------------------------------------------------------------------------------------ +-- ------------------------------------------------------------------------------------------ + +CREATE TABLE credential_display ( + id SERIAL PRIMARY KEY, + name VARCHAR(255), + locale VARCHAR(255), + logo JSONB, -- JSONB type + background_color VARCHAR(255), + text_color VARCHAR(255) +); + +COMMENT ON TABLE credential_display IS 'Credential Display: Contains display information for credentials.'; +COMMENT ON COLUMN credential_display.id IS 'Display ID: Unique identifier for the credential display.'; +COMMENT ON COLUMN credential_display.name IS 'Display Name: Name of the credential for display purposes.'; +COMMENT ON COLUMN credential_display.locale IS 'Locale: Language and region code for localization.'; +COMMENT ON COLUMN credential_display.logo IS 'Logo: JSON object containing logo information.'; +COMMENT ON COLUMN credential_display.background_color IS 'Background Color: Color code for the credential background.'; +COMMENT ON COLUMN credential_display.text_color IS 'Text Color: Color code for the credential text.'; \ No newline at end of file From 04b7ce1f174c3c48cd68adfce12386d09a145804 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Tue, 18 Mar 2025 17:03:00 +0530 Subject: [PATCH 07/14] Added map struct for serialization and deserialization Signed-off-by: Piyush7034 --- certify-service/pom.xml | 29 ++++++ .../certify/entity/CredentialConfig.java | 2 +- .../mapper/CredentialConfigMapper.java | 40 ++++++++ .../CredentialConfigurationServiceImpl.java | 91 ++++--------------- ...redentialConfigurationServiceImplTest.java | 15 ++- 5 files changed, 101 insertions(+), 76 deletions(-) create mode 100644 certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java diff --git a/certify-service/pom.xml b/certify-service/pom.xml index 70bfcc18b..3f135e7dd 100644 --- a/certify-service/pom.xml +++ b/certify-service/pom.xml @@ -124,6 +124,11 @@ sd-jwt 1.5 + + org.mapstruct + mapstruct + 1.5.5.Final + @@ -145,6 +150,30 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + + org.mapstruct + mapstruct-processor + 1.5.5.Final + + + org.projectlombok + lombok + 1.18.30 + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + + diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java index d8cb4f566..78ac53b85 100644 --- a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java +++ b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java @@ -68,7 +68,7 @@ public class CredentialConfig { private Map credentialSubject; @JdbcTypeCode(SqlTypes.JSON) - @Column(name = "plugin_configurations", columnDefinition = "jsonb[]") + @Column(name = "plugin_configurations", columnDefinition = "jsonb") private List> pluginConfigurations; @NotNull diff --git a/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java b/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java new file mode 100644 index 000000000..27d89cd9d --- /dev/null +++ b/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java @@ -0,0 +1,40 @@ +package io.mosip.certify.mapper; + +import io.mosip.certify.core.dto.CredentialConfigurationDTO; +import io.mosip.certify.core.dto.CredentialDisplayDTO; +import io.mosip.certify.entity.CredentialConfig; +import io.mosip.certify.entity.CredentialDisplay; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; +import org.mapstruct.ReportingPolicy; + +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface CredentialConfigMapper { + @Mapping(target = "id", ignore = true) + @Mapping(target = "status", ignore = true) + @Mapping(target = "createdTime", expression = "java(java.time.LocalDateTime.now())") + @Mapping(target = "updatedTime", ignore = true) + CredentialConfig toEntity(CredentialConfigurationDTO dto); + + // Convert Entity to DTO + CredentialConfigurationDTO toDto(CredentialConfig entity); + + // Update existing entity with DTO data + @Mapping(target = "id", ignore = true) + @Mapping(target = "status", ignore = true) + @Mapping(target = "createdTime", ignore = true) + @Mapping(target = "updatedTime", expression = "java(java.time.LocalDateTime.now())") + @Mapping(target = "display", ignore = true) + void updateEntityFromDto(CredentialConfigurationDTO dto, @MappingTarget CredentialConfig entity); + + // Convert CredentialDisplayDTO to CredentialDisplay + @Mapping(target = "id", ignore = true) + CredentialDisplay toEntity(CredentialDisplayDTO dto); + + // Convert CredentialDisplay to CredentialDisplayDTO + CredentialDisplayDTO toDto(CredentialDisplay entity); + + @Mapping(target = "id", ignore = true) + void updateDisplayFromDto(CredentialDisplayDTO dto, @MappingTarget CredentialDisplay display); +} diff --git a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java index ca93b8469..7fcb668fd 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java @@ -8,6 +8,7 @@ import io.mosip.certify.core.spi.CredentialConfigurationService; import io.mosip.certify.entity.CredentialConfig; import io.mosip.certify.entity.CredentialDisplay; +import io.mosip.certify.mapper.CredentialConfigMapper; import io.mosip.certify.repository.CredentialConfigRepository; import io.mosip.certify.repository.CredentialDisplayRepository; import lombok.extern.slf4j.Slf4j; @@ -15,16 +16,21 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import javax.transaction.Transactional; import java.time.LocalDateTime; import java.util.*; @Slf4j @Component +@Transactional public class CredentialConfigurationServiceImpl implements CredentialConfigurationService { @Autowired private CredentialConfigRepository credentialConfigRepository; + @Autowired + private CredentialConfigMapper credentialConfigMapper; + @Autowired private CredentialDisplayRepository credentialDisplayRepository; @@ -39,31 +45,10 @@ public class CredentialConfigurationServiceImpl implements CredentialConfigurati @Override public CredentialConfigResponse addCredentialConfiguration(CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException { - CredentialConfig credentialConfig = new CredentialConfig(); + CredentialConfig credentialConfig = credentialConfigMapper.toEntity(credentialConfigurationDTO); credentialConfig.setId(UUID.randomUUID().toString()); credentialConfig.setStatus(Constants.ACTIVE); - credentialConfig.setVcTemplate(credentialConfigurationDTO.getVcTemplate()); - credentialConfig.setContext(credentialConfigurationDTO.getContext()); - credentialConfig.setCredentialType(credentialConfigurationDTO.getCredentialType()); - credentialConfig.setCredentialFormat(credentialConfigurationDTO.getCredentialFormat()); - credentialConfig.setDidUrl(credentialConfigurationDTO.getDidUrl()); - - CredentialDisplay credentialDisplayEntity = new CredentialDisplay(); - credentialDisplayEntity.setBackgroundColor(credentialConfigurationDTO.getDisplay().getBackgroundColor()); - credentialDisplayEntity.setName(credentialConfigurationDTO.getDisplay().getName()); - credentialDisplayEntity.setLogo(credentialConfigurationDTO.getDisplay().getLogo()); - credentialDisplayEntity.setLocale(credentialConfigurationDTO.getDisplay().getLocale()); - credentialDisplayEntity.setTextColor(credentialConfigurationDTO.getDisplay().getTextColor()); - credentialConfig.setDisplay(credentialDisplayEntity); - - credentialConfig.setOrder(credentialConfigurationDTO.getOrder()); - credentialConfig.setScope(credentialConfigurationDTO.getScope()); - credentialConfig.setCryptographicBindingMethodsSupported(credentialConfigurationDTO.getCryptographicBindingMethodsSupported()); - credentialConfig.setCredentialSigningAlgValuesSupported(credentialConfigurationDTO.getCredentialSigningAlgValuesSupported()); - credentialConfig.setProofTypesSupported(credentialConfigurationDTO.getProofTypesSupported()); - credentialConfig.setCredentialSubject(credentialConfigurationDTO.getCredentialSubject()); -// credentialConfig.setPluginConfigurations(credentialConfigurationDTO.getPluginConfigurations()); - credentialConfig.setCreatedTime(LocalDateTime.now()); + credentialConfigRepository.save(credentialConfig); CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); @@ -86,27 +71,8 @@ public CredentialConfigurationDTO getCredentialConfigurationById(String id) thro throw new CertifyException("Configuration not active."); } - CredentialConfigurationDTO credentialConfigurationDTO = new CredentialConfigurationDTO(); - credentialConfigurationDTO.setVcTemplate(credentialConfig.getVcTemplate()); - credentialConfigurationDTO.setContext(credentialConfig.getContext()); - credentialConfigurationDTO.setCredentialType(credentialConfig.getCredentialType()); - credentialConfigurationDTO.setCredentialFormat(credentialConfig.getCredentialFormat()); - credentialConfigurationDTO.setDidUrl(credentialConfig.getDidUrl()); - - CredentialDisplayDTO credentialDisplayDTO = new CredentialDisplayDTO(); - credentialDisplayDTO.setBackgroundColor(credentialConfig.getDisplay().getBackgroundColor()); - credentialDisplayDTO.setName(credentialConfig.getDisplay().getName()); - credentialDisplayDTO.setLogo(credentialConfig.getDisplay().getLogo()); - credentialDisplayDTO.setLocale(credentialConfig.getDisplay().getLocale()); - credentialDisplayDTO.setTextColor(credentialConfig.getDisplay().getTextColor()); - credentialConfigurationDTO.setDisplay(credentialDisplayDTO); - - credentialConfigurationDTO.setOrder(credentialConfig.getOrder()); - credentialConfigurationDTO.setScope(credentialConfig.getScope()); - credentialConfigurationDTO.setCryptographicBindingMethodsSupported(credentialConfig.getCryptographicBindingMethodsSupported()); - credentialConfigurationDTO.setCredentialSigningAlgValuesSupported(credentialConfig.getCredentialSigningAlgValuesSupported()); - credentialConfigurationDTO.setProofTypesSupported(credentialConfig.getProofTypesSupported()); - credentialConfigurationDTO.setCredentialSubject(credentialConfig.getCredentialSubject()); + CredentialConfigurationDTO credentialConfigurationDTO = credentialConfigMapper.toDto(credentialConfig); + return credentialConfigurationDTO; } @@ -119,26 +85,15 @@ public CredentialConfigResponse updateCredentialConfiguration(String id, Credent } CredentialConfig credentialConfig = optional.get(); - credentialConfig.setVcTemplate(credentialConfigurationDTO.getVcTemplate()); - credentialConfig.setContext(credentialConfigurationDTO.getContext()); - credentialConfig.setCredentialType(credentialConfigurationDTO.getCredentialType()); - credentialConfig.setCredentialFormat(credentialConfigurationDTO.getCredentialFormat()); - credentialConfig.setDidUrl(credentialConfigurationDTO.getDidUrl()); - - CredentialDisplay credentialDisplayEntity = new CredentialDisplay(); - credentialDisplayEntity.setBackgroundColor(credentialConfigurationDTO.getDisplay().getBackgroundColor()); - credentialDisplayEntity.setName(credentialConfigurationDTO.getDisplay().getName()); - credentialDisplayEntity.setLogo(credentialConfigurationDTO.getDisplay().getLogo()); - credentialDisplayEntity.setLocale(credentialConfigurationDTO.getDisplay().getLocale()); - credentialDisplayEntity.setTextColor(credentialConfigurationDTO.getDisplay().getTextColor()); - credentialConfig.setDisplay(credentialDisplayEntity); - - credentialConfig.setOrder(credentialConfigurationDTO.getOrder()); - credentialConfig.setScope(credentialConfigurationDTO.getScope()); - credentialConfig.setCryptographicBindingMethodsSupported(credentialConfigurationDTO.getCryptographicBindingMethodsSupported()); - credentialConfig.setCredentialSigningAlgValuesSupported(credentialConfigurationDTO.getCredentialSigningAlgValuesSupported()); - credentialConfig.setProofTypesSupported(credentialConfigurationDTO.getProofTypesSupported()); - credentialConfig.setCredentialSubject(credentialConfigurationDTO.getCredentialSubject()); + credentialConfigMapper.updateEntityFromDto(credentialConfigurationDTO, credentialConfig); + log.info("credential config: " + credentialConfig.getCredentialType()); + + if(credentialConfig.getDisplay() != null && credentialConfigurationDTO.getDisplay() != null) { + credentialConfigMapper.updateDisplayFromDto(credentialConfigurationDTO.getDisplay(), credentialConfig.getDisplay()); + } else { + credentialConfig.setDisplay(credentialConfigMapper.toEntity(credentialConfigurationDTO.getDisplay())); + } + credentialConfigRepository.save(credentialConfig); CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); @@ -156,14 +111,6 @@ public String deleteCredentialConfigurationById(String id) { throw new CertifyException("Configuration not found with the provided id: " + id); } - CredentialConfig credentialConfig = optional.get(); - - Optional optionalCredentialDisplay = credentialDisplayRepository.findById(credentialConfig.getDisplay().getId()); - if(optionalCredentialDisplay.isEmpty()) { - throw new CertifyException("Credential display not found for the provided configuration id: " + id); - } - - credentialDisplayRepository.deleteById(credentialConfig.getDisplay().getId()); credentialConfigRepository.deleteById(id); return "Configuration deleted with id: " + id; } diff --git a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java index d6e2c8002..31d2d59ac 100644 --- a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java +++ b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java @@ -8,6 +8,7 @@ import io.mosip.certify.core.exception.CertifyException; import io.mosip.certify.entity.CredentialConfig; import io.mosip.certify.entity.CredentialDisplay; +import io.mosip.certify.mapper.CredentialConfigMapper; import io.mosip.certify.repository.CredentialConfigRepository; import io.mosip.certify.repository.CredentialDisplayRepository; import org.junit.Assert; @@ -37,6 +38,9 @@ public class CredentialConfigurationServiceImplTest { @Mock private CredentialDisplayRepository credentialDisplayRepository; + @Mock + private CredentialConfigMapper credentialConfigMapper; + @InjectMocks private CredentialConfigurationServiceImpl credentialConfigurationService; @@ -78,6 +82,10 @@ public void setup() { credentialConfigurationDTO = new CredentialConfigurationDTO(); credentialConfigurationDTO.setDisplay(new CredentialDisplayDTO()); + credentialConfigurationDTO.setVcTemplate("test_template"); + credentialConfigurationDTO.setCredentialFormat("test_vc"); + credentialConfigurationDTO.setContext(List.of("https://www.w3.org/2018/credentials/v1")); + credentialConfigurationDTO.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); ReflectionTestUtils.setField(credentialConfigurationService, "credentialIssuer", "http://example.com"); ReflectionTestUtils.setField(credentialConfigurationService, "authServers", List.of("http://auth.com")); @@ -86,6 +94,7 @@ public void setup() { @Test public void addNewCredentialConfig_Success() throws JsonProcessingException { + when(credentialConfigMapper.toEntity(any(CredentialConfigurationDTO.class))).thenReturn(credentialConfig); when(credentialConfigRepository.save(any(CredentialConfig.class))).thenReturn(credentialConfig); CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.addCredentialConfiguration(credentialConfigurationDTO); @@ -100,7 +109,7 @@ public void addNewCredentialConfig_Success() throws JsonProcessingException { public void getCredentialConfigById_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); when(credentialConfigRepository.findById(anyString())).thenReturn(optional); - + when(credentialConfigMapper.toDto(any(CredentialConfig.class))).thenReturn(credentialConfigurationDTO); CredentialConfigurationDTO credentialConfigurationDTOResponse = credentialConfigurationService.getCredentialConfigurationById("test"); Assert.assertNotNull(credentialConfigurationDTOResponse); @@ -111,7 +120,7 @@ public void getCredentialConfigById_Success() throws JsonProcessingException { Assert.assertEquals("test_template", credentialConfigurationDTOResponse.getVcTemplate()); Assert.assertEquals(List.of("https://www.w3.org/2018/credentials/v1"), credentialConfigurationDTOResponse.getContext()); Assert.assertEquals(Arrays.asList("VerifiableCredential", "TestVerifiableCredential"), credentialConfigurationDTOResponse.getCredentialType()); - Assert.assertEquals("ldp_vc", credentialConfigurationDTOResponse.getCredentialFormat()); + Assert.assertEquals("test_vc", credentialConfigurationDTOResponse.getCredentialFormat()); } @Test @@ -129,6 +138,7 @@ public void getCredentialConfigurationById_ConfigNotFound() { public void updateExistingCredentialConfig_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); when(credentialConfigRepository.findById(anyString())).thenReturn(optional); + doNothing().when(credentialConfigMapper).updateEntityFromDto(any(CredentialConfigurationDTO.class), any(CredentialConfig.class)); CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.updateCredentialConfiguration("12345678", credentialConfigurationDTO); @@ -154,7 +164,6 @@ public void deleteCredentialConfig_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); Optional optionalCredentialDisplay = Optional.of(credentialDisplay); when(credentialConfigRepository.findById(anyString())).thenReturn(optional); - when(credentialDisplayRepository.findById(anyLong())).thenReturn(optionalCredentialDisplay); doNothing().when(credentialConfigRepository).deleteById(anyString()); String result = credentialConfigurationService.deleteCredentialConfigurationById("12345678"); From f9251db8749f79883c790ff977c61de30bc08b09 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Wed, 19 Mar 2025 10:06:24 +0530 Subject: [PATCH 08/14] Removed credential display dto and entity Signed-off-by: Piyush7034 --- .../core/dto/CredentialConfigurationDTO.java | 2 +- .../dto/CredentialConfigurationSupported.java | 2 +- .../core/dto/CredentialDisplayDTO.java | 22 ---------- .../certify/entity/CredentialConfig.java | 7 ++-- .../certify/entity/CredentialDisplay.java | 32 -------------- .../mapper/CredentialConfigMapper.java | 13 ------ .../CredentialDisplayRepository.java | 7 ---- .../CredentialConfigurationServiceImpl.java | 42 +------------------ .../CredentialConfigControllerTest.java | 17 +------- ...redentialConfigurationServiceImplTest.java | 22 +--------- .../ddl/certify-credential_config.sql | 7 ++-- .../ddl/certify-credential_display.sql | 29 ------------- 12 files changed, 12 insertions(+), 190 deletions(-) delete mode 100644 certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplayDTO.java delete mode 100644 certify-service/src/main/java/io/mosip/certify/entity/CredentialDisplay.java delete mode 100644 certify-service/src/main/java/io/mosip/certify/repository/CredentialDisplayRepository.java delete mode 100644 db_scripts/mosip_certify/ddl/certify-credential_display.sql diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java index 54a44a4cc..d7591660d 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java @@ -30,7 +30,7 @@ public class CredentialConfigurationDTO { @Valid @NotNull(message = ErrorConstants.INVALID_REQUEST) - private CredentialDisplayDTO display; + private List> display; private List order; diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java index 10f39956e..57185634a 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java @@ -25,7 +25,7 @@ public class CredentialConfigurationSupported { @JsonProperty("credential_definition") private CredentialDefinition credentialDefinition; - private CredentialDisplayDTO display; + private List> display; private List order; } diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplayDTO.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplayDTO.java deleted file mode 100644 index 1127aa48b..000000000 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialDisplayDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.mosip.certify.core.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -import java.util.Map; - -@Data -public class CredentialDisplayDTO { - - private String name; - - private String locale; - - private Map logo; - - @JsonProperty("background_color") - private String backgroundColor; - - @JsonProperty("text_color") - private String textColor; -} diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java index 78ac53b85..23fe0a374 100644 --- a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java +++ b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java @@ -37,11 +37,10 @@ public class CredentialConfig { @NotNull(message = "Invalid request") private String didUrl; - @Valid @NotNull(message = "Invalid request") - @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "display_id") - private CredentialDisplay display; + @JdbcTypeCode(SqlTypes.JSON) + @Column(name = "display", columnDefinition = "jsonb") + private List> display; @Column(name = "display_order", columnDefinition = "TEXT[]") private List order; diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialDisplay.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialDisplay.java deleted file mode 100644 index c90222b43..000000000 --- a/certify-service/src/main/java/io/mosip/certify/entity/CredentialDisplay.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.mosip.certify.entity; - -import jakarta.persistence.*; -import lombok.Data; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.type.SqlTypes; - -import java.util.Map; - -@Entity -@Table(name = "credential_display") -@Data -public class CredentialDisplay { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private String name; - - private String locale; - - @JdbcTypeCode(SqlTypes.JSON) - @Column(columnDefinition = "jsonb") - private Map logo; - - @Column(name = "background_color") - private String backgroundColor; - - @Column(name = "text_color") - private String textColor; -} \ No newline at end of file diff --git a/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java b/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java index 27d89cd9d..03d1c7e93 100644 --- a/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java +++ b/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java @@ -1,9 +1,7 @@ package io.mosip.certify.mapper; import io.mosip.certify.core.dto.CredentialConfigurationDTO; -import io.mosip.certify.core.dto.CredentialDisplayDTO; import io.mosip.certify.entity.CredentialConfig; -import io.mosip.certify.entity.CredentialDisplay; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; @@ -25,16 +23,5 @@ public interface CredentialConfigMapper { @Mapping(target = "status", ignore = true) @Mapping(target = "createdTime", ignore = true) @Mapping(target = "updatedTime", expression = "java(java.time.LocalDateTime.now())") - @Mapping(target = "display", ignore = true) void updateEntityFromDto(CredentialConfigurationDTO dto, @MappingTarget CredentialConfig entity); - - // Convert CredentialDisplayDTO to CredentialDisplay - @Mapping(target = "id", ignore = true) - CredentialDisplay toEntity(CredentialDisplayDTO dto); - - // Convert CredentialDisplay to CredentialDisplayDTO - CredentialDisplayDTO toDto(CredentialDisplay entity); - - @Mapping(target = "id", ignore = true) - void updateDisplayFromDto(CredentialDisplayDTO dto, @MappingTarget CredentialDisplay display); } diff --git a/certify-service/src/main/java/io/mosip/certify/repository/CredentialDisplayRepository.java b/certify-service/src/main/java/io/mosip/certify/repository/CredentialDisplayRepository.java deleted file mode 100644 index 6087f496d..000000000 --- a/certify-service/src/main/java/io/mosip/certify/repository/CredentialDisplayRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.mosip.certify.repository; - -import io.mosip.certify.entity.CredentialDisplay; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface CredentialDisplayRepository extends JpaRepository { -} diff --git a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java index 7fcb668fd..7d6da4870 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java @@ -1,23 +1,19 @@ package io.mosip.certify.services; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.certify.core.constants.Constants; import io.mosip.certify.core.dto.*; import io.mosip.certify.core.exception.CertifyException; import io.mosip.certify.core.spi.CredentialConfigurationService; import io.mosip.certify.entity.CredentialConfig; -import io.mosip.certify.entity.CredentialDisplay; import io.mosip.certify.mapper.CredentialConfigMapper; import io.mosip.certify.repository.CredentialConfigRepository; -import io.mosip.certify.repository.CredentialDisplayRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.transaction.Transactional; -import java.time.LocalDateTime; import java.util.*; @Slf4j @@ -31,9 +27,6 @@ public class CredentialConfigurationServiceImpl implements CredentialConfigurati @Autowired private CredentialConfigMapper credentialConfigMapper; - @Autowired - private CredentialDisplayRepository credentialDisplayRepository; - @Value("${mosip.certify.identifier}") private String credentialIssuer; @@ -86,14 +79,6 @@ public CredentialConfigResponse updateCredentialConfiguration(String id, Credent CredentialConfig credentialConfig = optional.get(); credentialConfigMapper.updateEntityFromDto(credentialConfigurationDTO, credentialConfig); - log.info("credential config: " + credentialConfig.getCredentialType()); - - if(credentialConfig.getDisplay() != null && credentialConfigurationDTO.getDisplay() != null) { - credentialConfigMapper.updateDisplayFromDto(credentialConfigurationDTO.getDisplay(), credentialConfig.getDisplay()); - } else { - credentialConfig.setDisplay(credentialConfigMapper.toEntity(credentialConfigurationDTO.getDisplay())); - } - credentialConfigRepository.save(credentialConfig); CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); @@ -122,7 +107,6 @@ public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { credentialIssuerMetadata.setAuthorizationServers(authServers); String credentialEndpoint = credentialIssuer + servletPath + "/issuance" + (!version.equals("latest") ? "/" +version : "") + "/credential" ; credentialIssuerMetadata.setCredentialEndpoint(credentialEndpoint); -// credentialIssuerMetadata.setDisplay((List>) originalIssuerMetadata.get("display")); List credentialConfigList = credentialConfigRepository.findAll(); Map credentialConfigurationSupportedMap = new HashMap<>(); credentialConfigList.stream() @@ -134,13 +118,7 @@ public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(credentialConfig.getCredentialSigningAlgValuesSupported()); credentialConfigurationSupported.setProofTypesSupported(credentialConfig.getProofTypesSupported()); - CredentialDisplayDTO credentialDisplayDTO = new CredentialDisplayDTO(); - credentialDisplayDTO.setBackgroundColor(credentialConfig.getDisplay().getBackgroundColor()); - credentialDisplayDTO.setName(credentialConfig.getDisplay().getName()); - credentialDisplayDTO.setLogo(credentialConfig.getDisplay().getLogo()); - credentialDisplayDTO.setLocale(credentialConfig.getDisplay().getLocale()); - credentialDisplayDTO.setTextColor(credentialConfig.getDisplay().getTextColor()); - credentialConfigurationSupported.setDisplay(credentialDisplayDTO); + credentialConfigurationSupported.setDisplay(credentialConfig.getDisplay()); credentialConfigurationSupported.setOrder(credentialConfig.getOrder()); CredentialDefinition credentialDefinition = new CredentialDefinition(); @@ -148,7 +126,6 @@ public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { credentialDefinition.setContext(credentialConfig.getContext()); credentialDefinition.setCredentialSubject(credentialConfig.getCredentialSubject()); credentialConfigurationSupported.setCredentialDefinition(credentialDefinition); - String credentialType = credentialConfig.getCredentialType().get(1); credentialConfigurationSupportedMap.put(credentialType, credentialConfigurationSupported); @@ -157,21 +134,4 @@ public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { credentialIssuerMetadata.setCredentialConfigurationSupported(credentialConfigurationSupportedMap); return credentialIssuerMetadata; } - - -// @Override -// public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { -// LinkedHashMap originalIssuerMetadata = new LinkedHashMap<>(issuerMetadata.get("latest")); -// -// CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); -// credentialIssuerMetadata.setCredentialIssuer((String) originalIssuerMetadata.get("credential_issuer")); -// credentialIssuerMetadata.setAuthorizationServers((List) originalIssuerMetadata.get("authorization_servers")); -// credentialIssuerMetadata.setCredentialEndpoint((String) originalIssuerMetadata.get("credential_endpoint")); -// credentialIssuerMetadata.setDisplay((List>) originalIssuerMetadata.get("display")); -// -// Map credentialConfigurationSupported = (Map) originalIssuerMetadata.get("credential_configurations_supported"); -// credentialIssuerMetadata.setCredentialConfigurationSupported(credentialConfigurationSupported); -// -// return credentialIssuerMetadata; -// } } diff --git a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java index 35ed066db..e3eba8081 100644 --- a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java +++ b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.certify.core.dto.*; import io.mosip.certify.core.spi.CredentialConfigurationService; -import io.mosip.certify.core.spi.VCIssuanceService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -50,13 +49,7 @@ public void setup() { credentialConfigurationDTO.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); credentialConfigurationDTO.setCredentialFormat("ldp_vc"); credentialConfigurationDTO.setDidUrl("did:web:test.github.io:test-env:test-folder"); - CredentialDisplayDTO credentialDisplay = new CredentialDisplayDTO(); - credentialDisplay.setName("Test Verifiable Credential"); - credentialDisplay.setLocale("en"); - credentialDisplay.setBackgroundColor("#FDFAF9"); - credentialDisplay.setTextColor("#7C4616"); - credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); - credentialConfigurationDTO.setDisplay(credentialDisplay); + credentialConfigurationDTO.setDisplay(List.of()); credentialConfigurationDTO.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); credentialConfigurationDTO.setScope("test_vc_ldp"); credentialConfigurationDTO.setCryptographicBindingMethodsSupported(List.of("did:jwk")); @@ -146,13 +139,7 @@ public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); Map jwtValues = Map.of("proof_signing_alg_values_supported", Arrays.asList("RS256", "ES256")); credentialConfigurationSupported.setProofTypesSupported(jwtValues); - CredentialDisplayDTO credentialDisplay = new CredentialDisplayDTO(); - credentialDisplay.setName("Test Verifiable Credential"); - credentialDisplay.setLocale("en"); - credentialDisplay.setBackgroundColor("#FDFAF9"); - credentialDisplay.setTextColor("#7C4616"); - credentialDisplay.setLogo(Map.of("url", "https://www.example.com", "alt_text", "test")); - credentialConfigurationSupported.setDisplay(credentialDisplay); + credentialConfigurationSupported.setDisplay(List.of()); credentialConfigurationSupported.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); credentialIssuerMetadata.setCredentialConfigurationSupported(Map.of("TestCredential_ldp", credentialConfigurationSupported)); diff --git a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java index 31d2d59ac..902706a86 100644 --- a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java +++ b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java @@ -1,16 +1,12 @@ package io.mosip.certify.services; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.certify.core.dto.CredentialConfigResponse; import io.mosip.certify.core.dto.CredentialConfigurationDTO; -import io.mosip.certify.core.dto.CredentialDisplayDTO; import io.mosip.certify.core.exception.CertifyException; import io.mosip.certify.entity.CredentialConfig; -import io.mosip.certify.entity.CredentialDisplay; import io.mosip.certify.mapper.CredentialConfigMapper; import io.mosip.certify.repository.CredentialConfigRepository; -import io.mosip.certify.repository.CredentialDisplayRepository; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -35,9 +31,6 @@ public class CredentialConfigurationServiceImplTest { @Mock private CredentialConfigRepository credentialConfigRepository; - @Mock - private CredentialDisplayRepository credentialDisplayRepository; - @Mock private CredentialConfigMapper credentialConfigMapper; @@ -50,9 +43,6 @@ public class CredentialConfigurationServiceImplTest { @Mock private CredentialConfig credentialConfig; - @Mock - private CredentialDisplay credentialDisplay; - @Before public void setup() { MockitoAnnotations.openMocks(this); @@ -71,17 +61,8 @@ public void setup() { credentialConfig.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); credentialConfig.setCredentialSubject(Map.of("name", "Full Name")); - credentialDisplay = new CredentialDisplay(); - credentialDisplay.setId(1L); - credentialDisplay.setName("Test Credential"); - credentialDisplay.setLocale("en"); - credentialDisplay.setTextColor("#FFFFFF"); - credentialDisplay.setBackgroundColor("#12107c"); - credentialDisplay.setLogo(Map.of("test1", "value1")); - credentialConfig.setDisplay(credentialDisplay); - credentialConfigurationDTO = new CredentialConfigurationDTO(); - credentialConfigurationDTO.setDisplay(new CredentialDisplayDTO()); + credentialConfigurationDTO.setDisplay(List.of()); credentialConfigurationDTO.setVcTemplate("test_template"); credentialConfigurationDTO.setCredentialFormat("test_vc"); credentialConfigurationDTO.setContext(List.of("https://www.w3.org/2018/credentials/v1")); @@ -162,7 +143,6 @@ public void updateExistingCredentialConfiguration_ConfigNotFound() { @Test public void deleteCredentialConfig_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); - Optional optionalCredentialDisplay = Optional.of(credentialDisplay); when(credentialConfigRepository.findById(anyString())).thenReturn(optional); doNothing().when(credentialConfigRepository).deleteById(anyString()); diff --git a/db_scripts/mosip_certify/ddl/certify-credential_config.sql b/db_scripts/mosip_certify/ddl/certify-credential_config.sql index ea90c7e19..b54c936b2 100644 --- a/db_scripts/mosip_certify/ddl/certify-credential_config.sql +++ b/db_scripts/mosip_certify/ddl/certify-credential_config.sql @@ -19,17 +19,16 @@ CREATE TABLE credential_config ( credential_type TEXT[] NOT NULL, credential_format VARCHAR(255) NOT NULL, did_url VARCHAR NOT NULL, - display_id INT NOT NULL, + display JSONB NOT NULL, display_order TEXT[] NOT NULL, scope VARCHAR(255) NOT NULL, cryptographic_binding_methods_supported TEXT[] NOT NULL, credential_signing_alg_values_supported TEXT[] NOT NULL, proof_types_supported JSONB NOT NULL, -- JSONB type credential_subject JSONB NOT NULL, - plugin_configurations JSONB[], + plugin_configurations JSONB, cr_dtimes TIMESTAMP NOT NULL, - upd_dtimes TIMESTAMP, - FOREIGN KEY (display_id) REFERENCES credential_display(id) + upd_dtimes TIMESTAMP ); COMMENT ON TABLE credential_config IS 'Credential Config: Contains details of credential configuration.'; diff --git a/db_scripts/mosip_certify/ddl/certify-credential_display.sql b/db_scripts/mosip_certify/ddl/certify-credential_display.sql deleted file mode 100644 index 16b174ef0..000000000 --- a/db_scripts/mosip_certify/ddl/certify-credential_display.sql +++ /dev/null @@ -1,29 +0,0 @@ --- This Source Code Form is subject to the terms of the Mozilla Public --- License, v. 2.0. If a copy of the MPL was not distributed with this --- file, You can obtain one at https://mozilla.org/MPL/2.0/. --- ------------------------------------------------------------------------------------------------- --- Database Name: inji_certify --- Table Name : credential_display --- Purpose : Credential Display Table --- --- --- Modified Date Modified By Comments / Remarks --- ------------------------------------------------------------------------------------------ --- ------------------------------------------------------------------------------------------ - -CREATE TABLE credential_display ( - id SERIAL PRIMARY KEY, - name VARCHAR(255), - locale VARCHAR(255), - logo JSONB, -- JSONB type - background_color VARCHAR(255), - text_color VARCHAR(255) -); - -COMMENT ON TABLE credential_display IS 'Credential Display: Contains display information for credentials.'; -COMMENT ON COLUMN credential_display.id IS 'Display ID: Unique identifier for the credential display.'; -COMMENT ON COLUMN credential_display.name IS 'Display Name: Name of the credential for display purposes.'; -COMMENT ON COLUMN credential_display.locale IS 'Locale: Language and region code for localization.'; -COMMENT ON COLUMN credential_display.logo IS 'Logo: JSON object containing logo information.'; -COMMENT ON COLUMN credential_display.background_color IS 'Background Color: Color code for the credential background.'; -COMMENT ON COLUMN credential_display.text_color IS 'Text Color: Color code for the credential text.'; \ No newline at end of file From 4916e2d5c2d1a6a4e4c3e4b5ea41fea7547ef0d1 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Wed, 19 Mar 2025 16:54:42 +0530 Subject: [PATCH 09/14] Removed unused changes Signed-off-by: Piyush7034 --- .../controller/IssuerMetadataController.java | 26 ------------------- .../services/CertifyIssuanceServiceImpl.java | 2 +- .../services/VCIssuanceServiceImpl.java | 6 ++++- .../certify/TestVCIssuanceServiceImpl.java | 1 - .../controller/VCIssuanceControllerTest.java | 4 --- db_scripts/mosip_certify/ddl.sql | 1 - db_scripts/mosip_certify/deploy.properties | 2 +- 7 files changed, 7 insertions(+), 35 deletions(-) delete mode 100644 certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java diff --git a/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java b/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java deleted file mode 100644 index 345e58dba..000000000 --- a/certify-service/src/main/java/io/mosip/certify/controller/IssuerMetadataController.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.mosip.certify.controller; - -import io.mosip.certify.core.dto.CredentialIssuerMetadata; -import io.mosip.certify.core.spi.CredentialConfigurationService; -import io.mosip.certify.core.spi.VCIssuanceService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@Slf4j -@RestController -@RequestMapping("/issuer-metadata") -public class IssuerMetadataController { - - @Autowired - private CredentialConfigurationService credentialConfigurationService; - - @GetMapping(value = "/.well-known/openid-credential-issuer", produces = "application/json") - public CredentialIssuerMetadata getCredentialIssuerMetadata( - @RequestParam(name = "version", required = false, defaultValue = "latest") String version) { - return credentialConfigurationService.fetchCredentialIssuerMetadata(version); - } -} diff --git a/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java index 36e624a51..d24aab610 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java @@ -382,7 +382,7 @@ private VCResult getVerifiableCredential(CredentialRequest credentialRequest, throw new CertifyException(ErrorConstants.UNSUPPORTED_VC_FORMAT); } } - + private CredentialResponse getCredentialResponse(String format, VCResult vcResult) { switch (format) { case "ldp_vc" -> { diff --git a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java index 90df502c8..89eda48ab 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/VCIssuanceServiceImpl.java @@ -15,7 +15,11 @@ import io.mosip.certify.api.util.Action; import io.mosip.certify.api.util.ActionStatus; import io.mosip.certify.core.constants.VCFormats; -import io.mosip.certify.core.dto.*; +import io.mosip.certify.core.dto.CredentialMetadata; +import io.mosip.certify.core.dto.CredentialRequest; +import io.mosip.certify.core.dto.CredentialResponse; +import io.mosip.certify.core.dto.ParsedAccessToken; +import io.mosip.certify.core.dto.VCIssuanceTransaction; import io.mosip.certify.core.constants.Constants; import io.mosip.certify.core.constants.ErrorConstants; import io.mosip.certify.core.exception.CertifyException; diff --git a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java index 8dd6ef47d..db421af64 100644 --- a/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java +++ b/certify-service/src/test/java/io/mosip/certify/TestVCIssuanceServiceImpl.java @@ -1,7 +1,6 @@ package io.mosip.certify; import io.mosip.certify.core.constants.ErrorConstants; -import io.mosip.certify.core.dto.CredentialIssuerMetadata; import io.mosip.certify.core.dto.CredentialRequest; import io.mosip.certify.core.dto.CredentialResponse; import io.mosip.certify.core.exception.InvalidRequestException; diff --git a/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java index e0f90134a..1f64c5d17 100644 --- a/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java +++ b/certify-service/src/test/java/io/mosip/certify/controller/VCIssuanceControllerTest.java @@ -1,6 +1,5 @@ package io.mosip.certify.controller; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import foundation.identity.jsonld.JsonLDObject; import io.mosip.certify.api.spi.AuditPlugin; @@ -19,11 +18,8 @@ import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; - -import java.lang.reflect.Array; import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; diff --git a/db_scripts/mosip_certify/ddl.sql b/db_scripts/mosip_certify/ddl.sql index d99204900..6506c911e 100644 --- a/db_scripts/mosip_certify/ddl.sql +++ b/db_scripts/mosip_certify/ddl.sql @@ -6,6 +6,5 @@ \ir ddl/certify-ca_cert_store.sql \ir ddl/certify-rendering_template.sql \ir ddl/certify-credential_template.sql -\ir ddl/certify-credential_config.sql diff --git a/db_scripts/mosip_certify/deploy.properties b/db_scripts/mosip_certify/deploy.properties index 592f854e9..c8ffab055 100644 --- a/db_scripts/mosip_certify/deploy.properties +++ b/db_scripts/mosip_certify/deploy.properties @@ -1,4 +1,4 @@ -DB_SERVERIP=localhost +DB_SERVERIP= DB_PORT=5432 SU_USER=postgres DEFAULT_DB_NAME=postgres From 9e59383af51c296b635f4f09affad9f6a388f39b Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Wed, 19 Mar 2025 17:27:02 +0530 Subject: [PATCH 10/14] Removed unused changes Signed-off-by: Piyush7034 --- .../mosip/certify/core/dto/CredentialConfigurationDTO.java | 1 - .../java/io/mosip/certify/entity/CredentialConfig.java | 1 - .../services/CredentialConfigurationServiceImpl.java | 7 +++++++ .../services/CredentialConfigurationServiceImplTest.java | 1 + db_scripts/mosip_certify/ddl/certify-credential_config.sql | 2 +- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java index d7591660d..7a14c26c9 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java @@ -13,7 +13,6 @@ @Data public class CredentialConfigurationDTO { - @NotEmpty(message = ErrorConstants.INVALID_REQUEST) private String vcTemplate; @NotNull(message = ErrorConstants.INVALID_REQUEST) diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java index 23fe0a374..bed134592 100644 --- a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java +++ b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java @@ -20,7 +20,6 @@ public class CredentialConfig { private String status; - @NotNull(message = "Invalid request") private String vcTemplate; @NotNull(message = "Invalid request") diff --git a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java index 7d6da4870..8f2420f8a 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java @@ -36,12 +36,19 @@ public class CredentialConfigurationServiceImpl implements CredentialConfigurati @Value("${server.servlet.path}") private String servletPath; + @Value("${mosip.certify.plugin-mode}") + private String pluginMode; + @Override public CredentialConfigResponse addCredentialConfiguration(CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException { CredentialConfig credentialConfig = credentialConfigMapper.toEntity(credentialConfigurationDTO); credentialConfig.setId(UUID.randomUUID().toString()); credentialConfig.setStatus(Constants.ACTIVE); + if(pluginMode.equals("DataProvider") && credentialConfig.getVcTemplate() == null) { + throw new CertifyException("Credential Template is mandatory for this \"DataProvider\" plugin issuer."); + } + credentialConfigRepository.save(credentialConfig); CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); diff --git a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java index 902706a86..e80616dc3 100644 --- a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java +++ b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java @@ -71,6 +71,7 @@ public void setup() { ReflectionTestUtils.setField(credentialConfigurationService, "credentialIssuer", "http://example.com"); ReflectionTestUtils.setField(credentialConfigurationService, "authServers", List.of("http://auth.com")); ReflectionTestUtils.setField(credentialConfigurationService, "servletPath", "v1/test"); + ReflectionTestUtils.setField(credentialConfigurationService, "pluginMode", "DataProvider"); } @Test diff --git a/db_scripts/mosip_certify/ddl/certify-credential_config.sql b/db_scripts/mosip_certify/ddl/certify-credential_config.sql index b54c936b2..a770d9727 100644 --- a/db_scripts/mosip_certify/ddl/certify-credential_config.sql +++ b/db_scripts/mosip_certify/ddl/certify-credential_config.sql @@ -14,7 +14,7 @@ CREATE TABLE credential_config ( id VARCHAR(255) PRIMARY KEY, status VARCHAR(255), - vc_template VARCHAR NOT NULL, + vc_template VARCHAR, context TEXT[] NOT NULL, credential_type TEXT[] NOT NULL, credential_format VARCHAR(255) NOT NULL, From 5db54737220dede66d9dc0484efa6b8e8ad9a2c1 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Thu, 20 Mar 2025 17:55:57 +0530 Subject: [PATCH 11/14] Added required sql scripts and fixes after rebase Signed-off-by: Piyush7034 --- .../certify/core/spi/VCIssuanceService.java | 1 - certify-service/pom.xml | 5 ++++ .../certify/entity/CredentialConfig.java | 6 ++++ .../resources/application-local.properties | 5 ++-- db_scripts/mosip_certify/combined.sql | 21 ++++++++++++++ db_scripts/mosip_certify/ddl.sql | 2 +- .../ddl/certify-credential_config.sql | 2 +- db_scripts/mosip_certify/ddl/combined.sql | 29 ++++++++++++++++--- .../docker-compose-injistack/certify_init.sql | 21 ++++++++++++++ 9 files changed, 82 insertions(+), 10 deletions(-) diff --git a/certify-core/src/main/java/io/mosip/certify/core/spi/VCIssuanceService.java b/certify-core/src/main/java/io/mosip/certify/core/spi/VCIssuanceService.java index 0858d30be..c7fa28306 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/spi/VCIssuanceService.java +++ b/certify-core/src/main/java/io/mosip/certify/core/spi/VCIssuanceService.java @@ -5,7 +5,6 @@ */ package io.mosip.certify.core.spi; -import io.mosip.certify.core.dto.CredentialConfigurationRequest; import io.mosip.certify.core.dto.CredentialRequest; import io.mosip.certify.core.dto.CredentialResponse; diff --git a/certify-service/pom.xml b/certify-service/pom.xml index 3f135e7dd..d4dffc4ab 100644 --- a/certify-service/pom.xml +++ b/certify-service/pom.xml @@ -129,6 +129,11 @@ mapstruct 1.5.5.Final + + io.hypersistence + hypersistence-utils-hibernate-60 + 3.9.0 + diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java index bed134592..bed6d6dd7 100644 --- a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java +++ b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java @@ -1,10 +1,12 @@ package io.mosip.certify.entity; +import io.hypersistence.utils.hibernate.type.json.JsonBinaryType; import jakarta.persistence.*; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import lombok.Data; import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.annotations.Type; import org.hibernate.type.SqlTypes; import java.time.LocalDateTime; @@ -37,6 +39,7 @@ public class CredentialConfig { private String didUrl; @NotNull(message = "Invalid request") + @Type(JsonBinaryType.class) @JdbcTypeCode(SqlTypes.JSON) @Column(name = "display", columnDefinition = "jsonb") private List> display; @@ -56,15 +59,18 @@ public class CredentialConfig { private List credentialSigningAlgValuesSupported; @NotNull(message = "Invalid request") + @Type(JsonBinaryType.class) @JdbcTypeCode(SqlTypes.JSON) @Column(name = "proof_types_supported", columnDefinition = "jsonb") private Map proofTypesSupported; @NotNull(message = "Invalid request") + @Type(JsonBinaryType.class) @JdbcTypeCode(SqlTypes.JSON) @Column(name = "credential_subject", columnDefinition = "jsonb") private Map credentialSubject; + @Type(JsonBinaryType.class) @JdbcTypeCode(SqlTypes.JSON) @Column(name = "plugin_configurations", columnDefinition = "jsonb") private List> pluginConfigurations; diff --git a/certify-service/src/main/resources/application-local.properties b/certify-service/src/main/resources/application-local.properties index 53c865269..9f5f6607f 100644 --- a/certify-service/src/main/resources/application-local.properties +++ b/certify-service/src/main/resources/application-local.properties @@ -10,8 +10,7 @@ mosip.certify.security.ignore-csrf-urls=**/actuator/**,/favicon.ico,**/error,\ **/issuance/**,**/system-info/** mosip.certify.security.ignore-auth-urls=/actuator/**,**/error,**/swagger-ui/**,\ - **/v3/api-docs/**, **/issuance/**,/system-info/**,/public/**,/** - **/v3/api-docs/**, **/issuance/**,/system-info/**,/rendering-template/** + **/v3/api-docs/**, **/issuance/**,/system-info/**,/rendering-template/**,/credentials/** ## ------------------------------------------ Discovery openid-configuration ------------------------------------------- @@ -354,4 +353,4 @@ spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.show-sql=false spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.datasource.schema=./db_scripts/mosip_certify/ddl/certify-ca_cert_store.sql,./db_scripts/mosip_certify/ddl/certify-credential_template.sql,./db_scripts/mosip_certify/ddl/certify-key_alias.sql,./db_scripts/mosip_certify/ddl/certify-key_policy_def.sql,./db_scripts/mosip_certify/ddl/certify-key_store.sql,./db_scripts/mosip_certify/ddl/certify-rendering_template.sql,./db_scripts/mosip_certify/dml/ \ No newline at end of file +spring.datasource.schema=./db_scripts/mosip_certify/ddl/certify-ca_cert_store.sql,./db_scripts/mosip_certify/ddl/certify-credential_template.sql,./db_scripts/mosip_certify/ddl/certify-key_alias.sql,./db_scripts/mosip_certify/ddl/certify-key_policy_def.sql,./db_scripts/mosip_certify/ddl/certify-key_store.sql,./db_scripts/mosip_certify/ddl/certify-rendering_template.sql,./db_scripts/mosip_certify/ddl/certify-credential_config.sql,./db_scripts/mosip_certify/dml/ \ No newline at end of file diff --git a/db_scripts/mosip_certify/combined.sql b/db_scripts/mosip_certify/combined.sql index e68dd9880..ee09e199c 100644 --- a/db_scripts/mosip_certify/combined.sql +++ b/db_scripts/mosip_certify/combined.sql @@ -94,6 +94,27 @@ CREATE TABLE rendering_template ( upd_dtimes timestamp, CONSTRAINT pk_rendertmp_id PRIMARY KEY (id) ); +DROP TABLE IF EXISTS credential_config CASCADE CONSTRAINTS; +CREATE TABLE credential_config ( + id VARCHAR(255) PRIMARY KEY, + status VARCHAR(255), + vc_template VARCHAR, + context TEXT[] NOT NULL, + credential_type TEXT[] NOT NULL, + credential_format VARCHAR(255) NOT NULL, + did_url VARCHAR NOT NULL, + display JSONB NOT NULL, + display_order TEXT[] NOT NULL, + scope VARCHAR(255) NOT NULL, + cryptographic_binding_methods_supported TEXT[] NOT NULL, + credential_signing_alg_values_supported TEXT[] NOT NULL, + proof_types_supported JSONB NOT NULL, + credential_subject JSONB NOT NULL, + plugin_configurations JSONB, + cr_dtimes TIMESTAMP NOT NULL, + upd_dtimes TIMESTAMP, + CONSTRAINT pk_config_id PRIMARY KEY (id) +); INSERT INTO key_policy_def (app_id, key_validity_duration, pre_expire_days, access_allowed, is_active, cr_by, cr_dtimes) SELECT app_id, key_validity_duration, pre_expire_days, access_allowed, is_active, cr_by, CURRENT_TIMESTAMP FROM CSVREAD('./db_scripts/mosip_certify/dml/certify-key_policy_def.csv'); \ No newline at end of file diff --git a/db_scripts/mosip_certify/ddl.sql b/db_scripts/mosip_certify/ddl.sql index 6506c911e..d059ca68a 100644 --- a/db_scripts/mosip_certify/ddl.sql +++ b/db_scripts/mosip_certify/ddl.sql @@ -6,5 +6,5 @@ \ir ddl/certify-ca_cert_store.sql \ir ddl/certify-rendering_template.sql \ir ddl/certify-credential_template.sql - +\ir ddl/certify-credential_config.sql diff --git a/db_scripts/mosip_certify/ddl/certify-credential_config.sql b/db_scripts/mosip_certify/ddl/certify-credential_config.sql index a770d9727..5b55b0168 100644 --- a/db_scripts/mosip_certify/ddl/certify-credential_config.sql +++ b/db_scripts/mosip_certify/ddl/certify-credential_config.sql @@ -24,7 +24,7 @@ CREATE TABLE credential_config ( scope VARCHAR(255) NOT NULL, cryptographic_binding_methods_supported TEXT[] NOT NULL, credential_signing_alg_values_supported TEXT[] NOT NULL, - proof_types_supported JSONB NOT NULL, -- JSONB type + proof_types_supported JSONB NOT NULL, credential_subject JSONB NOT NULL, plugin_configurations JSONB, cr_dtimes TIMESTAMP NOT NULL, diff --git a/db_scripts/mosip_certify/ddl/combined.sql b/db_scripts/mosip_certify/ddl/combined.sql index cc1034900..d73a8a65d 100644 --- a/db_scripts/mosip_certify/ddl/combined.sql +++ b/db_scripts/mosip_certify/ddl/combined.sql @@ -47,16 +47,16 @@ CREATE TABLE IF NOT EXISTS key_store( del_dtimes timestamp, CONSTRAINT pk_keystr_id PRIMARY KEY (id) ); -DROP TABLE IF EXISTS svg_template CASCADE CONSTRAINTS; -CREATE TABLE IF NOT EXISTS svg_template ( +DROP TABLE IF EXISTS rendering_template CASCADE CONSTRAINTS; +CREATE TABLE IF NOT EXISTS rendering_template ( id UUID NOT NULL, template VARCHAR NOT NULL, cr_dtimes timestamp NOT NULL, upd_dtimes timestamp, CONSTRAINT pk_svgtmp_id PRIMARY KEY (id) ); -DROP TABLE IF EXISTS template_data CASCADE CONSTRAINTS; -CREATE TABLE IF NOT EXISTS template_data( +DROP TABLE IF EXISTS credential_template CASCADE CONSTRAINTS; +CREATE TABLE IF NOT EXISTS credential_template( context character varying(1024) NOT NULL, credential_type character varying(512) NOT NULL, template VARCHAR NOT NULL, @@ -70,6 +70,27 @@ CREATE TABLE IF NOT EXISTS template_data( upd_dtimes timestamp, CONSTRAINT pk_template PRIMARY KEY (context, credential_type, credential_format) ); +DROP TABLE IF EXISTS credential_config CASCADE CONSTRAINTS; +CREATE TABLE IF NOT EXISTS credential_config ( + id VARCHAR(255) PRIMARY KEY, + status VARCHAR(255), + vc_template VARCHAR, + context TEXT[] NOT NULL, + credential_type TEXT[] NOT NULL, + credential_format VARCHAR(255) NOT NULL, + did_url VARCHAR NOT NULL, + display JSONB NOT NULL, + display_order TEXT[] NOT NULL, + scope VARCHAR(255) NOT NULL, + cryptographic_binding_methods_supported TEXT[] NOT NULL, + credential_signing_alg_values_supported TEXT[] NOT NULL, + proof_types_supported JSONB NOT NULL, + credential_subject JSONB NOT NULL, + plugin_configurations JSONB, + cr_dtimes TIMESTAMP NOT NULL, + upd_dtimes TIMESTAMP, + CONSTRAINT pk_config_id PRIMARY KEY (id) +); INSERT INTO key_policy_def(APP_ID,KEY_VALIDITY_DURATION,PRE_EXPIRE_DAYS,ACCESS_ALLOWED,IS_ACTIVE,CR_BY,CR_DTIMES) VALUES('ROOT', 2920, 1125, 'NA', true, 'mosipadmin', now()); diff --git a/docker-compose/docker-compose-injistack/certify_init.sql b/docker-compose/docker-compose-injistack/certify_init.sql index 14536e43c..4561918b5 100644 --- a/docker-compose/docker-compose-injistack/certify_init.sql +++ b/docker-compose/docker-compose-injistack/certify_init.sql @@ -112,6 +112,27 @@ CREATE TABLE IF NOT EXISTS certify.credential_template( CONSTRAINT pk_template PRIMARY KEY (context, credential_type, credential_format) ); +CREATE TABLE IF NOT EXISTS credential_config ( + id VARCHAR(255) PRIMARY KEY, + status VARCHAR(255), + vc_template VARCHAR, + context TEXT[] NOT NULL, + credential_type TEXT[] NOT NULL, + credential_format VARCHAR(255) NOT NULL, + did_url VARCHAR NOT NULL, + display JSONB NOT NULL, + display_order TEXT[] NOT NULL, + scope VARCHAR(255) NOT NULL, + cryptographic_binding_methods_supported TEXT[] NOT NULL, + credential_signing_alg_values_supported TEXT[] NOT NULL, + proof_types_supported JSONB NOT NULL, + credential_subject JSONB NOT NULL, + plugin_configurations JSONB, + cr_dtimes TIMESTAMP NOT NULL, + upd_dtimes TIMESTAMP, + CONSTRAINT pk_config_id PRIMARY KEY (id) +); + INSERT INTO certify.credential_template (context, credential_type, template, credential_format, key_manager_app_id, key_manager_ref_id, did_url, cr_dtimes, upd_dtimes) VALUES ('https://www.w3.org/2018/credentials/v1', 'FarmerCredential,VerifiableCredential', '{ "@context": [ "https://www.w3.org/2018/credentials/v1", From 31db4e4f47c288987b6456e353ae64470a39c206 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Mon, 24 Mar 2025 12:27:01 +0530 Subject: [PATCH 12/14] Added mdoc releated changes Signed-off-by: Piyush7034 --- .../core/dto/CredentialConfigurationDTO.java | 7 +++++- .../dto/CredentialConfigurationSupported.java | 5 ++++ .../certify/entity/CredentialConfig.java | 9 ++++++- .../CredentialConfigurationServiceImpl.java | 25 +++++++++++++------ ...redentialConfigurationServiceImplTest.java | 1 + db_scripts/mosip_certify/combined.sql | 4 ++- .../ddl/certify-credential_config.sql | 7 ++++-- db_scripts/mosip_certify/ddl/combined.sql | 4 ++- 8 files changed, 49 insertions(+), 13 deletions(-) diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java index 7a14c26c9..52600aae6 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java @@ -48,9 +48,14 @@ public class CredentialConfigurationDTO { @JsonProperty("proof_types_supported") private Map proofTypesSupported; - @NotNull(message = ErrorConstants.INVALID_REQUEST) @JsonProperty("credentialSubject") private Map credentialSubject; + @JsonProperty("claims") + private Map claims; + + @JsonProperty("doctype") + private String docType; + private List> pluginConfigurations; } diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java index 57185634a..20202a2ce 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java @@ -11,6 +11,9 @@ public class CredentialConfigurationSupported { private String format; + @JsonProperty("doctype") + private String docType; + private String scope; @JsonProperty("cryptographic_binding_methods_supported") @@ -25,6 +28,8 @@ public class CredentialConfigurationSupported { @JsonProperty("credential_definition") private CredentialDefinition credentialDefinition; + private Map claims; + private List> display; private List order; diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java index bed6d6dd7..2c48db13a 100644 --- a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java +++ b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java @@ -64,12 +64,19 @@ public class CredentialConfig { @Column(name = "proof_types_supported", columnDefinition = "jsonb") private Map proofTypesSupported; - @NotNull(message = "Invalid request") + @Column(name = "doctype") + private String docType; + @Type(JsonBinaryType.class) @JdbcTypeCode(SqlTypes.JSON) @Column(name = "credential_subject", columnDefinition = "jsonb") private Map credentialSubject; + @Type(JsonBinaryType.class) + @JdbcTypeCode(SqlTypes.JSON) + @Column(name = "claims", columnDefinition = "jsonb") + private Map claims; + @Type(JsonBinaryType.class) @JdbcTypeCode(SqlTypes.JSON) @Column(name = "plugin_configurations", columnDefinition = "jsonb") diff --git a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java index 8f2420f8a..10e749a9b 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java @@ -46,7 +46,13 @@ public CredentialConfigResponse addCredentialConfiguration(CredentialConfigurati credentialConfig.setStatus(Constants.ACTIVE); if(pluginMode.equals("DataProvider") && credentialConfig.getVcTemplate() == null) { - throw new CertifyException("Credential Template is mandatory for this \"DataProvider\" plugin issuer."); + throw new CertifyException("Credential Template is mandatory for this `DataProvider` plugin issuer."); + } + + if(credentialConfigurationDTO.getCredentialSubject() == null && + (credentialConfigurationDTO.getClaims() == null || credentialConfigurationDTO.getDocType() == null)) { + + throw new CertifyException("Please provide a value for at least one of credentialSubject or both doctype and claims"); } credentialConfigRepository.save(credentialConfig); @@ -128,13 +134,18 @@ public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { credentialConfigurationSupported.setDisplay(credentialConfig.getDisplay()); credentialConfigurationSupported.setOrder(credentialConfig.getOrder()); - CredentialDefinition credentialDefinition = new CredentialDefinition(); - credentialDefinition.setType(credentialConfig.getCredentialType()); - credentialDefinition.setContext(credentialConfig.getContext()); - credentialDefinition.setCredentialSubject(credentialConfig.getCredentialSubject()); - credentialConfigurationSupported.setCredentialDefinition(credentialDefinition); - String credentialType = credentialConfig.getCredentialType().get(1); + if(credentialConfig.getCredentialSubject() != null) { + CredentialDefinition credentialDefinition = new CredentialDefinition(); + credentialDefinition.setType(credentialConfig.getCredentialType()); + credentialDefinition.setContext(credentialConfig.getContext()); + credentialDefinition.setCredentialSubject(credentialConfig.getCredentialSubject()); + credentialConfigurationSupported.setCredentialDefinition(credentialDefinition); + } else { + credentialConfigurationSupported.setClaims(credentialConfig.getClaims()); + credentialConfigurationSupported.setDocType(credentialConfig.getDocType()); + } + String credentialType = credentialConfig.getCredentialType().get(1); credentialConfigurationSupportedMap.put(credentialType, credentialConfigurationSupported); }); diff --git a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java index e80616dc3..c0b9c0e77 100644 --- a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java +++ b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java @@ -67,6 +67,7 @@ public void setup() { credentialConfigurationDTO.setCredentialFormat("test_vc"); credentialConfigurationDTO.setContext(List.of("https://www.w3.org/2018/credentials/v1")); credentialConfigurationDTO.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); + credentialConfigurationDTO.setCredentialSubject(Map.of("name", "Full Name")); ReflectionTestUtils.setField(credentialConfigurationService, "credentialIssuer", "http://example.com"); ReflectionTestUtils.setField(credentialConfigurationService, "authServers", List.of("http://auth.com")); diff --git a/db_scripts/mosip_certify/combined.sql b/db_scripts/mosip_certify/combined.sql index ee09e199c..71a6625cb 100644 --- a/db_scripts/mosip_certify/combined.sql +++ b/db_scripts/mosip_certify/combined.sql @@ -99,6 +99,7 @@ CREATE TABLE credential_config ( id VARCHAR(255) PRIMARY KEY, status VARCHAR(255), vc_template VARCHAR, + doctype VARCHAR, context TEXT[] NOT NULL, credential_type TEXT[] NOT NULL, credential_format VARCHAR(255) NOT NULL, @@ -109,7 +110,8 @@ CREATE TABLE credential_config ( cryptographic_binding_methods_supported TEXT[] NOT NULL, credential_signing_alg_values_supported TEXT[] NOT NULL, proof_types_supported JSONB NOT NULL, - credential_subject JSONB NOT NULL, + credential_subject JSONB, + claims JSONB, plugin_configurations JSONB, cr_dtimes TIMESTAMP NOT NULL, upd_dtimes TIMESTAMP, diff --git a/db_scripts/mosip_certify/ddl/certify-credential_config.sql b/db_scripts/mosip_certify/ddl/certify-credential_config.sql index 5b55b0168..bc4856d2a 100644 --- a/db_scripts/mosip_certify/ddl/certify-credential_config.sql +++ b/db_scripts/mosip_certify/ddl/certify-credential_config.sql @@ -15,6 +15,7 @@ CREATE TABLE credential_config ( id VARCHAR(255) PRIMARY KEY, status VARCHAR(255), vc_template VARCHAR, + doctype VARCHAR, context TEXT[] NOT NULL, credential_type TEXT[] NOT NULL, credential_format VARCHAR(255) NOT NULL, @@ -25,10 +26,12 @@ CREATE TABLE credential_config ( cryptographic_binding_methods_supported TEXT[] NOT NULL, credential_signing_alg_values_supported TEXT[] NOT NULL, proof_types_supported JSONB NOT NULL, - credential_subject JSONB NOT NULL, + credential_subject JSONB, + claims JSONB, plugin_configurations JSONB, cr_dtimes TIMESTAMP NOT NULL, - upd_dtimes TIMESTAMP + upd_dtimes TIMESTAMP, + CONSTRAINT pk_config_id PRIMARY KEY (id) ); COMMENT ON TABLE credential_config IS 'Credential Config: Contains details of credential configuration.'; diff --git a/db_scripts/mosip_certify/ddl/combined.sql b/db_scripts/mosip_certify/ddl/combined.sql index d73a8a65d..9bdfab9a7 100644 --- a/db_scripts/mosip_certify/ddl/combined.sql +++ b/db_scripts/mosip_certify/ddl/combined.sql @@ -75,6 +75,7 @@ CREATE TABLE IF NOT EXISTS credential_config ( id VARCHAR(255) PRIMARY KEY, status VARCHAR(255), vc_template VARCHAR, + doctype VARCHAR, context TEXT[] NOT NULL, credential_type TEXT[] NOT NULL, credential_format VARCHAR(255) NOT NULL, @@ -85,7 +86,8 @@ CREATE TABLE IF NOT EXISTS credential_config ( cryptographic_binding_methods_supported TEXT[] NOT NULL, credential_signing_alg_values_supported TEXT[] NOT NULL, proof_types_supported JSONB NOT NULL, - credential_subject JSONB NOT NULL, + credential_subject JSONB, + claims JSONB, plugin_configurations JSONB, cr_dtimes TIMESTAMP NOT NULL, upd_dtimes TIMESTAMP, From 68508e84a938dab1356cc5b54208157973465467 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Thu, 27 Mar 2025 19:06:41 +0530 Subject: [PATCH 13/14] Merged CredentialTemplate and CredentialConfig Signed-off-by: Piyush7034 --- .../core/dto/CredentialConfigurationDTO.java | 10 +- .../certify/entity/CredentialConfig.java | 58 ++-- .../certify/entity/CredentialTemplate.java | 67 ---- .../mapper/CredentialConfigMapper.java | 48 ++- .../CredentialConfigRepository.java | 12 +- .../CredentialTemplateRepository.java | 15 - .../CredentialConfigurationServiceImpl.java | 38 +-- .../VelocityTemplatingEngineImpl.java | 19 +- ...redentialConfigurationServiceImplTest.java | 21 +- .../VelocityTemplatingEngineImplTest.java | 32 +- certify-service/src/test/resources/schema.sql | 37 ++- db_scripts/mosip_certify/combined.sql | 27 +- db_scripts/mosip_certify/ddl.sql | 1 - .../ddl/certify-credential_config.sql | 22 +- db_scripts/mosip_certify/ddl/combined.sql | 31 +- .../sql/0.11.0_to_0.12.0_rollback.sql | 27 +- .../sql/0.11.0_to_0.12.0_upgrade.sql | 69 +++++ .../docker-compose-injistack/certify_init.sql | 288 +++++++++++------- 18 files changed, 461 insertions(+), 361 deletions(-) delete mode 100644 certify-service/src/main/java/io/mosip/certify/entity/CredentialTemplate.java delete mode 100644 certify-service/src/main/java/io/mosip/certify/repository/CredentialTemplateRepository.java rename db_scripts/mosip_certify/ddl/certify-credential_template.sql => db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_rollback.sql (55%) create mode 100644 db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_upgrade.sql diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java index 52600aae6..185e1c020 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationDTO.java @@ -6,6 +6,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; +import org.hibernate.annotations.Comment; import java.util.List; import java.util.Map; @@ -24,9 +25,16 @@ public class CredentialConfigurationDTO { @NotNull(message = ErrorConstants.INVALID_REQUEST) private String credentialFormat; - @NotNull(message = ErrorConstants.INVALID_REQUEST) private String didUrl; + private String keyManagerAppId; + + private String keyManagerRefId; + + private String signatureAlgo; //Can be called as Proof algorithm + + private String sdClaim; + @Valid @NotNull(message = ErrorConstants.INVALID_REQUEST) private List> display; diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java index 2c48db13a..c0c359bd2 100644 --- a/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java +++ b/certify-service/src/main/java/io/mosip/certify/entity/CredentialConfig.java @@ -1,43 +1,62 @@ package io.mosip.certify.entity; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + import io.hypersistence.utils.hibernate.type.json.JsonBinaryType; -import jakarta.persistence.*; -import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import lombok.Data; +import org.hibernate.annotations.Comment; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; +import lombok.NoArgsConstructor; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.annotations.Type; import org.hibernate.type.SqlTypes; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - @Data @Entity -@Table(name="credential_config") +@NoArgsConstructor +@Table(name = "credential_config") +@IdClass(TemplateId.class) public class CredentialConfig { - @Id - private String id; + + private String configId; private String status; private String vcTemplate; - @NotNull(message = "Invalid request") - @Column(name = "context", columnDefinition = "TEXT[]") - private List context; + @Id + private String context; - @NotNull(message = "Invalid request") - @Column(name="credentialType", columnDefinition = "TEXT[]") - private List credentialType; + @Id + private String credentialType; - @NotNull(message = "Invalid request") + @Id private String credentialFormat; - @NotNull(message = "Invalid request") + @Comment("URL for the public key. Should point to the exact key. Supports DID document or public key") private String didUrl; + @Comment("AppId of the keymanager") + private String keyManagerAppId; + + @Comment("RefId of the keymanager") + private String keyManagerRefId; + + @Comment("This for VC signature or proof algorithm") + private String signatureAlgo; //Can be called as Proof algorithm + + @Comment("This is a comma seperated list for selective disclosure.") + private String sdClaim; + @NotNull(message = "Invalid request") @Type(JsonBinaryType.class) @JdbcTypeCode(SqlTypes.JSON) @@ -84,8 +103,9 @@ public class CredentialConfig { @NotNull @Column(name = "cr_dtimes") - private LocalDateTime createdTime; + private LocalDateTime createdTimes; @Column(name = "upd_dtimes") - private LocalDateTime updatedTime; + private LocalDateTime updatedTimes; + } diff --git a/certify-service/src/main/java/io/mosip/certify/entity/CredentialTemplate.java b/certify-service/src/main/java/io/mosip/certify/entity/CredentialTemplate.java deleted file mode 100644 index 4b61cb636..000000000 --- a/certify-service/src/main/java/io/mosip/certify/entity/CredentialTemplate.java +++ /dev/null @@ -1,67 +0,0 @@ -package io.mosip.certify.entity; - - -import java.time.LocalDateTime; - -import org.hibernate.annotations.Comment; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Table; -import jakarta.persistence.Id; -import jakarta.persistence.IdClass; -import jakarta.validation.constraints.NotBlank; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Entity -@NoArgsConstructor -@Table(name = "credential_template") -@IdClass(TemplateId.class) -public class CredentialTemplate { - @NotBlank(message = "Template is mandatory") - @Getter - @Setter - private String template; - @Id - @Getter - @Setter - private String context; - @Id - @Getter - @Setter - private String credentialType; - @Id - @Getter - @Setter - private String credentialFormat; - @Getter - @Setter - @Comment("URL for the public key. Should point to the exact key. Supports DID document or public key") - private String didUrl; - @Getter - @Setter - @Comment("AppId of the keymanager") - private String keyManagerAppId; - @Getter - @Setter - @Comment("RefId of the keymanager") - private String keyManagerRefId; - @Getter - @Setter - @Comment("This for VC signature or proof algorithm") - private String signatureAlgo; //Can be called as Proof algorithm - @Getter - @Setter - @Comment("This is a comma seperated list for selective disclosure.") - private String sdClaim; - - @NotBlank - @Column(name = "cr_dtimes") - private LocalDateTime createdTimes; - - @Column(name = "upd_dtimes") - private LocalDateTime updatedTimes; - -} diff --git a/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java b/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java index 03d1c7e93..aae4a08ff 100644 --- a/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java +++ b/certify-service/src/main/java/io/mosip/certify/mapper/CredentialConfigMapper.java @@ -2,26 +2,54 @@ import io.mosip.certify.core.dto.CredentialConfigurationDTO; import io.mosip.certify.entity.CredentialConfig; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.ReportingPolicy; +import org.mapstruct.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface CredentialConfigMapper { - @Mapping(target = "id", ignore = true) + @Mapping(target = "configId", ignore = true) @Mapping(target = "status", ignore = true) - @Mapping(target = "createdTime", expression = "java(java.time.LocalDateTime.now())") - @Mapping(target = "updatedTime", ignore = true) + @Mapping(target = "createdTimes", expression = "java(java.time.LocalDateTime.now())") + @Mapping(target = "updatedTimes", ignore = true) + @Mapping(target = "context", source = "context", qualifiedByName = "listToCommaSeparatedString") + @Mapping(target = "credentialType", source = "credentialType", qualifiedByName = "listToCommaSeparatedString") CredentialConfig toEntity(CredentialConfigurationDTO dto); // Convert Entity to DTO + @Mapping(target = "context", source = "context", qualifiedByName = "commaSeparatedStringToList") + @Mapping(target = "credentialType", source = "credentialType", qualifiedByName = "commaSeparatedStringToList") CredentialConfigurationDTO toDto(CredentialConfig entity); // Update existing entity with DTO data - @Mapping(target = "id", ignore = true) + @Mapping(target = "configId", ignore = true) @Mapping(target = "status", ignore = true) - @Mapping(target = "createdTime", ignore = true) - @Mapping(target = "updatedTime", expression = "java(java.time.LocalDateTime.now())") + @Mapping(target = "createdTimes", ignore = true) + @Mapping(target = "updatedTimes", expression = "java(java.time.LocalDateTime.now())") + @Mapping(target = "context", source = "context", qualifiedByName = "listToCommaSeparatedString") + @Mapping(target = "credentialType", source = "credentialType", qualifiedByName = "listToCommaSeparatedString") void updateEntityFromDto(CredentialConfigurationDTO dto, @MappingTarget CredentialConfig entity); + + @Named("listToCommaSeparatedString") + default String listToCommaSeparatedString(List list) { + if (list == null || list.isEmpty()) { + return null; + } + return list.stream() + .sorted() + .collect(Collectors.joining(",")); + } + + @Named("commaSeparatedStringToList") + default List commaSeparatedStringToList(String str) { + if (str == null || str.isEmpty()) { + return new ArrayList<>(); + } + return Arrays.stream(str.split(",")) + .map(String::trim) + .collect(Collectors.toList()); + } } diff --git a/certify-service/src/main/java/io/mosip/certify/repository/CredentialConfigRepository.java b/certify-service/src/main/java/io/mosip/certify/repository/CredentialConfigRepository.java index 174b0b455..84c96140d 100644 --- a/certify-service/src/main/java/io/mosip/certify/repository/CredentialConfigRepository.java +++ b/certify-service/src/main/java/io/mosip/certify/repository/CredentialConfigRepository.java @@ -1,7 +1,17 @@ package io.mosip.certify.repository; import io.mosip.certify.entity.CredentialConfig; +import io.mosip.certify.entity.TemplateId; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; -public interface CredentialConfigRepository extends JpaRepository { +import java.util.Optional; + +@Repository +public interface CredentialConfigRepository extends JpaRepository { + Optional findByCredentialTypeAndContext(String credentialType, String context); + // NOTE: best practice? .save() + Optional findByConfigId(String configId); + void deleteByConfigId(String configId); } + diff --git a/certify-service/src/main/java/io/mosip/certify/repository/CredentialTemplateRepository.java b/certify-service/src/main/java/io/mosip/certify/repository/CredentialTemplateRepository.java deleted file mode 100644 index d290641a8..000000000 --- a/certify-service/src/main/java/io/mosip/certify/repository/CredentialTemplateRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.mosip.certify.repository; - -import io.mosip.certify.entity.CredentialTemplate; -import io.mosip.certify.entity.TemplateId; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface CredentialTemplateRepository extends JpaRepository { - Optional findByCredentialTypeAndContext(String credentialType, String context); - // NOTE: best practice? .save() -} - diff --git a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java index 10e749a9b..82bafec20 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java @@ -42,7 +42,7 @@ public class CredentialConfigurationServiceImpl implements CredentialConfigurati @Override public CredentialConfigResponse addCredentialConfiguration(CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException { CredentialConfig credentialConfig = credentialConfigMapper.toEntity(credentialConfigurationDTO); - credentialConfig.setId(UUID.randomUUID().toString()); + credentialConfig.setConfigId(UUID.randomUUID().toString()); credentialConfig.setStatus(Constants.ACTIVE); if(pluginMode.equals("DataProvider") && credentialConfig.getVcTemplate() == null) { @@ -58,7 +58,7 @@ public CredentialConfigResponse addCredentialConfiguration(CredentialConfigurati credentialConfigRepository.save(credentialConfig); CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); - credentialConfigResponse.setId(credentialConfig.getId()); + credentialConfigResponse.setId(credentialConfig.getConfigId()); credentialConfigResponse.setStatus(credentialConfig.getStatus()); return credentialConfigResponse; @@ -66,7 +66,7 @@ public CredentialConfigResponse addCredentialConfiguration(CredentialConfigurati @Override public CredentialConfigurationDTO getCredentialConfigurationById(String id) throws JsonProcessingException { - Optional optional = credentialConfigRepository.findById(id); + Optional optional = credentialConfigRepository.findByConfigId(id); if(optional.isEmpty()) { throw new CertifyException("Configuration not found with the provided id: " + id); @@ -84,7 +84,7 @@ public CredentialConfigurationDTO getCredentialConfigurationById(String id) thro @Override public CredentialConfigResponse updateCredentialConfiguration(String id, CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException { - Optional optional = credentialConfigRepository.findById(id); + Optional optional = credentialConfigRepository.findByConfigId(id); if(optional.isEmpty()) { throw new CertifyException("Configuration not found with the provided id: " + id); @@ -95,7 +95,7 @@ public CredentialConfigResponse updateCredentialConfiguration(String id, Credent credentialConfigRepository.save(credentialConfig); CredentialConfigResponse credentialConfigResponse = new CredentialConfigResponse(); - credentialConfigResponse.setId(credentialConfig.getId()); + credentialConfigResponse.setId(credentialConfig.getConfigId()); credentialConfigResponse.setStatus(credentialConfig.getStatus()); return credentialConfigResponse; @@ -103,13 +103,13 @@ public CredentialConfigResponse updateCredentialConfiguration(String id, Credent @Override public String deleteCredentialConfigurationById(String id) { - Optional optional = credentialConfigRepository.findById(id); + Optional optional = credentialConfigRepository.findByConfigId(id); if(optional.isEmpty()) { throw new CertifyException("Configuration not found with the provided id: " + id); } - credentialConfigRepository.deleteById(id); + credentialConfigRepository.delete(optional.get()); return "Configuration deleted with id: " + id; } @@ -125,19 +125,20 @@ public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { credentialConfigList.stream() .forEach(credentialConfig -> { CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); - credentialConfigurationSupported.setFormat(credentialConfig.getCredentialFormat()); - credentialConfigurationSupported.setScope(credentialConfig.getScope()); - credentialConfigurationSupported.setCryptographicBindingMethodsSupported(credentialConfig.getCryptographicBindingMethodsSupported()); - credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(credentialConfig.getCredentialSigningAlgValuesSupported()); - credentialConfigurationSupported.setProofTypesSupported(credentialConfig.getProofTypesSupported()); + CredentialConfigurationDTO credentialConfigurationDTO = credentialConfigMapper.toDto(credentialConfig); + credentialConfigurationSupported.setFormat(credentialConfigurationDTO.getCredentialFormat()); + credentialConfigurationSupported.setScope(credentialConfigurationDTO.getScope()); + credentialConfigurationSupported.setCryptographicBindingMethodsSupported(credentialConfigurationDTO.getCryptographicBindingMethodsSupported()); + credentialConfigurationSupported.setCredentialSigningAlgValuesSupported(credentialConfigurationDTO.getCredentialSigningAlgValuesSupported()); + credentialConfigurationSupported.setProofTypesSupported(credentialConfigurationDTO.getProofTypesSupported()); - credentialConfigurationSupported.setDisplay(credentialConfig.getDisplay()); - credentialConfigurationSupported.setOrder(credentialConfig.getOrder()); + credentialConfigurationSupported.setDisplay(credentialConfigurationDTO.getDisplay()); + credentialConfigurationSupported.setOrder(credentialConfigurationDTO.getOrder()); if(credentialConfig.getCredentialSubject() != null) { CredentialDefinition credentialDefinition = new CredentialDefinition(); - credentialDefinition.setType(credentialConfig.getCredentialType()); - credentialDefinition.setContext(credentialConfig.getContext()); + credentialDefinition.setType(credentialConfigurationDTO.getCredentialType()); + credentialDefinition.setContext(credentialConfigurationDTO.getContext()); credentialDefinition.setCredentialSubject(credentialConfig.getCredentialSubject()); credentialConfigurationSupported.setCredentialDefinition(credentialDefinition); } else { @@ -145,7 +146,10 @@ public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { credentialConfigurationSupported.setDocType(credentialConfig.getDocType()); } - String credentialType = credentialConfig.getCredentialType().get(1); + String credentialType = credentialConfigurationDTO.getCredentialType().stream() + .filter(type -> !type.equals("VerifiableCredential")) + .findFirst() + .orElse(null); credentialConfigurationSupportedMap.put(credentialType, credentialConfigurationSupported); }); diff --git a/certify-service/src/main/java/io/mosip/certify/vcformatters/VelocityTemplatingEngineImpl.java b/certify-service/src/main/java/io/mosip/certify/vcformatters/VelocityTemplatingEngineImpl.java index 56d98c294..98357babe 100644 --- a/certify-service/src/main/java/io/mosip/certify/vcformatters/VelocityTemplatingEngineImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/vcformatters/VelocityTemplatingEngineImpl.java @@ -36,12 +36,11 @@ import org.json.JSONArray; import org.json.JSONObject; -import io.micrometer.tracing.SamplerFunction; import io.mosip.certify.core.constants.ErrorConstants; import io.mosip.certify.core.exception.CertifyException; import io.mosip.certify.core.exception.RenderingTemplateException; -import io.mosip.certify.entity.CredentialTemplate; -import io.mosip.certify.repository.CredentialTemplateRepository; +import io.mosip.certify.entity.CredentialConfig; +import io.mosip.certify.repository.CredentialConfigRepository; import io.mosip.certify.core.constants.Constants; import io.mosip.certify.core.constants.VCDM2Constants; import io.mosip.certify.core.constants.VCDMConstants; @@ -53,8 +52,6 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import io.mosip.certify.credential.Credential; - @Slf4j @Service @@ -63,7 +60,7 @@ public class VelocityTemplatingEngineImpl implements VCFormatter { public static final String DELIMITER = ":"; Map> templateCache; @Autowired - CredentialTemplateRepository credentialTemplateRepository; + CredentialConfigRepository credentialConfigRepository; @Autowired RenderingTemplateService renderingTemplateService; @@ -79,7 +76,7 @@ public void initialize() { // TODO: The DataSourceResourceLoader can be used instead if there's a // single primary key column and the table has a last modified date. templateCache = new HashMap<>(); - credentialTemplateRepository.findAll().stream().forEach((template -> { + credentialConfigRepository.findAll().stream().forEach((template -> { Map templateMap = new HashMap<>(); ObjectMapper oMapper = new ObjectMapper(); templateMap = oMapper.convertValue(template , Map.class); @@ -164,7 +161,7 @@ public String format(JSONObject valueMap, Map templateSettings) // TODO: Isn't template name becoming too complex with VC_CONTEXTS & CREDENTIAL_TYPES both? String templateName = templateSettings.get(TEMPLATE_NAME).toString(); String issuer = templateSettings.get(ISSUER_URI).toString(); - String template = templateCache.get(templateName).get("template"); + String template = templateCache.get(templateName).get("vcTemplate"); if (template == null) { log.error("Template {} not found", templateName); @@ -245,9 +242,9 @@ public String getTemplate(String key) { } String credentialType = key.split(DELIMITER)[0]; String context = key.split(DELIMITER, 2)[1]; - CredentialTemplate template = credentialTemplateRepository.findByCredentialTypeAndContext(credentialType, context).orElse(null); + CredentialConfig template = credentialConfigRepository.findByCredentialTypeAndContext(credentialType, context).orElse(null); if (template != null) { - return template.getTemplate(); + return template.getVcTemplate(); } else return null; } @@ -266,7 +263,7 @@ public String format(Map templateInput) { // TODO: Isn't template name becoming too complex with VC_CONTEXTS & CREDENTIAL_TYPES both? String templateName = templateInput.get(TEMPLATE_NAME).toString(); String issuer = templateInput.get(ISSUER_URI).toString(); - String t = templateCache.get(templateName).get("template"); + String t = templateCache.get(templateName).get("vcTemplate"); StringWriter writer = new StringWriter(); // 1. Prepare map // TODO: Eventually, the credentialSubject from the plugin will be templated as-is diff --git a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java index c0b9c0e77..2d5281abd 100644 --- a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java +++ b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java @@ -48,11 +48,11 @@ public void setup() { MockitoAnnotations.openMocks(this); credentialConfig = new CredentialConfig(); String id = UUID.randomUUID().toString(); - credentialConfig.setId(id); + credentialConfig.setConfigId(id); credentialConfig.setStatus("active"); credentialConfig.setVcTemplate("test_template"); - credentialConfig.setContext(List.of("https://www.w3.org/2018/credentials/v1")); - credentialConfig.setCredentialType(Arrays.asList("VerifiableCredential", "TestVerifiableCredential")); + credentialConfig.setContext("https://www.w3.org/2018/credentials/v1"); + credentialConfig.setCredentialType("VerifiableCredential,TestVerifiableCredential"); credentialConfig.setCredentialFormat("ldp_vc"); credentialConfig.setDidUrl("did:web:test.github.io:test-env:test-folder"); credentialConfig.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); @@ -60,6 +60,7 @@ public void setup() { credentialConfig.setCryptographicBindingMethodsSupported(List.of("did:jwk")); credentialConfig.setCredentialSigningAlgValuesSupported(List.of("Ed25519Signature2020")); credentialConfig.setCredentialSubject(Map.of("name", "Full Name")); + credentialConfig.setKeyManagerAppId("TEST2019"); credentialConfigurationDTO = new CredentialConfigurationDTO(); credentialConfigurationDTO.setDisplay(List.of()); @@ -91,7 +92,7 @@ public void addNewCredentialConfig_Success() throws JsonProcessingException { @Test public void getCredentialConfigById_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); - when(credentialConfigRepository.findById(anyString())).thenReturn(optional); + when(credentialConfigRepository.findByConfigId(anyString())).thenReturn(optional); when(credentialConfigMapper.toDto(any(CredentialConfig.class))).thenReturn(credentialConfigurationDTO); CredentialConfigurationDTO credentialConfigurationDTOResponse = credentialConfigurationService.getCredentialConfigurationById("test"); @@ -108,7 +109,7 @@ public void getCredentialConfigById_Success() throws JsonProcessingException { @Test public void getCredentialConfigurationById_ConfigNotFound() { - when(credentialConfigRepository.findById("12345678")) + when(credentialConfigRepository.findByConfigId("12345678")) .thenReturn(Optional.empty()); CertifyException exception = assertThrows(CertifyException.class, () -> @@ -120,7 +121,7 @@ public void getCredentialConfigurationById_ConfigNotFound() { @Test public void updateExistingCredentialConfig_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); - when(credentialConfigRepository.findById(anyString())).thenReturn(optional); + when(credentialConfigRepository.findByConfigId(anyString())).thenReturn(optional); doNothing().when(credentialConfigMapper).updateEntityFromDto(any(CredentialConfigurationDTO.class), any(CredentialConfig.class)); CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.updateCredentialConfiguration("12345678", credentialConfigurationDTO); @@ -133,7 +134,7 @@ public void updateExistingCredentialConfig_Success() throws JsonProcessingExcept @Test public void updateExistingCredentialConfiguration_ConfigNotFound() { - when(credentialConfigRepository.findById(anyString())) + when(credentialConfigRepository.findByConfigId(anyString())) .thenReturn(Optional.empty()); CertifyException exception = assertThrows(CertifyException.class, () -> @@ -145,8 +146,8 @@ public void updateExistingCredentialConfiguration_ConfigNotFound() { @Test public void deleteCredentialConfig_Success() throws JsonProcessingException { Optional optional = Optional.of(credentialConfig); - when(credentialConfigRepository.findById(anyString())).thenReturn(optional); - doNothing().when(credentialConfigRepository).deleteById(anyString()); + when(credentialConfigRepository.findByConfigId(anyString())).thenReturn(optional); + doNothing().when(credentialConfigRepository).delete(any(CredentialConfig.class)); String result = credentialConfigurationService.deleteCredentialConfigurationById("12345678"); @@ -156,7 +157,7 @@ public void deleteCredentialConfig_Success() throws JsonProcessingException { @Test public void deleteCredentialConfiguration_ConfigNotFound() { - when(credentialConfigRepository.findById(anyString())) + when(credentialConfigRepository.findByConfigId(anyString())) .thenReturn(Optional.empty()); CertifyException exception = assertThrows(CertifyException.class, () -> diff --git a/certify-service/src/test/java/io/mosip/certify/vcformatters/VelocityTemplatingEngineImplTest.java b/certify-service/src/test/java/io/mosip/certify/vcformatters/VelocityTemplatingEngineImplTest.java index 3ca265820..2d60a6680 100644 --- a/certify-service/src/test/java/io/mosip/certify/vcformatters/VelocityTemplatingEngineImplTest.java +++ b/certify-service/src/test/java/io/mosip/certify/vcformatters/VelocityTemplatingEngineImplTest.java @@ -21,10 +21,8 @@ import org.springframework.web.client.RestTemplate; import io.mosip.certify.core.exception.CertifyException; -import io.mosip.certify.entity.CredentialTemplate; -import io.mosip.certify.repository.CredentialTemplateRepository; -import org.json.JSONException; -import org.json.JSONObject; +import io.mosip.certify.entity.CredentialConfig; +import io.mosip.certify.repository.CredentialConfigRepository; import junit.framework.TestCase; @@ -39,12 +37,12 @@ public class VelocityTemplatingEngineImplTest extends TestCase { @InjectMocks private VelocityTemplatingEngineImpl formatter; @Mock - CredentialTemplateRepository credentialTemplateRepository; + CredentialConfigRepository credentialConfigRepository; - private CredentialTemplate vc1; - private CredentialTemplate vc2; - private CredentialTemplate vc3; - private CredentialTemplate vc4; + private CredentialConfig vc1; + private CredentialConfig vc2; + private CredentialConfig vc3; + private CredentialConfig vc4; @SneakyThrows @Before @@ -134,7 +132,7 @@ public void setUp() { "https://vharsh.github.io/DID/mock-context.json,https://www.w3.org/2018/credentials/v1" ); //when(templateRepository.findByCredentialTypeAndContext("MockVerifiableCredential,VerifiableCredential", "https://schema.org,https://www.w3.org/2018/credentials/v1")).thenReturn(Optional.of(vc1)); - when(credentialTemplateRepository.findByCredentialTypeAndContext("MockVerifiableCredential,VerifiableCredential", "https://example.org/Person.json,https://www.w3.org/ns/credentials/v2")).thenReturn(Optional.of(vc2)); + when(credentialConfigRepository.findByCredentialTypeAndContext("MockVerifiableCredential,VerifiableCredential", "https://example.org/Person.json,https://www.w3.org/ns/credentials/v2")).thenReturn(Optional.of(vc2)); //when(templateRepository.findByCredentialTypeAndContext("MockVerifiableCredential,VerifiableCredential", "https://vharsh.github.io/DID/mock-context.json,https://www.w3.org/2018/credentials/v1")).thenReturn(Optional.of(vc3)); formatter.initialize(); // engine = new VelocityEngine(); @@ -146,9 +144,9 @@ public void setUp() { // engine.init(); } - private CredentialTemplate initTemplate(String template, String type, String context, String format, String didUrl, String keyManagerAppId, String keyManagerRefId, String signatureAlgo, String sdClaim) { - CredentialTemplate t = new CredentialTemplate(); - t.setTemplate(template); + private CredentialConfig initTemplate(String template, String type, String context, String format, String didUrl, String keyManagerAppId, String keyManagerRefId, String signatureAlgo, String sdClaim) { + CredentialConfig t = new CredentialConfig(); + t.setVcTemplate(template); t.setCredentialType(type); t.setContext(context); t.setCredentialFormat(format); @@ -161,9 +159,9 @@ private CredentialTemplate initTemplate(String template, String type, String con } - private CredentialTemplate initTemplate(String template, String type, String context) { - CredentialTemplate t = new CredentialTemplate(); - t.setTemplate(template); + private CredentialConfig initTemplate(String template, String type, String context) { + CredentialConfig t = new CredentialConfig(); + t.setVcTemplate(template); t.setCredentialType(type); t.setContext(context); return t; @@ -252,7 +250,7 @@ public void getTemplateNameWithValidKey_thenPass() { String key = "MockVerifiableCredential,VerifiableCredential:https://example.org/Person.json,https://www.w3.org/ns/credentials/v2"; String template = formatter.getTemplate(key); Assert.assertNotNull(template); - Assert.assertEquals(vc2.getTemplate(), template); + Assert.assertEquals(vc2.getVcTemplate(), template); } @Test diff --git a/certify-service/src/test/resources/schema.sql b/certify-service/src/test/resources/schema.sql index 0015a614c..692fe885d 100644 --- a/certify-service/src/test/resources/schema.sql +++ b/certify-service/src/test/resources/schema.sql @@ -77,17 +77,30 @@ CREATE TABLE IF NOT EXISTS rendering_template ( CONSTRAINT pk_rendertmp_id PRIMARY KEY (id) ); -CREATE TABLE IF NOT EXISTS credential_template( - context character varying(1024) NOT NULL, - credential_type character varying(512) NOT NULL, - template VARCHAR NOT NULL, - credential_format character varying(1024), - did_url VARCHAR, - key_manager_app_id character varying(36) NOT NULL, - key_manager_ref_id character varying(128), - signature_algo character(2048), - sd_claim VARCHAR, - cr_dtimes TIMESTAMP DEFAULT NOW() NOT NULL, +-- Changed all `JSONB` and `TEXT[]` types to VARCHAR to make it work with H2 database +CREATE TABLE IF NOT EXISTS credential_config ( + config_id VARCHAR(255), + status VARCHAR(255), + vc_template VARCHAR(1000), + doctype VARCHAR(255), + context VARCHAR(255) NOT NULL, + credential_type VARCHAR(255) NOT NULL, + credential_format VARCHAR(255) NOT NULL, + did_url VARCHAR(255) NOT NULL, + key_manager_app_id VARCHAR(36) NOT NULL, + key_manager_ref_id VARCHAR(128), + signature_algo VARCHAR(255), + sd_claim VARCHAR(255), + display VARCHAR NOT NULL, + display_order VARCHAR NOT NULL, + scope VARCHAR(255) NOT NULL, + cryptographic_binding_methods_supported VARCHAR NOT NULL, + credential_signing_alg_values_supported VARCHAR NOT NULL, + proof_types_supported VARCHAR NOT NULL, + credential_subject VARCHAR, + claims VARCHAR, + plugin_configurations VARCHAR, + cr_dtimes TIMESTAMP NOT NULL, upd_dtimes TIMESTAMP, - CONSTRAINT pk_template PRIMARY KEY (context, credential_type, credential_format) + CONSTRAINT pk_config_id PRIMARY KEY (context, credential_type, credential_format) ); diff --git a/db_scripts/mosip_certify/combined.sql b/db_scripts/mosip_certify/combined.sql index 71a6625cb..e51a0449f 100644 --- a/db_scripts/mosip_certify/combined.sql +++ b/db_scripts/mosip_certify/combined.sql @@ -22,21 +22,6 @@ CREATE TABLE ca_cert_store( CONSTRAINT cert_thumbprint_unique UNIQUE (cert_thumbprint,partner_domain) ); -Drop table if exists credential_template; -CREATE TABLE IF NOT EXISTS credential_template( - context character varying(1024) NOT NULL, - credential_type character varying(512) NOT NULL, - template VARCHAR NOT NULL, - credential_format character varying(1024), - did_url VARCHAR, - key_manager_app_id character varying(36) NOT NULL, - key_manager_ref_id character varying(128), - signature_algo character(2048), - sd_claim VARCHAR, - cr_dtimes timestamp NOT NULL default now(), - upd_dtimes timestamp, - CONSTRAINT pk_template PRIMARY KEY (context, credential_type, credential_format) -); Drop table if exists key_alias; CREATE TABLE key_alias( id character varying(36) NOT NULL, @@ -96,14 +81,18 @@ CREATE TABLE rendering_template ( ); DROP TABLE IF EXISTS credential_config CASCADE CONSTRAINTS; CREATE TABLE credential_config ( - id VARCHAR(255) PRIMARY KEY, + config_id VARCHAR(255), status VARCHAR(255), vc_template VARCHAR, doctype VARCHAR, - context TEXT[] NOT NULL, - credential_type TEXT[] NOT NULL, + context VARCHAR NOT NULL, + credential_type VARCHAR NOT NULL, credential_format VARCHAR(255) NOT NULL, did_url VARCHAR NOT NULL, + key_manager_app_id VARCHAR(36) NOT NULL, + key_manager_ref_id VARCHAR(128), + signature_algo VARCHAR(2048), + sd_claim VARCHAR, display JSONB NOT NULL, display_order TEXT[] NOT NULL, scope VARCHAR(255) NOT NULL, @@ -115,7 +104,7 @@ CREATE TABLE credential_config ( plugin_configurations JSONB, cr_dtimes TIMESTAMP NOT NULL, upd_dtimes TIMESTAMP, - CONSTRAINT pk_config_id PRIMARY KEY (id) + CONSTRAINT pk_config_id PRIMARY KEY (context, credential_type, credential_format) ); INSERT INTO key_policy_def (app_id, key_validity_duration, pre_expire_days, access_allowed, is_active, cr_by, cr_dtimes) SELECT app_id, key_validity_duration, pre_expire_days, access_allowed, is_active, cr_by, CURRENT_TIMESTAMP diff --git a/db_scripts/mosip_certify/ddl.sql b/db_scripts/mosip_certify/ddl.sql index d059ca68a..d98162c37 100644 --- a/db_scripts/mosip_certify/ddl.sql +++ b/db_scripts/mosip_certify/ddl.sql @@ -5,6 +5,5 @@ \ir ddl/certify-key_store.sql \ir ddl/certify-ca_cert_store.sql \ir ddl/certify-rendering_template.sql -\ir ddl/certify-credential_template.sql \ir ddl/certify-credential_config.sql diff --git a/db_scripts/mosip_certify/ddl/certify-credential_config.sql b/db_scripts/mosip_certify/ddl/certify-credential_config.sql index bc4856d2a..114540956 100644 --- a/db_scripts/mosip_certify/ddl/certify-credential_config.sql +++ b/db_scripts/mosip_certify/ddl/certify-credential_config.sql @@ -12,14 +12,18 @@ -- ------------------------------------------------------------------------------------------ CREATE TABLE credential_config ( - id VARCHAR(255) PRIMARY KEY, + config_id VARCHAR(255), status VARCHAR(255), vc_template VARCHAR, doctype VARCHAR, - context TEXT[] NOT NULL, - credential_type TEXT[] NOT NULL, + context VARCHAR NOT NULL, + credential_type VARCHAR NOT NULL, credential_format VARCHAR(255) NOT NULL, did_url VARCHAR NOT NULL, + key_manager_app_id VARCHAR(36) NOT NULL, + key_manager_ref_id VARCHAR(128), + signature_algo VARCHAR(2048), + sd_claim VARCHAR, display JSONB NOT NULL, display_order TEXT[] NOT NULL, scope VARCHAR(255) NOT NULL, @@ -31,7 +35,7 @@ CREATE TABLE credential_config ( plugin_configurations JSONB, cr_dtimes TIMESTAMP NOT NULL, upd_dtimes TIMESTAMP, - CONSTRAINT pk_config_id PRIMARY KEY (id) + CONSTRAINT pk_config_id PRIMARY KEY (context, credential_type, credential_format) ); COMMENT ON TABLE credential_config IS 'Credential Config: Contains details of credential configuration.'; @@ -39,17 +43,23 @@ COMMENT ON TABLE credential_config IS 'Credential Config: Contains details of cr COMMENT ON COLUMN credential_config.id IS 'Credential Config ID: Unique id assigned to save and identify configuration.'; COMMENT ON COLUMN credential_config.status IS 'Credential Config Status: Status of the credential configuration.'; COMMENT ON COLUMN credential_config.vc_template IS 'VC Template: Template used for the verifiable credential.'; +COMMENT ON COLUMN credential_config.doctype IS 'Doc Type: Doc Type specifically for Mdoc VC.'; COMMENT ON COLUMN credential_config.context IS 'Context: Array of context URIs for the credential.'; COMMENT ON COLUMN credential_config.credential_type IS 'Credential Type: Array of credential types supported.'; COMMENT ON COLUMN credential_config.credential_format IS 'Credential Format: Format of the credential (e.g., JWT, JSON-LD).'; COMMENT ON COLUMN credential_config.did_url IS 'DID URL: Decentralized Identifier URL for the issuer.'; -COMMENT ON COLUMN credential_config.display_id IS 'Display ID: Foreign key reference to credential_display table.'; +COMMENT ON COLUMN credential_config.key_manager_app_id IS 'Key Manager App Id: AppId of the keymanager'; +COMMENT ON COLUMN credential_config.key_manager_ref_id IS 'Key Manager Reference Id: RefId of the keymanager'; +COMMENT ON COLUMN credential_config.signature_algo IS 'Signature Algorithm: This is for VC signature or proof algorithm'; +COMMENT ON COLUMN credential_config.sd_claim IS 'SD Claim: This is a comma separated list for selective disclosure'; +COMMENT ON COLUMN credential_config.display IS 'Display: Credential Display object'; COMMENT ON COLUMN credential_config.display_order IS 'Display Order: Array defining the order of display elements.'; COMMENT ON COLUMN credential_config.scope IS 'Scope: Authorization scope for the credential.'; COMMENT ON COLUMN credential_config.cryptographic_binding_methods_supported IS 'Cryptographic Binding Methods: Array of supported binding methods.'; COMMENT ON COLUMN credential_config.credential_signing_alg_values_supported IS 'Credential Signing Algorithms: Array of supported signing algorithms.'; COMMENT ON COLUMN credential_config.proof_types_supported IS 'Proof Types: JSON object containing supported proof types and their configurations.'; COMMENT ON COLUMN credential_config.credential_subject IS 'Credential Subject: JSON object containing subject attributes schema.'; +COMMENT ON COLUMN credential_config.claims IS 'Claims: JSON object containing subject attributes schema specifically for Mdoc VC.'; COMMENT ON COLUMN credential_config.plugin_configurations IS 'Plugin Configurations: Array of JSON objects for plugin configurations.'; COMMENT ON COLUMN credential_config.cr_dtimes IS 'Created DateTime: Date and time when the config was inserted in table.'; -COMMENT ON COLUMN credential_config.upd_dtimes IS 'Updated DateTime: Date and time when the config was last updated in table.'; \ No newline at end of file +COMMENT ON COLUMN credential_config.upd_dtimes IS 'Updated DateTime: Date and time when the config was last updated in table.'; diff --git a/db_scripts/mosip_certify/ddl/combined.sql b/db_scripts/mosip_certify/ddl/combined.sql index 9bdfab9a7..b17c9095c 100644 --- a/db_scripts/mosip_certify/ddl/combined.sql +++ b/db_scripts/mosip_certify/ddl/combined.sql @@ -55,31 +55,20 @@ CREATE TABLE IF NOT EXISTS rendering_template ( upd_dtimes timestamp, CONSTRAINT pk_svgtmp_id PRIMARY KEY (id) ); -DROP TABLE IF EXISTS credential_template CASCADE CONSTRAINTS; -CREATE TABLE IF NOT EXISTS credential_template( - context character varying(1024) NOT NULL, - credential_type character varying(512) NOT NULL, - template VARCHAR NOT NULL, - credential_format character varying(1024), - did_url VARCHAR, - key_manager_app_id character varying(36) NOT NULL, - key_manager_ref_id character varying(128), - signature_algo character(2048), - sd_claim VARCHAR, - cr_dtimes timestamp NOT NULL default now(), - upd_dtimes timestamp, - CONSTRAINT pk_template PRIMARY KEY (context, credential_type, credential_format) -); -DROP TABLE IF EXISTS credential_config CASCADE CONSTRAINTS; -CREATE TABLE IF NOT EXISTS credential_config ( - id VARCHAR(255) PRIMARY KEY, + +CREATE TABLE credential_config ( + config_id VARCHAR(255), status VARCHAR(255), vc_template VARCHAR, doctype VARCHAR, - context TEXT[] NOT NULL, - credential_type TEXT[] NOT NULL, + context VARCHAR NOT NULL, + credential_type VARCHAR NOT NULL, credential_format VARCHAR(255) NOT NULL, did_url VARCHAR NOT NULL, + key_manager_app_id VARCHAR(36) NOT NULL, + key_manager_ref_id VARCHAR(128), + signature_algo VARCHAR(2048), + sd_claim VARCHAR, display JSONB NOT NULL, display_order TEXT[] NOT NULL, scope VARCHAR(255) NOT NULL, @@ -91,7 +80,7 @@ CREATE TABLE IF NOT EXISTS credential_config ( plugin_configurations JSONB, cr_dtimes TIMESTAMP NOT NULL, upd_dtimes TIMESTAMP, - CONSTRAINT pk_config_id PRIMARY KEY (id) + CONSTRAINT pk_config_id PRIMARY KEY (context, credential_type, credential_format) ); diff --git a/db_scripts/mosip_certify/ddl/certify-credential_template.sql b/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_rollback.sql similarity index 55% rename from db_scripts/mosip_certify/ddl/certify-credential_template.sql rename to db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_rollback.sql index 748989c0f..b632a60a8 100644 --- a/db_scripts/mosip_certify/ddl/certify-credential_template.sql +++ b/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_rollback.sql @@ -3,28 +3,25 @@ -- file, You can obtain one at https://mozilla.org/MPL/2.0/. -- ------------------------------------------------------------------------------------------------- -- Database Name: inji_certify --- Table Name : credential_template --- Purpose : Template Data table +-- Table Name : credential_config, credential_template +-- Purpose : To remove Certify v0.12.0 changes and make DB ready for Certify v0.11.0 -- +-- Create By : Piyush Shukla +-- Created Date : March 2025 -- -- Modified Date Modified By Comments / Remarks -- ------------------------------------------------------------------------------------------ --- 6/1/2025 Sasi Enhance to support multiple formats -- ------------------------------------------------------------------------------------------ -CREATE TABLE IF NOT EXISTS credential_template( +drop table credential_config; + +CREATE TABLE credential_template( context character varying(1024) NOT NULL, credential_type character varying(512) NOT NULL, template VARCHAR NOT NULL, - credential_format character varying(1024), - did_url VARCHAR, - key_manager_app_id character varying(36) NOT NULL, - key_manager_ref_id character varying(128), - signature_algo character(2048), - sd_claim VARCHAR, cr_dtimes timestamp NOT NULL default now(), upd_dtimes timestamp, - CONSTRAINT pk_template PRIMARY KEY (context, credential_type, credential_format) + CONSTRAINT pk_template PRIMARY KEY (context, credential_type) ); COMMENT ON TABLE credential_template IS 'Template Data: Contains velocity template for VC'; @@ -33,10 +30,4 @@ COMMENT ON COLUMN credential_template.context IS 'VC Context: Context URL list i COMMENT ON COLUMN credential_template.credential_type IS 'Credential Type: Credential type list items separated by comma(,)'; COMMENT ON COLUMN credential_template.template IS 'Template Content: Velocity Template to generate the VC'; COMMENT ON COLUMN credential_template.cr_dtimes IS 'Date when the template was inserted in table.'; -COMMENT ON COLUMN credential_template.upd_dtimes IS 'Date when the template was last updated in table.'; -COMMENT ON COLUMN credential_template.credential_format IS ''; -COMMENT ON COLUMN credential_template.did_url IS 'URL for the public key. Should point to the exact key. Supports DID document or public key'; -COMMENT ON COLUMN credential_template.key_manager_app_id IS 'AppId of the keymanager'; -COMMENT ON COLUMN credential_template.key_manager_ref_id IS 'RefId of the keymanager'; -COMMENT ON COLUMN credential_template.signature_algo IS 'This for VC signature or proof algorithm'; -COMMENT ON COLUMN credential_template.sd_claim IS 'This is a comma seperated list for selective disclosure'; +COMMENT ON COLUMN credential_template.upd_dtimes IS 'Date when the template was last updated in table.'; \ No newline at end of file diff --git a/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_upgrade.sql b/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_upgrade.sql new file mode 100644 index 000000000..2e7c7a1bf --- /dev/null +++ b/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_upgrade.sql @@ -0,0 +1,69 @@ +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at https://mozilla.org/MPL/2.0/. +-- ------------------------------------------------------------------------------------------------- +-- Database Name: inji_certify +-- Table Name : rendering_template,credential_template, ca_cert_store +-- Purpose : To upgrade Certify v0.11.0 changes and make it compatible with v0.12.0 +-- +-- Create By : Piyush Shukla +-- Created Date : January-2025 +-- +-- Modified Date Modified By Comments / Remarks +-- ------------------------------------------------------------------------------------------ +-- ------------------------------------------------------------------------------------------ + +drop table credential_template; + +CREATE TABLE credential_config ( + config_id VARCHAR(255), + status VARCHAR(255), + vc_template VARCHAR, + doctype VARCHAR, + context VARCHAR NOT NULL, + credential_type VARCHAR NOT NULL, + credential_format VARCHAR(255) NOT NULL, + did_url VARCHAR NOT NULL, + key_manager_app_id VARCHAR(36) NOT NULL, + key_manager_ref_id VARCHAR(128), + signature_algo VARCHAR(2048), + sd_claim VARCHAR, + display JSONB NOT NULL, + display_order TEXT[] NOT NULL, + scope VARCHAR(255) NOT NULL, + cryptographic_binding_methods_supported TEXT[] NOT NULL, + credential_signing_alg_values_supported TEXT[] NOT NULL, + proof_types_supported JSONB NOT NULL, + credential_subject JSONB, + claims JSONB, + plugin_configurations JSONB, + cr_dtimes TIMESTAMP NOT NULL, + upd_dtimes TIMESTAMP, + CONSTRAINT pk_config_id PRIMARY KEY (context, credential_type, credential_format) +); + +COMMENT ON TABLE credential_config IS 'Credential Config: Contains details of credential configuration.'; + +COMMENT ON COLUMN credential_config.id IS 'Credential Config ID: Unique id assigned to save and identify configuration.'; +COMMENT ON COLUMN credential_config.status IS 'Credential Config Status: Status of the credential configuration.'; +COMMENT ON COLUMN credential_config.vc_template IS 'VC Template: Template used for the verifiable credential.'; +COMMENT ON COLUMN credential_config.doctype IS 'Doc Type: Doc Type specifically for Mdoc VC.'; +COMMENT ON COLUMN credential_config.context IS 'Context: Array of context URIs for the credential.'; +COMMENT ON COLUMN credential_config.credential_type IS 'Credential Type: Array of credential types supported.'; +COMMENT ON COLUMN credential_config.credential_format IS 'Credential Format: Format of the credential (e.g., JWT, JSON-LD).'; +COMMENT ON COLUMN credential_config.did_url IS 'DID URL: Decentralized Identifier URL for the issuer.'; +COMMENT ON COLUMN credential_config.key_manager_app_id IS 'Key Manager App Id: AppId of the keymanager'; +COMMENT ON COLUMN credential_config.key_manager_ref_id IS 'Key Manager Reference Id: RefId of the keymanager'; +COMMENT ON COLUMN credential_config.signature_algo IS 'Signature Algorithm: This is for VC signature or proof algorithm'; +COMMENT ON COLUMN credential_config.sd_claim IS 'SD Claim: This is a comma separated list for selective disclosure'; +COMMENT ON COLUMN credential_config.display IS 'Display: Credential Display object'; +COMMENT ON COLUMN credential_config.display_order IS 'Display Order: Array defining the order of display elements.'; +COMMENT ON COLUMN credential_config.scope IS 'Scope: Authorization scope for the credential.'; +COMMENT ON COLUMN credential_config.cryptographic_binding_methods_supported IS 'Cryptographic Binding Methods: Array of supported binding methods.'; +COMMENT ON COLUMN credential_config.credential_signing_alg_values_supported IS 'Credential Signing Algorithms: Array of supported signing algorithms.'; +COMMENT ON COLUMN credential_config.proof_types_supported IS 'Proof Types: JSON object containing supported proof types and their configurations.'; +COMMENT ON COLUMN credential_config.credential_subject IS 'Credential Subject: JSON object containing subject attributes schema.'; +COMMENT ON COLUMN credential_config.claims IS 'Claims: JSON object containing subject attributes schema specifically for Mdoc VC.'; +COMMENT ON COLUMN credential_config.plugin_configurations IS 'Plugin Configurations: Array of JSON objects for plugin configurations.'; +COMMENT ON COLUMN credential_config.cr_dtimes IS 'Created DateTime: Date and time when the config was inserted in table.'; +COMMENT ON COLUMN credential_config.upd_dtimes IS 'Updated DateTime: Date and time when the config was last updated in table.'; diff --git a/docker-compose/docker-compose-injistack/certify_init.sql b/docker-compose/docker-compose-injistack/certify_init.sql index 4561918b5..3fa96494c 100644 --- a/docker-compose/docker-compose-injistack/certify_init.sql +++ b/docker-compose/docker-compose-injistack/certify_init.sql @@ -97,140 +97,196 @@ CREATE TABLE certify.rendering_template ( CONSTRAINT pk_svgtmp_id PRIMARY KEY (id) ); -CREATE TABLE IF NOT EXISTS certify.credential_template( - context character varying(1024) NOT NULL, - credential_type character varying(512) NOT NULL, - template VARCHAR NOT NULL, - credential_format character varying(1024), - did_url VARCHAR, - key_manager_app_id character varying(36) NOT NULL, - key_manager_ref_id character varying(128), - signature_algo character(2048), - sd_claim VARCHAR, - cr_dtimes timestamp NOT NULL default now(), - upd_dtimes timestamp, - CONSTRAINT pk_template PRIMARY KEY (context, credential_type, credential_format) -); - -CREATE TABLE IF NOT EXISTS credential_config ( - id VARCHAR(255) PRIMARY KEY, +CREATE TABLE IF NOT EXISTS credential_config ( + config_id VARCHAR(255), status VARCHAR(255), vc_template VARCHAR, - context TEXT[] NOT NULL, - credential_type TEXT[] NOT NULL, + doctype VARCHAR, + context VARCHAR NOT NULL, + credential_type VARCHAR NOT NULL, credential_format VARCHAR(255) NOT NULL, did_url VARCHAR NOT NULL, + key_manager_app_id VARCHAR(36) NOT NULL, + key_manager_ref_id VARCHAR(128), + signature_algo VARCHAR(2048), + sd_claim VARCHAR, display JSONB NOT NULL, display_order TEXT[] NOT NULL, scope VARCHAR(255) NOT NULL, cryptographic_binding_methods_supported TEXT[] NOT NULL, credential_signing_alg_values_supported TEXT[] NOT NULL, proof_types_supported JSONB NOT NULL, - credential_subject JSONB NOT NULL, + credential_subject JSONB, + claims JSONB, plugin_configurations JSONB, cr_dtimes TIMESTAMP NOT NULL, upd_dtimes TIMESTAMP, - CONSTRAINT pk_config_id PRIMARY KEY (id) + CONSTRAINT pk_config_id PRIMARY KEY (context, credential_type, credential_format) ); -INSERT INTO certify.credential_template (context, credential_type, template, credential_format, key_manager_app_id, key_manager_ref_id, did_url, cr_dtimes, upd_dtimes) VALUES ('https://www.w3.org/2018/credentials/v1', 'FarmerCredential,VerifiableCredential', '{ - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://piyush7034.github.io/my-files/farmer.json", - "https://w3id.org/security/suites/ed25519-2020/v1" - ], - "issuer": "${_issuer}", - "type": [ - "VerifiableCredential", - "FarmerCredential" - ], - "issuanceDate": "${validFrom}", - "expirationDate": "${validUntil}", - "credentialSubject": { - "id": "${_holderId}", - "fullName": "${fullName}", - "mobileNumber": "${mobileNumber}", - "dateOfBirth": "${dateOfBirth}", - "gender": "${gender}", - "state": "${state}", - "district": "${district}", - "villageOrTown": "${villageOrTown}", - "postalCode": "${postalCode}", - "landArea": "${landArea}", - "landOwnershipType": "${landOwnershipType}", - "primaryCropType": "${primaryCropType}", - "secondaryCropType": "${secondaryCropType}", - "face": "${face}", - "farmerID": "${farmerID}" +INSERT INTO credential_config ( + config_id, + status, + vc_template, + doctype, + context, + credential_type, + credential_format, + did_url, + key_manager_app_id, + key_manager_ref_id, + signature_algo, + sd_claim, + display, + display_order, + scope, + cryptographic_binding_methods_supported, + credential_signing_alg_values_supported, + proof_types_supported, + credential_subject, + claims, + plugin_configurations, + cr_dtimes, + upd_dtimes +) +VALUES ( + gen_random_uuid()::VARCHAR(255), -- generating a unique config_id + 'active', -- assuming an active status + '{ + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://piyush7034.github.io/my-files/farmer.json", + "https://w3id.org/security/suites/ed25519-2020/v1" + ], + "issuer": "${_issuer}", + "type": [ + "VerifiableCredential", + "FarmerCredential" + ], + "issuanceDate": "${validFrom}", + "expirationDate": "${validUntil}", + "credentialSubject": { + "id": "${_holderId}", + "fullName": "${fullName}", + "mobileNumber": "${mobileNumber}", + "dateOfBirth": "${dateOfBirth}", + "gender": "${gender}", + "state": "${state}", + "district": "${district}", + "villageOrTown": "${villageOrTown}", + "postalCode": "${postalCode}", + "landArea": "${landArea}", + "landOwnershipType": "${landOwnershipType}", + "primaryCropType": "${primaryCropType}", + "secondaryCropType": "${secondaryCropType}", + "face": "${face}", + "farmerID": "${farmerID}" + } } -} -', 'ldp_vc', 'CERTIFY_VC_SIGN_ED25519','ED25519_SIGN','did:web:jainhitesh9998.github.io:tempfiles:vc-local-ed25519#key-0', '2024-10-24 12:32:38.065994', NULL); + ', -- the VC template from the JSON + NULL, -- doctype from JSON + 'https://www.w3.org/2018/credentials/v1, https://piyush7034.github.io/my-files/farmer.json, https://w3id.org/security/suites/ed25519-2020/v1', -- context as comma-separated string + 'VerifiableCredential,FarmerCredential', -- credential_type as comma-separated string + 'ldp_vc', -- credential_format + 'did:web:jainhitesh9998.github.io:tempfiles:vc-local-ed25519#key-0', -- did_url + 'CERTIFY_VC_SIGN_ED25519', -- key_manager_app_id + 'ED25519_SIGN', -- key_manager_ref_id (optional) + 'did:web:vharsh.github.io:DID:harsh', -- signature_algo (optional) + NULL, -- sd_claim (optional) + '[{"name": "Farmer Verifiable Credential", "locale": "en", "logo": {"url": "https://example.com/logo.png", "alt_text": "Farmer Credential Logo"}, "background_color": "#12107c", "text_color": "#FFFFFF"}]'::JSONB, -- display + ARRAY['fullName', 'mobileNumber', 'dateOfBirth', 'gender', 'state', 'district', 'villageOrTown', 'postalCode', 'landArea', 'landOwnershipType', 'primaryCropType', 'secondaryCropType', 'farmerID'], -- display_order + 'farmer_identity_vc', -- scope + ARRAY['did:jwk'], -- cryptographic_binding_methods_supported + ARRAY['Ed25519Signature2020'], -- credential_signing_alg_values_supported + '{"jwt": {"proof_signing_alg_values_supported": ["RS256", "ES256"]}}'::JSONB, -- proof_types_supported + '{"fullName": {"display": [{"name": "Full Name", "locale": "en"}]}, "phone": {"display": [{"name": "Phone Number", "locale": "en"}]}, "dateOfBirth": {"display": [{"name": "Date of Birth", "locale": "en"}]}, "gender": {"display": [{"name": "Gender", "locale": "en"}]}}'::JSONB, -- credential_subject + NULL, -- claims (optional) + '[{"mosip.certify.mock.data-provider.csv.identifier-column": "id", "mosip.certify.mock.data-provider.csv.data-columns": "id,fullName,mobileNumber,dateOfBirth,gender,state,district,villageOrTown,postalCode,landArea,landOwnershipType,primaryCropType,secondaryCropType,face,farmerID", "mosip.certify.mock.data-provider.csv-registry-uri": "/home/mosip/config/farmer_identity_data.csv"}]'::JSONB, -- plugin_configurations + NOW(), -- cr_dtimes + NULL -- upd_dtimes (optional) +); -INSERT INTO certify.credential_template (context, credential_type, template, credential_format, key_manager_app_id, key_manager_ref_id, did_url, cr_dtimes, upd_dtimes) VALUES ('https://www.w3.org/2018/credentials/v1', 'VerifiableCredential,FarmerCredential', '{ - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://piyush7034.github.io/my-files/farmer.json", - "https://w3id.org/security/suites/ed25519-2020/v1" - ], - "issuer": "${_issuer}", - "type": [ - "VerifiableCredential", - "FarmerCredential" - ], - "issuanceDate": "${validFrom}", - "expirationDate": "${validUntil}", - "credentialSubject": { - "id": "${_holderId}", - "fullName": "${fullName}", - "mobileNumber": "${mobileNumber}", - "dateOfBirth": "${dateOfBirth}", - "gender": "${gender}", - "state": "${state}", - "district": "${district}", - "villageOrTown": "${villageOrTown}", - "postalCode": "${postalCode}", - "landArea": "${landArea}", - "landOwnershipType": "${landOwnershipType}", - "primaryCropType": "${primaryCropType}", - "secondaryCropType": "${secondaryCropType}", - "face": "${face}", - "farmerID": "${farmerID}" +INSERT INTO credential_config ( + config_id, + status, + vc_template, + doctype, + context, + credential_type, + credential_format, + did_url, + key_manager_app_id, + key_manager_ref_id, + signature_algo, + sd_claim, + display, + display_order, + scope, + cryptographic_binding_methods_supported, + credential_signing_alg_values_supported, + proof_types_supported, + credential_subject, + claims, + plugin_configurations, + cr_dtimes, + upd_dtimes +) +VALUES ( + gen_random_uuid()::VARCHAR(255), -- generating a unique config_id + 'active', -- assuming an active status + '{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://piyush7034.github.io/my-files/farmer.json", + "https://w3id.org/security/suites/ed25519-2020/v1" + ], + "issuer": "${_issuer}", + "type": [ + "VerifiableCredential", + "FarmerCredential" + ], + "issuanceDate": "${validFrom}", + "expirationDate": "${validUntil}", + "credentialSubject": { + "id": "${_holderId}", + "fullName": "${fullName}", + "mobileNumber": "${mobileNumber}", + "dateOfBirth": "${dateOfBirth}", + "gender": "${gender}", + "state": "${state}", + "district": "${district}", + "villageOrTown": "${villageOrTown}", + "postalCode": "${postalCode}", + "landArea": "${landArea}", + "landOwnershipType": "${landOwnershipType}", + "primaryCropType": "${primaryCropType}", + "secondaryCropType": "${secondaryCropType}", + "face": "${face}", + "farmerID": "${farmerID}" + } } -} -', 'ldp_vc', 'CERTIFY_VC_SIGN_ED25519','ED25519_SIGN','did:web:jainhitesh9998.github.io:tempfiles:vc-local-ed25519#key-0', '2024-10-24 12:32:38.065994', NULL); - -INSERT INTO certify.credential_template(context, credential_type, template, credential_format, key_manager_app_id, key_manager_ref_id, did_url, cr_dtimes, upd_dtimes) VALUES ('https://www.w3.org/ns/credentials/v2', 'FarmerCredential,VerifiableCredential', '{ - "@context": [ - "https://www.w3.org/ns/credentials/v2", - "https://piyush7034.github.io/my-files/farmer.json", - "https://w3id.org/security/suites/ed25519-2020/v1" - ], - "issuer": "${_issuer}", - "type": [ - "VerifiableCredential", - "FarmerCredential" - ], - "validFrom": "${validFrom}", - "validUntil": "${validUntil}", - "credentialSubject": { - "id": "${_holderId}", - "fullName": "${fullName}", - "mobileNumber": "${mobileNumber}", - "dateOfBirth": "${dateOfBirth}", - "gender": "${gender}", - "state": "${state}", - "district": "${district}", - "villageOrTown": "${villageOrTown}", - "postalCode": "${postalCode}", - "landArea": "${landArea}", - "landOwnershipType": "${landOwnershipType}", - "primaryCropType": "${primaryCropType}", - "secondaryCropType": "${secondaryCropType}", - "face": "${face}", - "farmerID": "${farmerID}" - } -}', 'ldp_vc', 'CERTIFY_MOCK_ED25519','ED25519_SIGN', 'did:web:vharsh.github.io:DID:harsh', '2024-10-24 12:32:38.065994', NULL); - + ', -- the VC template from the JSON + NULL, -- doctype from JSON + 'https://www.w3.org/ns/credentials/v2, https://piyush7034.github.io/my-files/farmer.json, https://w3id.org/security/suites/ed25519-2020/v1', -- context as comma-separated string + 'VerifiableCredential,FarmerCredential', -- credential_type as comma-separated string + 'ldp_vc', -- credential_format + 'did:web:jainhitesh9998.github.io:tempfiles:vc-local-ed25519#key-0', -- did_url + 'CERTIFY_VC_SIGN_ED25519', -- key_manager_app_id + 'ED25519_SIGN', -- key_manager_ref_id (optional) + 'did:web:vharsh.github.io:DID:harsh', -- signature_algo (optional) + NULL, -- sd_claim (optional) + '[{"name": "Farmer Verifiable Credential", "locale": "en", "logo": {"url": "https://example.com/logo.png", "alt_text": "Farmer Credential Logo"}, "background_color": "#12107c", "text_color": "#FFFFFF"}]'::JSONB, -- display + ARRAY['fullName', 'mobileNumber', 'dateOfBirth', 'gender', 'state', 'district', 'villageOrTown', 'postalCode', 'landArea', 'landOwnershipType', 'primaryCropType', 'secondaryCropType', 'farmerID'], -- display_order + 'farmer_identity_vc', -- scope + ARRAY['did:jwk'], -- cryptographic_binding_methods_supported + ARRAY['Ed25519Signature2020'], -- credential_signing_alg_values_supported + '{"jwt": {"proof_signing_alg_values_supported": ["RS256", "ES256"]}}'::JSONB, -- proof_types_supported + '{"fullName": {"display": [{"name": "Full Name", "locale": "en"}]}, "phone": {"display": [{"name": "Phone Number", "locale": "en"}]}, "dateOfBirth": {"display": [{"name": "Date of Birth", "locale": "en"}]}, "gender": {"display": [{"name": "Gender", "locale": "en"}]}}'::JSONB, -- credential_subject + NULL, -- claims (optional) + '[{"mosip.certify.mock.data-provider.csv.identifier-column": "id", "mosip.certify.mock.data-provider.csv.data-columns": "id,fullName,mobileNumber,dateOfBirth,gender,state,district,villageOrTown,postalCode,landArea,landOwnershipType,primaryCropType,secondaryCropType,face,farmerID", "mosip.certify.mock.data-provider.csv-registry-uri": "/home/mosip/config/farmer_identity_data.csv"}]'::JSONB, -- plugin_configurations + NOW(), -- cr_dtimes + NULL -- upd_dtimes (optional) +); INSERT INTO certify.key_policy_def(APP_ID,KEY_VALIDITY_DURATION,PRE_EXPIRE_DAYS,ACCESS_ALLOWED,IS_ACTIVE,CR_BY,CR_DTIMES) VALUES('ROOT', 2920, 1125, 'NA', true, 'mosipadmin', now()); INSERT INTO certify.key_policy_def(APP_ID,KEY_VALIDITY_DURATION,PRE_EXPIRE_DAYS,ACCESS_ALLOWED,IS_ACTIVE,CR_BY,CR_DTIMES) VALUES('CERTIFY_SERVICE', 1095, 60, 'NA', true, 'mosipadmin', now()); From 4455c42dab269b8abbe90127c66f0522bb6343c8 Mon Sep 17 00:00:00 2001 From: Piyush7034 Date: Thu, 3 Apr 2025 10:30:32 +0530 Subject: [PATCH 14/14] Changes as per review comments Signed-off-by: Piyush7034 --- ... CredentialConfigurationSupportedDTO.java} | 2 +- ....java => CredentialIssuerMetadataDTO.java} | 4 +- .../spi/CredentialConfigurationService.java | 4 +- .../CredentialConfigController.java | 6 +- .../CredentialConfigurationServiceImpl.java | 14 +++-- .../resources/application-local.properties | 7 ++- .../CredentialConfigControllerTest.java | 6 +- ...redentialConfigurationServiceImplTest.java | 1 + .../resources/application-test.properties | 6 ++ db_scripts/mosip_certify/combined.sql | 2 +- .../ddl/certify-credential_config.sql | 2 +- db_scripts/mosip_certify/ddl/combined.sql | 2 +- .../sql/0.11.0_to_0.12.0_rollback.sql | 48 ++++++++++++--- .../sql/0.11.0_to_0.12.0_upgrade.sql | 61 +++++++++++-------- .../docker-compose-injistack/certify_init.sql | 2 +- 15 files changed, 108 insertions(+), 59 deletions(-) rename certify-core/src/main/java/io/mosip/certify/core/dto/{CredentialConfigurationSupported.java => CredentialConfigurationSupportedDTO.java} (94%) rename certify-core/src/main/java/io/mosip/certify/core/dto/{CredentialIssuerMetadata.java => CredentialIssuerMetadataDTO.java} (78%) diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupportedDTO.java similarity index 94% rename from certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java rename to certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupportedDTO.java index 20202a2ce..58638b367 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupported.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialConfigurationSupportedDTO.java @@ -7,7 +7,7 @@ import java.util.Map; @Data -public class CredentialConfigurationSupported { +public class CredentialConfigurationSupportedDTO { private String format; diff --git a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadataDTO.java similarity index 78% rename from certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java rename to certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadataDTO.java index 51b8ebbe1..f4726de18 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadata.java +++ b/certify-core/src/main/java/io/mosip/certify/core/dto/CredentialIssuerMetadataDTO.java @@ -7,7 +7,7 @@ import java.util.Map; @Data -public class CredentialIssuerMetadata { +public class CredentialIssuerMetadataDTO { @JsonProperty("credential_issuer") private String credentialIssuer; @@ -21,5 +21,5 @@ public class CredentialIssuerMetadata { private List> display; @JsonProperty("credential_configurations_supported") - private Map credentialConfigurationSupported; + private Map credentialConfigurationSupportedDTO; } diff --git a/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java b/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java index 1c83172c0..586c250ab 100644 --- a/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java +++ b/certify-core/src/main/java/io/mosip/certify/core/spi/CredentialConfigurationService.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import io.mosip.certify.core.dto.CredentialConfigResponse; import io.mosip.certify.core.dto.CredentialConfigurationDTO; -import io.mosip.certify.core.dto.CredentialIssuerMetadata; +import io.mosip.certify.core.dto.CredentialIssuerMetadataDTO; public interface CredentialConfigurationService { @@ -15,5 +15,5 @@ public interface CredentialConfigurationService { String deleteCredentialConfigurationById(String id); - CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version); + CredentialIssuerMetadataDTO fetchCredentialIssuerMetadata(String version); } diff --git a/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java index a7422d4cb..8ca4fdf83 100644 --- a/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java +++ b/certify-service/src/main/java/io/mosip/certify/controller/CredentialConfigController.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import io.mosip.certify.core.dto.CredentialConfigResponse; import io.mosip.certify.core.dto.CredentialConfigurationDTO; -import io.mosip.certify.core.dto.CredentialIssuerMetadata; +import io.mosip.certify.core.dto.CredentialIssuerMetadataDTO; import io.mosip.certify.core.spi.CredentialConfigurationService; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; @@ -12,8 +12,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.Map; - @Slf4j @RestController @RequestMapping("/credentials") @@ -52,7 +50,7 @@ public ResponseEntity deleteCredentialConfigurationById(@PathVariable St } @GetMapping(value = "/.well-known/openid-credential-issuer", produces = "application/json") - public CredentialIssuerMetadata getCredentialIssuerMetadata( + public CredentialIssuerMetadataDTO getCredentialIssuerMetadata( @RequestParam(name = "version", required = false, defaultValue = "latest") String version) { return credentialConfigurationService.fetchCredentialIssuerMetadata(version); } diff --git a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java index 82bafec20..e4c1eb141 100644 --- a/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java +++ b/certify-service/src/main/java/io/mosip/certify/services/CredentialConfigurationServiceImpl.java @@ -39,6 +39,9 @@ public class CredentialConfigurationServiceImpl implements CredentialConfigurati @Value("${mosip.certify.plugin-mode}") private String pluginMode; + @Value("#{${mosip.certify.credential-config.issuer.display}}") + private List> issuerDisplay; + @Override public CredentialConfigResponse addCredentialConfiguration(CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException { CredentialConfig credentialConfig = credentialConfigMapper.toEntity(credentialConfigurationDTO); @@ -114,17 +117,18 @@ public String deleteCredentialConfigurationById(String id) { } @Override - public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { - CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); + public CredentialIssuerMetadataDTO fetchCredentialIssuerMetadata(String version) { + CredentialIssuerMetadataDTO credentialIssuerMetadata = new CredentialIssuerMetadataDTO(); credentialIssuerMetadata.setCredentialIssuer(credentialIssuer); credentialIssuerMetadata.setAuthorizationServers(authServers); String credentialEndpoint = credentialIssuer + servletPath + "/issuance" + (!version.equals("latest") ? "/" +version : "") + "/credential" ; credentialIssuerMetadata.setCredentialEndpoint(credentialEndpoint); + credentialIssuerMetadata.setDisplay(issuerDisplay); List credentialConfigList = credentialConfigRepository.findAll(); - Map credentialConfigurationSupportedMap = new HashMap<>(); + Map credentialConfigurationSupportedMap = new HashMap<>(); credentialConfigList.stream() .forEach(credentialConfig -> { - CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); + CredentialConfigurationSupportedDTO credentialConfigurationSupported = new CredentialConfigurationSupportedDTO(); CredentialConfigurationDTO credentialConfigurationDTO = credentialConfigMapper.toDto(credentialConfig); credentialConfigurationSupported.setFormat(credentialConfigurationDTO.getCredentialFormat()); credentialConfigurationSupported.setScope(credentialConfigurationDTO.getScope()); @@ -153,7 +157,7 @@ public CredentialIssuerMetadata fetchCredentialIssuerMetadata(String version) { credentialConfigurationSupportedMap.put(credentialType, credentialConfigurationSupported); }); - credentialIssuerMetadata.setCredentialConfigurationSupported(credentialConfigurationSupportedMap); + credentialIssuerMetadata.setCredentialConfigurationSupportedDTO(credentialConfigurationSupportedMap); return credentialIssuerMetadata; } } diff --git a/certify-service/src/main/resources/application-local.properties b/certify-service/src/main/resources/application-local.properties index 9f5f6607f..9b852ec12 100644 --- a/certify-service/src/main/resources/application-local.properties +++ b/certify-service/src/main/resources/application-local.properties @@ -29,7 +29,12 @@ mosip.certify.supported.jwt-proof-alg={'RS256','PS256','ES256'} mosip.certify.identifier=http://localhost:8090 mosip.certify.authn.filter-urls={ '${server.servlet.path}/issuance/credential', '${server.servlet.path}/issuance/vd12/credential', '${server.servlet.path}/issuance/vd11/credential'} #mosip.certify.authn.filter-urls={} -m +mosip.certify.credential-config.issuer.display={\ + {\ + 'name': 'Farmer Issuer',\ + 'locale': 'en'\ + }\ +} mosip.certify.authn.issuer-uri=http://localhost:8088/v1/esignet mosip.certify.authn.jwk-set-uri=http://localhost:8088/v1/esignet/oauth/.well-known/jwks.json mosip.certify.authn.allowed-audiences={ '${mosip.certify.domain.url}${server.servlet.path}/issuance/credential', 'http://localhost:8088/v1/esignet/vci/credential' } diff --git a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java index e3eba8081..3ace3d24a 100644 --- a/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java +++ b/certify-service/src/test/java/io/mosip/certify/controller/CredentialConfigControllerTest.java @@ -123,7 +123,7 @@ public void deleteExistingCredentialConfiguration_Success() throws Exception { @Test public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { - CredentialIssuerMetadata credentialIssuerMetadata = new CredentialIssuerMetadata(); + CredentialIssuerMetadataDTO credentialIssuerMetadata = new CredentialIssuerMetadataDTO(); credentialIssuerMetadata.setCredentialIssuer("https://localhost:9090"); credentialIssuerMetadata.setAuthorizationServers(List.of("https://example.com/auth")); credentialIssuerMetadata.setCredentialEndpoint("https://localhost:9090/v1/certify/issuance/credential"); @@ -132,7 +132,7 @@ public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { display.put("locale", "en"); credentialIssuerMetadata.setDisplay(List.of(display)); - CredentialConfigurationSupported credentialConfigurationSupported = new CredentialConfigurationSupported(); + CredentialConfigurationSupportedDTO credentialConfigurationSupported = new CredentialConfigurationSupportedDTO(); credentialConfigurationSupported.setFormat("ldp_vc"); credentialConfigurationSupported.setScope("test_vc_ldp"); credentialConfigurationSupported.setCryptographicBindingMethodsSupported(List.of("did:jwk")); @@ -141,7 +141,7 @@ public void getIssuerMetadata_noQueryParams_thenPass() throws Exception { credentialConfigurationSupported.setProofTypesSupported(jwtValues); credentialConfigurationSupported.setDisplay(List.of()); credentialConfigurationSupported.setOrder(Arrays.asList("test1", "test2", "test3", "test4")); - credentialIssuerMetadata.setCredentialConfigurationSupported(Map.of("TestCredential_ldp", credentialConfigurationSupported)); + credentialIssuerMetadata.setCredentialConfigurationSupportedDTO(Map.of("TestCredential_ldp", credentialConfigurationSupported)); Mockito.when(credentialConfigurationService.fetchCredentialIssuerMetadata(Mockito.anyString())).thenReturn(credentialIssuerMetadata); diff --git a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java index 2d5281abd..544672c74 100644 --- a/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java +++ b/certify-service/src/test/java/io/mosip/certify/services/CredentialConfigurationServiceImplTest.java @@ -74,6 +74,7 @@ public void setup() { ReflectionTestUtils.setField(credentialConfigurationService, "authServers", List.of("http://auth.com")); ReflectionTestUtils.setField(credentialConfigurationService, "servletPath", "v1/test"); ReflectionTestUtils.setField(credentialConfigurationService, "pluginMode", "DataProvider"); + ReflectionTestUtils.setField(credentialConfigurationService, "issuerDisplay", List.of(Map.of())); } @Test diff --git a/certify-service/src/test/resources/application-test.properties b/certify-service/src/test/resources/application-test.properties index 66737c741..98cf0727a 100644 --- a/certify-service/src/test/resources/application-test.properties +++ b/certify-service/src/test/resources/application-test.properties @@ -31,6 +31,12 @@ mosip.certify.authn.issuer-uri=${mosipbox.public.url}${server.servlet.path} mosip.certify.authn.jwk-set-uri=${mosipbox.public.url}${server.servlet.path}/oauth/.well-known/jwks.json mosip.certify.authn.allowed-audiences={ '${mosipbox.public.url}${server.servlet.path}/issuance/credential' } mosip.certify.mock.authenticator.get-identity-url=http://localhost:8082/v1/mock-identity-system/identity +mosip.certify.credential-config.issuer.display={\ + {\ + 'name': 'Test Issuer',\ + 'locale': 'en'\ + }\ +} mosip.certify.supported.jwt-proof-alg={'RS256'} mosip.certify.key-values={\ diff --git a/db_scripts/mosip_certify/combined.sql b/db_scripts/mosip_certify/combined.sql index e51a0449f..b194dedf6 100644 --- a/db_scripts/mosip_certify/combined.sql +++ b/db_scripts/mosip_certify/combined.sql @@ -91,7 +91,7 @@ CREATE TABLE credential_config ( did_url VARCHAR NOT NULL, key_manager_app_id VARCHAR(36) NOT NULL, key_manager_ref_id VARCHAR(128), - signature_algo VARCHAR(2048), + signature_algo VARCHAR(36), sd_claim VARCHAR, display JSONB NOT NULL, display_order TEXT[] NOT NULL, diff --git a/db_scripts/mosip_certify/ddl/certify-credential_config.sql b/db_scripts/mosip_certify/ddl/certify-credential_config.sql index 114540956..6cbe200e2 100644 --- a/db_scripts/mosip_certify/ddl/certify-credential_config.sql +++ b/db_scripts/mosip_certify/ddl/certify-credential_config.sql @@ -22,7 +22,7 @@ CREATE TABLE credential_config ( did_url VARCHAR NOT NULL, key_manager_app_id VARCHAR(36) NOT NULL, key_manager_ref_id VARCHAR(128), - signature_algo VARCHAR(2048), + signature_algo VARCHAR(36), sd_claim VARCHAR, display JSONB NOT NULL, display_order TEXT[] NOT NULL, diff --git a/db_scripts/mosip_certify/ddl/combined.sql b/db_scripts/mosip_certify/ddl/combined.sql index b17c9095c..9bafa511a 100644 --- a/db_scripts/mosip_certify/ddl/combined.sql +++ b/db_scripts/mosip_certify/ddl/combined.sql @@ -67,7 +67,7 @@ CREATE TABLE credential_config ( did_url VARCHAR NOT NULL, key_manager_app_id VARCHAR(36) NOT NULL, key_manager_ref_id VARCHAR(128), - signature_algo VARCHAR(2048), + signature_algo VARCHAR(36), sd_claim VARCHAR, display JSONB NOT NULL, display_order TEXT[] NOT NULL, diff --git a/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_rollback.sql b/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_rollback.sql index b632a60a8..4f5d155bb 100644 --- a/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_rollback.sql +++ b/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_rollback.sql @@ -13,16 +13,44 @@ -- ------------------------------------------------------------------------------------------ -- ------------------------------------------------------------------------------------------ -drop table credential_config; - -CREATE TABLE credential_template( - context character varying(1024) NOT NULL, - credential_type character varying(512) NOT NULL, - template VARCHAR NOT NULL, - cr_dtimes timestamp NOT NULL default now(), - upd_dtimes timestamp, - CONSTRAINT pk_template PRIMARY KEY (context, credential_type) -); +-- Step 1: Drop the new primary key constraint +ALTER TABLE credential_config DROP CONSTRAINT pk_config_id; + +-- Step 2: Drop all the newly added columns +ALTER TABLE credential_config + DROP COLUMN config_id, + DROP COLUMN status, + DROP COLUMN doctype, + DROP COLUMN credential_format, + DROP COLUMN did_url, + DROP COLUMN key_manager_app_id, + DROP COLUMN key_manager_ref_id, + DROP COLUMN signature_algo, + DROP COLUMN sd_claim, + DROP COLUMN display, + DROP COLUMN display_order, + DROP COLUMN scope, + DROP COLUMN cryptographic_binding_methods_supported, + DROP COLUMN credential_signing_alg_values_supported, + DROP COLUMN proof_types_supported, + DROP COLUMN credential_subject, + DROP COLUMN claims, + DROP COLUMN plugin_configurations; + +-- Step 3: Rename vc_template back to template +ALTER TABLE credential_config RENAME COLUMN vc_template TO template; + +-- Step 4: Restore the column types to original specifications +ALTER TABLE credential_config + ALTER COLUMN context TYPE character varying(1024), + ALTER COLUMN credential_type TYPE character varying(512), + ALTER COLUMN template TYPE VARCHAR; + +-- Step 5: Add back the original primary key constraint +ALTER TABLE credential_config ADD CONSTRAINT pk_template PRIMARY KEY (context, credential_type); + +-- Step 6: Rename the table back to its original name +ALTER TABLE credential_config RENAME TO credential_template; COMMENT ON TABLE credential_template IS 'Template Data: Contains velocity template for VC'; diff --git a/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_upgrade.sql b/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_upgrade.sql index 2e7c7a1bf..3a92b109a 100644 --- a/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_upgrade.sql +++ b/db_upgrade_script/mosip_certify/sql/0.11.0_to_0.12.0_upgrade.sql @@ -13,34 +13,41 @@ -- ------------------------------------------------------------------------------------------ -- ------------------------------------------------------------------------------------------ -drop table credential_template; +-- Step 1: Rename the table +ALTER TABLE credential_template RENAME TO credential_config; -CREATE TABLE credential_config ( - config_id VARCHAR(255), - status VARCHAR(255), - vc_template VARCHAR, - doctype VARCHAR, - context VARCHAR NOT NULL, - credential_type VARCHAR NOT NULL, - credential_format VARCHAR(255) NOT NULL, - did_url VARCHAR NOT NULL, - key_manager_app_id VARCHAR(36) NOT NULL, - key_manager_ref_id VARCHAR(128), - signature_algo VARCHAR(2048), - sd_claim VARCHAR, - display JSONB NOT NULL, - display_order TEXT[] NOT NULL, - scope VARCHAR(255) NOT NULL, - cryptographic_binding_methods_supported TEXT[] NOT NULL, - credential_signing_alg_values_supported TEXT[] NOT NULL, - proof_types_supported JSONB NOT NULL, - credential_subject JSONB, - claims JSONB, - plugin_configurations JSONB, - cr_dtimes TIMESTAMP NOT NULL, - upd_dtimes TIMESTAMP, - CONSTRAINT pk_config_id PRIMARY KEY (context, credential_type, credential_format) -); +-- Step 2: Add new columns +ALTER TABLE credential_config + ADD COLUMN config_id VARCHAR(255), + ADD COLUMN status VARCHAR(255), + ADD COLUMN doctype VARCHAR, + ADD COLUMN credential_format VARCHAR(255) NOT NULL DEFAULT 'default_format', -- Adding a default value for NOT NULL constraint + ADD COLUMN did_url VARCHAR NOT NULL DEFAULT '', -- Adding a default value for NOT NULL constraint + ADD COLUMN key_manager_app_id VARCHAR(36) NOT NULL DEFAULT '', -- Adding a default value for NOT NULL constraint + ADD COLUMN key_manager_ref_id VARCHAR(128), + ADD COLUMN signature_algo VARCHAR(36), + ADD COLUMN sd_claim VARCHAR, + ADD COLUMN display JSONB NOT NULL DEFAULT '{}'::jsonb, -- Adding a default value for NOT NULL constraint + ADD COLUMN display_order TEXT[] NOT NULL DEFAULT '{}', -- Adding a default value for NOT NULL constraint + ADD COLUMN scope VARCHAR(255) NOT NULL DEFAULT '', -- Adding a default value for NOT NULL constraint + ADD COLUMN cryptographic_binding_methods_supported TEXT[] NOT NULL DEFAULT '{}', -- Adding a default value for NOT NULL constraint + ADD COLUMN credential_signing_alg_values_supported TEXT[] NOT NULL DEFAULT '{}', -- Adding a default value for NOT NULL constraint + ADD COLUMN proof_types_supported JSONB NOT NULL DEFAULT '{}'::jsonb, -- Adding a default value for NOT NULL constraint + ADD COLUMN credential_subject JSONB, + ADD COLUMN claims JSONB, + ADD COLUMN plugin_configurations JSONB; + +-- Step 3: Rename the template column to match the new schema +ALTER TABLE credential_config RENAME COLUMN template TO vc_template; + +-- Step 4: Alter column sizes to match the new schema +ALTER TABLE credential_config + ALTER COLUMN context TYPE VARCHAR, + ALTER COLUMN credential_type TYPE VARCHAR; + +-- Step 5: Update the primary key constraint +ALTER TABLE credential_config DROP CONSTRAINT pk_template; +ALTER TABLE credential_config ADD CONSTRAINT pk_config_id PRIMARY KEY (context, credential_type, credential_format); COMMENT ON TABLE credential_config IS 'Credential Config: Contains details of credential configuration.'; diff --git a/docker-compose/docker-compose-injistack/certify_init.sql b/docker-compose/docker-compose-injistack/certify_init.sql index 3fa96494c..c632adfce 100644 --- a/docker-compose/docker-compose-injistack/certify_init.sql +++ b/docker-compose/docker-compose-injistack/certify_init.sql @@ -108,7 +108,7 @@ CREATE TABLE IF NOT EXISTS credential_config ( did_url VARCHAR NOT NULL, key_manager_app_id VARCHAR(36) NOT NULL, key_manager_ref_id VARCHAR(128), - signature_algo VARCHAR(2048), + signature_algo VARCHAR(36), sd_claim VARCHAR, display JSONB NOT NULL, display_order TEXT[] NOT NULL,