Skip to content
Snippets Groups Projects
Commit fb47e29e authored by Henry Borasch's avatar Henry Borasch
Browse files

Merge branch 'main' into feature/829-version_number_in_user_agent

# Conflicts:
#	core/src/main/java/dev/fitko/fitconnect/core/http/ProxyConfig.java
parents d7367ce1 042be3ed
No related branches found
No related tags found
1 merge request!98add information to user agent
Showing
with 147 additions and 135 deletions
......@@ -81,28 +81,37 @@ See the projects' module documentation for more specific information:
_The following steps show how to get the SDK running_
1. Create and [account](https://docs.fitko.de/fit-connect/docs/getting-started/account) on the self service portal
1. Create and [account](https://docs.fitko.de/fit-connect/docs/getting-started/account) on the self-service portal
2. Get your sender/subscriber API-key credentials
3. Clone the sdk repo
```sh
git clone https://git.fitko.de/fit-connect/sdk-java
```
4. Build the project
4. Build the project with the included maven wrapper (no separate maven installation needed)
```sh
./mvnw clean install -DskipTests
```
5. Enter your API keys and references to your private decryption key in `config.yml`
5. Configure your `config.yml`
- add Sender OAuth credentials from the self-service portal to *SENDER* section
- add Subscriber OAuth credentials from the self-service portal to *SUBSCRIBER* section
- add reference to private decryption key (JWK) to *SUBSCRIBER* section
- add reference to private signature key (JWK) to *SUBSCRIBER* section
6. Provide config via environment variable ``FIT_CONNECT_CONFIG`` or load the config with
````java
var config = ApplicationConfigLoader.loadConfig("absolute/path/to/config.yml");
var senderClient = ClientFactory.senderClient(config);
final var config = ApplicationConfigLoader.loadConfig("absolute/path/to/config.yml");
final var senderClient = ClientFactory.senderClient(config);
````
<p align="right">(<a href="#top">back to top</a>)</p>
## API Usage for Sender
The fluent API client for sender and subscriber allows method chaining to guide through all necessary steps and is called via `dev.fitko.fitconnect.client.factory.ClientFactory`.
For sending submission and already encrypted submissions builder are provided to construct the necessary payload to be sent.
Builders allow method chaining and guide through all necessary steps.
The examples below expect a loaded configuration via the ApplicationConfigLoader.
### Hand in already encrypted submission (e.g. from frontend)
If all data, metadata and attachments are encrypted outside the SDK the sender client allows to retrieve the public key for encryption as well as sending of already encrypted payloads.
......@@ -112,20 +121,32 @@ If all data, metadata and attachments are encrypted outside the SDK the sender c
#### 1. Retrieve public encryption key:
```java
Optional<String> publicJwk = ClientFactory.senderClient(config).getPublicKey(UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14"));
final var destinationId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
final Optional<String> publicJwk = ClientFactory.senderClient(config).getPublicKey(destinationId);
```
#### 2. Send encrypted data
To send an encrypted submission the builder `EncryptedSubmissionBuilder` is needed to construct an `EncryptedSubmissionPayload` object.
The payload can be submitted as shown below via the `ClientFactory`.
If optional attachments are added, the UUID needs to be provided for each attachment to be able to announce them before the submission is actually sent.
This is necessary because the SDK does not have access to the already encrypted metadata that, which contains that information.
```java
ClientFactory.senderClient(config)
.newSubmissionWithEncryptedData("$encrpyt€ed d@t@")
.withEncryptedAttachment(UUID.fromString("attachmentId"), "$encrpyt€ed @tt@chment")
.withEncryptedJsonData("{$encrpyt€ed json}")
// The constructed client can be reused to send multiple submissions
final SenderClient senderClient = ClientFactory.senderClient(config);
final EncryptedSubmissionPayload frontendEncryptedPayload = EncryptedSubmissionBuilder.Builder()
.withEncryptedAttachment(UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14"), "$encrpyt€ed @tt@chment") // optional
.withEncryptedData("{$encrpyt€ed json}")
.withEncryptedMetadata("$encrpyt€ed metadata")
.withDestination(UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14"))
.withServiceType("TestService", "Führerscheinbeantragung", "urn:de:fim:leika:leistung:99400048079000")
.submit();
.withServiceType("Führerscheinummeldung", "urn:de:fim:leika:leistung:99400048079000")
.build();
final SentSubmission sentSubmission = senderClient.submit(frontendEncryptedPayload);
```
### Hand in a new submission with unencrypted data
......@@ -134,22 +155,31 @@ If all data, metadata and attachments are encrypted in the sender using the SDK,
Be aware that this example is not end-2-end encrypted, see [FIT-Connect documentation](https://docs.fitko.de/fit-connect/docs/getting-started/encryption) for details.
To send a submission the builder `SubmissionBuilder` is needed to construct a `SubmissionPayload` object.
The payload can be submitted as shown below via the `ClientFactory`.
```java
ClientFactory.senderClient(config)
.newSubmission()
// The constructed client can be reused to send multiple submissions
final SenderClient senderClient = ClientFactory.senderClient(config);
final SubmissionPayload submissionPayload = SubmissionBuilder.Builder()
.withAttachment(Path.of("path/to/attachment.txt").toFile()) // optional
.withJsonData("{ \"foo\" : \"bar\"}")
.withDestination(UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14"))
.withServiceType("TestService", "Führerscheinbeantragung", "urn:de:fim:leika:leistung:99400048079000")
.submit();
.withServiceType("Führerscheinummeldung", "urn:de:fim:leika:leistung:99400048079000")
.build();
final SentSubmission sentSubmission = senderClient.submit(submissionPayload);
```
### Read the Event-Log
To read the event-log, destinationId and caseId are needed.
```java
var destinationId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
var caseId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
List<EventLogEntry> eventLog = ClientFactory.senderClient(config).getEventLog(caseId, destinationId);
final var caseId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
final var destinationId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
final List<EventLogEntry> eventLog = ClientFactory.senderClient(config).getEventLog(caseId, destinationId);
for(EventLogEntry logEntry: eventLog) {
LOGGER.info("Event: {}", logEntry.getEvent());
......@@ -178,8 +208,8 @@ The log contains the event, issuer and occurred problems like shown in the examp
Instead of the entire log, the latest status for a submission can be retrieved as well.
```java
SentSubmission sentSubmission = ... // sent submission by sender client
EventStatus eventStatus = ClientFactory.senderClient(config).getStatusForSubmission(sentSubmission);
final SentSubmission sentSubmission = ... // persisted sent submission by sender client
final EventStatus eventStatus = ClientFactory.senderClient(config).getStatusForSubmission(sentSubmission);
LOGGER.info("Current status for submission {} => {}", sentSubmission.getSubmissionId(), eventStatus.getStatus());
```
......@@ -198,20 +228,45 @@ Submissions can be fetched by id or as a list of submissions for a specific case
#### List with pagination
Limit and offset parameters allow to page through the result.
```java
int offset = 0;
int limit = 100;
Set<SubmissionForPickup> firstOneHundredSubmissions = ClientFactory.subscriberClient(config).getAvailableSubmissions(UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14"), limit, offset);
final int offset = 0;
final int limit = 100;
final var destinationId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
final Set<SubmissionForPickup> firstOneHundredSubmissions = ClientFactory.subscriberClient(config).getAvailableSubmissions(destinationId), limit, offset);
```
#### List without pagination
Listing available submissions without pagination pulls the first 500 entries.
```java
Set<SubmissionForPickup> submissions = ClientFactory.subscriberClient(config).getAvailableSubmissions(UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14"));
final var destinationId= UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
final Set<SubmissionForPickup> submissions = ClientFactory.subscriberClient(config).getAvailableSubmissions(destinationId);
```
#### Receive single submission
```java
Optional<ReceivedSubmission> submission = ClientFactory.subscriberClient(config).requestSubmission(UUID.fromString("submissionId"));
final submissionId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
final ReceivedSubmission receivedSubmission = ClientFactory.subscriberClient(config).requestSubmission(submissionId);
```
Now, the received submission allows access to the decrypted data, attachments, metadata and ids
```java
// access data
final String data = receivedData.getData();
final URI dataSchemaUri = receivedData.getDataSchemaUri();
final MimeType mimeType = receivedData.getDataMimeType();
// access metadata
final Metadata = receivedData.getSubmissionMetdata();
// access attachments
for(final ReceivedAttachment attachment : receivedSubmission.getAttachments()){
final byte[] attachmentRawData = attachment.getData();
final String originalFilename = attachment.getFilename();
final UUID attachmentId = attachment.getAttachmentId();
}
// access further ids of submission
final UUID caseId = receivedData.getCaseId();
final UUID submissionId = receivedData.getSubmissionId();
final UUID destinationId = receivedData.getDestinationId();
```
### Sending events to the event-log
......@@ -222,9 +277,11 @@ For more details please see the documentation on [events](https://docs.fitko.de/
#### Accepting a submission
If the functional review by the subscriber was positive, the submission can be accepted with an `accept-submission` event.
```java
ClientFactory.subscriberClient(config)
.requestSubmission(UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14"))
.acceptSubmission();
final var submissionId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
ClientFactory.subscriberClient(config)
.requestSubmission(submissionId)
.acceptSubmission();
```
After the accept event was sent the submission transitions into the state `deleted` and is removed.
#### Rejecting a submission
......@@ -232,18 +289,23 @@ If the functional or technical review by the subscriber was negative, e.g. there
The rejection takes a list of `dev.fitko.fitconnect.api.domain.model.event.problems.*` as parameter to specify the problem.
See the Fit-Connect documentation for more details on [available (technical) problems](https://docs.fitko.de/fit-connect/docs/receiving/verification).
```java
ClientFactory.subscriberClient(config)
.requestSubmission(UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14"))
.rejectSubmission(List.of(new DataSchemaViolation()));
final var submissionId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
final var rejectionProblems = List.of(new DataSchemaViolation());
ClientFactory.subscriberClient(config)
.requestSubmission(submissionId)
.rejectSubmission(rejectionProblems);
```
After the rejection event was sent the submission transitions into the state `deleted` and is removed.
### Read the Event-Log
To read the event-log, destinationId and caseId are needed.
```java
var destinationId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
var caseId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
List<EventLogEntry> eventLog = ClientFactory.subscriberClient(config).getEventLog(caseId, destinationId);
final var caseId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
final var destinationId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
final List<EventLogEntry> eventLog = ClientFactory.subscriberClient(config).getEventLog(caseId, destinationId);
for(EventLogEntry logEntry: eventLog) {
LOGGER.info("Event: {}", logEntry.getEvent());
......@@ -270,9 +332,10 @@ For more details please see the [event-log documentation](https://docs.fitko.de/
<p align="right">(<a href="#top">back to top</a>)</p>
## Roadmap
- [ ] Add SET-Event handling
- [ ] Add Routing features
- [ ] Add Callback handling
- [ ] Add Callback validation
- [ ] Add auto-reject on technical errors
- [ ] Maven central release of 1.0.0
See the [open issues](https://git.fitko.de/fit-connect/planning/-/boards/44?search=SDK) for a full list of proposed features (and known issues).
......
......@@ -50,14 +50,16 @@ public class ApplicationConfig {
}
public Environment getCurrentEnvironment() {
return getEnvironmentByName(this.activeEnvironment);
return getEnvironmentByName(activeEnvironment);
}
public String getOAuthTokenEndpoint() {
return getCurrentEnvironment().getAuthBaseUrl() + ResourcePaths.AUTH_TOKEN_PATH;
}
public String getSubmissionsEndpoint() { return getSubmissionBaseUrl() + ResourcePaths.SUBMISSIONS_PATH;}
public String getSubmissionsEndpoint() {
return getSubmissionBaseUrl() + ResourcePaths.SUBMISSIONS_PATH;
}
public String getSubmissionEndpoint() {
return getSubmissionBaseUrl() + ResourcePaths.SUBMISSION_PATH;
......@@ -78,6 +80,7 @@ public class ApplicationConfig {
public String getDestinationsKeyEndpoint() {
return getSubmissionBaseUrl() + ResourcePaths.DESTINATIONS_KEY_PATH;
}
public String getWellKnownKeysEndpoint() {
return getSubmissionBaseUrl() + ResourcePaths.WELL_KNOWN_KEYS_PATH;
}
......@@ -87,7 +90,7 @@ public class ApplicationConfig {
}
private String getAvailableEnvironmentNames() {
return this.environments.keySet()
return environments.keySet()
.stream()
.map(EnvironmentName::getName)
.collect(Collectors.joining(" | "));
......
......@@ -2,10 +2,11 @@ package dev.fitko.fitconnect.api.config;
final class ResourcePaths {
private ResourcePaths() {}
private ResourcePaths() {
}
static final String AUTH_TOKEN_PATH = "/token";
static final String DESTINATIONS_PATH = "/v1/destinations/{destinationId}";
static final String DESTINATIONS_PATH = "/v1/destinations/{destinationId}";
static final String DESTINATIONS_KEY_PATH = "/v1/destinations/{destinationId}/keys/{kid}";
static final String EVENTS_PATH = "/v1/cases/{caseId}/events";
static final String SUBMISSION_PATH = "/v1/submissions/{submissionId}";
......
......@@ -37,11 +37,11 @@ public enum Event {
@Override
public Set<Event> allowedNextEvents() {
return Set.of(ACCEPT, REJECT, FORWARD, NOTIFY) ;
return Set.of(ACCEPT, REJECT, FORWARD, NOTIFY);
}
},
FORWARD("forward-submission"){
FORWARD("forward-submission") {
@Override
public boolean hasAuthTags() {
return false;
......@@ -58,7 +58,7 @@ public enum Event {
}
},
ACCEPT("accept-submission"){
ACCEPT("accept-submission") {
@Override
public boolean hasAuthTags() {
return true;
......@@ -75,7 +75,7 @@ public enum Event {
}
},
REJECT("reject-submission"){
REJECT("reject-submission") {
@Override
public boolean hasAuthTags() {
return false;
......@@ -92,7 +92,7 @@ public enum Event {
}
},
NOTIFY("notify-submission"){
NOTIFY("notify-submission") {
@Override
public boolean hasAuthTags() {
return false;
......@@ -109,7 +109,7 @@ public enum Event {
}
},
DELETE("delete-submission"){
DELETE("delete-submission") {
@Override
public boolean hasAuthTags() {
return false;
......@@ -145,7 +145,7 @@ public enum Event {
}
public String getSchemaUri() {
return EVENTS_SCHEMA_PATH.getSchemaUri() + this.name;
return EVENTS_SCHEMA_PATH.getSchemaUri() + name;
}
public abstract boolean hasAuthTags();
......
package dev.fitko.fitconnect.api.domain.model.event;
public class EventClaimFields {
public final class EventClaimFields {
private EventClaimFields() {
}
public static final String CLAIM_EVENTS = "events";
public static final String CLAIM_SCHEMA = "$schema";
public static final String CLAIM_TXN = "txn";
......
package dev.fitko.fitconnect.api.domain.model.event;
public class EventHeaderFields {
public final class EventHeaderFields {
private EventHeaderFields() {
}
public static final String TYPE = "typ";
public static final String KEY_ID = "kid";
......
......@@ -14,7 +14,7 @@ public enum EventName {
private final String name;
EventName(final String name){
EventName(final String name) {
this.name = name;
}
}
......@@ -19,24 +19,26 @@ public class EventPayload {
private String encryptedData;
private Map<UUID, String> encryptedAttachments;
private List<Problem> problems;
public EventPayload(final Submission submission, final Map<UUID, String> encryptedAttachments, final List<Problem> problems){
this.submissionId = submission.getSubmissionId();
this.destinationId = submission.getDestinationId();
this.caseId = submission.getCaseId();
this.encryptedData = submission.getEncryptedData();
this.encryptedMetadata = submission.getEncryptedMetadata();
public EventPayload(final Submission submission, final Map<UUID, String> encryptedAttachments, final List<Problem> problems) {
submissionId = submission.getSubmissionId();
destinationId = submission.getDestinationId();
caseId = submission.getCaseId();
encryptedData = submission.getEncryptedData();
encryptedMetadata = submission.getEncryptedMetadata();
this.encryptedAttachments = encryptedAttachments;
this.problems = problems;
}
public EventPayload(final Submission submission, final Map<UUID, String> encryptedAttachments){
this(submission, encryptedAttachments, Collections.emptyList());
public EventPayload(final Submission submission, final Map<UUID, String> encryptedAttachments) {
this(submission, encryptedAttachments, Collections.emptyList());
}
public EventPayload(final Submission submission, final List<Problem> problems){
public EventPayload(final Submission submission, final List<Problem> problems) {
this(submission, Collections.emptyMap(), problems);
}
public EventPayload(final Submission submission){
this(submission, Collections.emptyMap(), Collections.emptyList());
public EventPayload(final Submission submission) {
this(submission, Collections.emptyMap(), Collections.emptyList());
}
}
......@@ -15,7 +15,7 @@ public enum SubmissionState {
this.name = name;
}
public String getName(){
return this.name;
public String getName() {
return name;
}
}
......@@ -28,4 +28,4 @@ public class TypeAndUUID {
final var uuid = UUID.fromString(s.substring(index + 1));
return new TypeAndUUID(type, uuid);
}
}
\ No newline at end of file
}
package dev.fitko.fitconnect.api.domain.model.metadata;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Map;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class AdditionalReferenceInfo {
......@@ -16,8 +13,6 @@ public class AdditionalReferenceInfo {
@JsonProperty("applicationDate")
private String applicationDate;
@JsonIgnore
private Map<String, Object> additionalProperties;
}
package dev.fitko.fitconnect.api.domain.model.metadata;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.fitko.fitconnect.api.domain.model.metadata.attachment.Attachment;
......@@ -8,7 +7,6 @@ import dev.fitko.fitconnect.api.domain.model.metadata.data.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
@lombok.Data
@NoArgsConstructor
......@@ -20,7 +18,4 @@ public class ContentStructure {
@JsonProperty("attachments")
private List<Attachment> attachments;
@JsonIgnore
private Map<String, Object> additionalProperties;
}
......@@ -6,11 +6,6 @@ import com.fasterxml.jackson.annotation.JsonValue;
import java.util.HashMap;
import java.util.Map;
/**
* Referenziert ein eindeutiges Profil einer AdES (advanced electronic signature/seal) gemäß eIDAS-Verordnung über eine URI gemäß [ETSI TS 119 192](https://www.etsi.org/deliver/etsi_ts/119100_119199/119192/01.01.01_60/ts_119192v010101p.pdf).
* <p>
* Für die Details zur Verwendung und Validierung von Profilen siehe auch https://ec.europa.eu/cefdigital/DSS/webapp-demo/doc/dss-documentation.html#_signatures_profile_simplification
*/
public enum EidasAdesProfile {
HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_B("http://uri.etsi.org/ades/191x2/level/baseline/B-B#"),
......@@ -34,12 +29,12 @@ public enum EidasAdesProfile {
@Override
public String toString() {
return this.value;
return value;
}
@JsonValue
public String value() {
return this.value;
return value;
}
@JsonCreator
......
package dev.fitko.fitconnect.api.domain.model.metadata;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
@Data
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
......@@ -18,7 +15,4 @@ public class Hash {
@JsonProperty("content")
private String content;
@JsonIgnore
private Map<String, Object> additionalProperties;
}
package dev.fitko.fitconnect.api.domain.model.metadata;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
@Data
@NoArgsConstructor
......@@ -25,7 +23,4 @@ public class Metadata {
@JsonProperty("additionalReferenceInfo")
private AdditionalReferenceInfo additionalReferenceInfo;
@JsonIgnore
private Map<String, Object> additionalProperties;
}
package dev.fitko.fitconnect.api.domain.model.metadata;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Map;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PublicServiceType {
......@@ -19,8 +16,5 @@ public class PublicServiceType {
@JsonProperty("identifier")
private String identifier;
@JsonIgnore
private Map<String, Object> additionalProperties;
}
package dev.fitko.fitconnect.api.domain.model.metadata;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
@Data
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
......@@ -24,8 +21,5 @@ public class Signature {
@JsonProperty("content")
private String content;
@JsonIgnore
private Map<String, Object> additionalProperties;
}
package dev.fitko.fitconnect.api.domain.model.metadata.attachment;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.fitko.fitconnect.api.domain.model.metadata.Hash;
......@@ -8,7 +7,6 @@ import dev.fitko.fitconnect.api.domain.model.metadata.Signature;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
import java.util.UUID;
@Data
......@@ -36,9 +34,6 @@ public class Attachment {
@JsonProperty("attachmentId")
private UUID attachmentId;
@JsonIgnore
private Map<String, Object> additionalProperties;
}
package dev.fitko.fitconnect.api.domain.model.metadata.attachment;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.With;
@With
@Getter
@Builder
@AllArgsConstructor
public class AttachmentWithData {
private byte[] decryptedData;
private String encryptedData;
private Attachment attachmentMetadata;
}
package dev.fitko.fitconnect.api.domain.model.metadata.data;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.fitko.fitconnect.api.domain.model.metadata.Hash;
import dev.fitko.fitconnect.api.domain.model.metadata.Signature;
import lombok.NoArgsConstructor;
import java.util.Map;
@lombok.Data
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
......@@ -22,8 +19,6 @@ public class Data {
@JsonProperty("submissionSchema")
private SubmissionSchema submissionSchema;
@JsonIgnore
private Map<String, Object> additionalProperties;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment