Skip to content

Injicert 769 rebase #4

New issue

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

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

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: INJICERT-768-mosip
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
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 org.hibernate.annotations.Comment;

import java.util.List;
import java.util.Map;

@Data
public class CredentialConfigurationDTO {

private String vcTemplate;

@NotNull(message = ErrorConstants.INVALID_REQUEST)
private List<String> context;

@NotNull(message = ErrorConstants.INVALID_REQUEST)
private List<String> credentialType;

@NotNull(message = ErrorConstants.INVALID_REQUEST)
private String credentialFormat;

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<Map<String, Object>> display;

private List<String> order;

@NotNull(message = ErrorConstants.INVALID_REQUEST)
private String scope;

@NotNull(message = ErrorConstants.INVALID_REQUEST)
@JsonProperty("cryptographic_binding_methods_supported")
private List<String> cryptographicBindingMethodsSupported;

@NotNull
@JsonProperty("credential_signing_alg_values_supported")
private List<String> credentialSigningAlgValuesSupported;

@NotNull(message = ErrorConstants.INVALID_REQUEST)
@JsonProperty("proof_types_supported")
private Map<String, Object> proofTypesSupported;

@JsonProperty("credentialSubject")
private Map<String, Object> credentialSubject;

@JsonProperty("claims")
private Map<String, Object> claims;

@JsonProperty("doctype")
private String docType;

private List<Map<String, String>> pluginConfigurations;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
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 CredentialConfigurationSupportedDTO {

private String format;

@JsonProperty("doctype")
private String docType;

private String scope;

@JsonProperty("cryptographic_binding_methods_supported")
private List<String> cryptographicBindingMethodsSupported;

@JsonProperty("credential_signing_alg_values_supported")
private List<String> credentialSigningAlgValuesSupported;

@JsonProperty("proof_types_supported")
private Map<String, Object> proofTypesSupported;

@JsonProperty("credential_definition")
private CredentialDefinition credentialDefinition;

private Map<String, Object> claims;

private List<Map<String, Object>> display;

private List<String> order;
}
Original file line number Diff line number Diff line change
@@ -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 CredentialIssuerMetadataDTO {

@JsonProperty("credential_issuer")
private String credentialIssuer;

@JsonProperty("authorization_servers")
private List<String> authorizationServers;

@JsonProperty("credential_endpoint")
private String credentialEndpoint;

private List<Map<String, String>> display;

@JsonProperty("credential_configurations_supported")
private Map<String, CredentialConfigurationSupportedDTO> credentialConfigurationSupportedDTO;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.mosip.certify.core.spi;

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.CredentialIssuerMetadataDTO;

public interface CredentialConfigurationService {

CredentialConfigResponse addCredentialConfiguration(CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException;

CredentialConfigurationDTO getCredentialConfigurationById(String id) throws JsonProcessingException;

CredentialConfigResponse updateCredentialConfiguration(String id, CredentialConfigurationDTO credentialConfigurationDTO) throws JsonProcessingException;

String deleteCredentialConfigurationById(String id);

CredentialIssuerMetadataDTO fetchCredentialIssuerMetadata(String version);
}
34 changes: 34 additions & 0 deletions certify-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,16 @@
<artifactId>sd-jwt</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-60</artifactId>
<version>3.9.0</version>
</dependency>
</dependencies>

<build>
Expand All @@ -145,6 +155,30 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package io.mosip.certify.controller;

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.CredentialIssuerMetadataDTO;
import io.mosip.certify.core.spi.CredentialConfigurationService;
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.*;

@Slf4j
@RestController
@RequestMapping("/credentials")
public class CredentialConfigController {

@Autowired
private CredentialConfigurationService credentialConfigurationService;

@PostMapping(value = "/configurations", produces = "application/json")
public ResponseEntity<CredentialConfigResponse> addCredentialConfiguration(@Valid @RequestBody CredentialConfigurationDTO credentialConfigurationRequest) throws JsonProcessingException {

CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.addCredentialConfiguration(credentialConfigurationRequest);
return new ResponseEntity<>(credentialConfigResponse, HttpStatus.CREATED);
}

@GetMapping(value = "/configurations/{configurationId}", produces = "application/json")
public ResponseEntity<CredentialConfigurationDTO> getCredentialConfigurationById(@PathVariable String configurationId) throws JsonProcessingException {

CredentialConfigurationDTO credentialConfigurationDTO = credentialConfigurationService.getCredentialConfigurationById(configurationId);
return new ResponseEntity<>(credentialConfigurationDTO, HttpStatus.OK);
}

@PutMapping(value = "/configurations/{configurationId}", produces = "application/json")
public ResponseEntity<CredentialConfigResponse> updateCredentialConfiguration(@PathVariable String configurationId,
@Valid @RequestBody CredentialConfigurationDTO credentialConfigurationRequest) throws JsonProcessingException {

CredentialConfigResponse credentialConfigResponse = credentialConfigurationService.updateCredentialConfiguration(configurationId, credentialConfigurationRequest);
return new ResponseEntity<>(credentialConfigResponse, HttpStatus.OK);
}

@DeleteMapping(value = "/configurations/{configurationId}", produces = "application/json")
public ResponseEntity<String> 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 CredentialIssuerMetadataDTO getCredentialIssuerMetadata(
@RequestParam(name = "version", required = false, defaultValue = "latest") String version) {
return credentialConfigurationService.fetchCredentialIssuerMetadata(version);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
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.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;

@Data
@Entity
@NoArgsConstructor
@Table(name = "credential_config")
@IdClass(TemplateId.class)
public class CredentialConfig {

private String configId;

private String status;

private String vcTemplate;

@Id
private String context;

@Id
private String credentialType;

@Id
private String credentialFormat;

@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)
@Column(name = "display", columnDefinition = "jsonb")
private List<Map<String, Object>> display;

@Column(name = "display_order", columnDefinition = "TEXT[]")
private List<String> order;

@NotNull(message = "Invalid request")
private String scope;

@NotNull(message = "Invalid request")
@Column(name = "cryptographic_binding_methods_supported", columnDefinition = "TEXT[]")
private List<String> cryptographicBindingMethodsSupported;

@NotNull(message = "Invalid request")
@Column(name = "credential_signing_alg_values_supported", columnDefinition = "TEXT[]")
private List<String> credentialSigningAlgValuesSupported;

@NotNull(message = "Invalid request")
@Type(JsonBinaryType.class)
@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "proof_types_supported", columnDefinition = "jsonb")
private Map<String, Object> proofTypesSupported;

@Column(name = "doctype")
private String docType;

@Type(JsonBinaryType.class)
@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "credential_subject", columnDefinition = "jsonb")
private Map<String, Object> credentialSubject;

@Type(JsonBinaryType.class)
@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "claims", columnDefinition = "jsonb")
private Map<String, Object> claims;

@Type(JsonBinaryType.class)
@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "plugin_configurations", columnDefinition = "jsonb")
private List<Map<String, String>> pluginConfigurations;

@NotNull
@Column(name = "cr_dtimes")
private LocalDateTime createdTimes;

@Column(name = "upd_dtimes")
private LocalDateTime updatedTimes;

}
Loading
Loading