summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul-Christian Volkmer2025-11-04 11:39:05 +0100
committerPaul-Christian Volkmer2025-11-04 14:46:16 +0100
commit160222b488580f19a68600ad09ef73984b8eead1 (patch)
tree7b98d292908b3f353a33392500420b186c6ce9af
parentc88788997d2d7487eb4460d7e5cd49d087454f2f (diff)
fix: errors in response parsing (#181)v0.11.4
(cherry picked from commit 24d9116e31a7d0afdfbf47aa96a0c8bd54c9508b)
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/config/JacksonConfig.kt7
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/monitoring/ReportService.kt14
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/monitoring/ReportServiceTest.kt36
-rw-r--r--src/test/resources/dip-response.json36
4 files changed, 89 insertions, 4 deletions
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/JacksonConfig.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/JacksonConfig.kt
index 2ba81b5..282f69e 100644
--- a/src/main/kotlin/dev/dnpm/etl/processor/config/JacksonConfig.kt
+++ b/src/main/kotlin/dev/dnpm/etl/processor/config/JacksonConfig.kt
@@ -6,6 +6,7 @@ import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
@Configuration
@@ -22,8 +23,12 @@ class JacksonConfig {
@Bean
fun objectMapper(): ObjectMapper = ObjectMapper().registerModule(FhirResourceModule())
- .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).registerModule(
+ .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
+ .registerModule(
JavaTimeModule()
)
+ .registerModule(
+ Jdk8Module()
+ )
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
}
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ReportService.kt b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ReportService.kt
index e9ea489..dd5c44a 100644
--- a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ReportService.kt
+++ b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ReportService.kt
@@ -21,13 +21,14 @@ package dev.dnpm.etl.processor.monitoring
import com.fasterxml.jackson.annotation.JsonAlias
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
+import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.annotation.JsonValue
import com.fasterxml.jackson.core.JsonParseException
import com.fasterxml.jackson.databind.JsonMappingException
import com.fasterxml.jackson.databind.ObjectMapper
import dev.dnpm.etl.processor.monitoring.ReportService.Issue
import dev.dnpm.etl.processor.monitoring.ReportService.Severity
-import java.util.Optional
+import java.util.*
class ReportService(
private val objectMapper: ObjectMapper
@@ -55,12 +56,19 @@ class ReportService(
@JsonIgnoreProperties(ignoreUnknown = true)
- private data class DataQualityReport(val issues: List<Issue>)
+ private data class DataQualityReport(
+ @param:JsonProperty(value = "issues")
+ val issues: List<Issue>
+ )
@JsonIgnoreProperties(ignoreUnknown = true)
data class Issue(
+ @param:JsonProperty(value = "severity")
val severity: Severity,
- @JsonAlias("details") val message: String,
+ @param:JsonProperty(value = "message")
+ @param:JsonAlias("details")
+ val message: String,
+ @param:JsonProperty(value = "path")
val path: Optional<String> = Optional.empty()
)
diff --git a/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ReportServiceTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ReportServiceTest.kt
new file mode 100644
index 0000000..4bf1321
--- /dev/null
+++ b/src/test/kotlin/dev/dnpm/etl/processor/monitoring/ReportServiceTest.kt
@@ -0,0 +1,36 @@
+package dev.dnpm.etl.processor.monitoring
+
+import dev.dnpm.etl.processor.config.JacksonConfig
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import java.util.*
+
+class ReportServiceTest {
+
+ lateinit var service: ReportService
+
+ @BeforeEach
+ fun setUp() {
+ val jacksonConfig = JacksonConfig()
+ service = ReportService(jacksonConfig.objectMapper())
+ }
+
+ @Test
+ fun shouldParseDataQualityReport() {
+ val dataQualityReport = Objects.requireNonNull(this.javaClass.classLoader.getResource("dip-response.json"))
+ .readText()
+
+ val actual = service.deserialize(dataQualityReport)
+
+ assertThat(actual).isNotNull
+ assertThat(actual).hasSize(6)
+ assertThat(actual[0].severity).isEqualTo(ReportService.Severity.FATAL)
+ assertThat(actual[1].severity).isEqualTo(ReportService.Severity.ERROR)
+ assertThat(actual[2].severity).isEqualTo(ReportService.Severity.WARNING)
+ assertThat(actual[3].severity).isEqualTo(ReportService.Severity.WARNING)
+ assertThat(actual[4].severity).isEqualTo(ReportService.Severity.WARNING)
+ assertThat(actual[5].severity).isEqualTo(ReportService.Severity.INFO)
+ }
+
+} \ No newline at end of file
diff --git a/src/test/resources/dip-response.json b/src/test/resources/dip-response.json
new file mode 100644
index 0000000..d1dacb6
--- /dev/null
+++ b/src/test/resources/dip-response.json
@@ -0,0 +1,36 @@
+{
+ "patient": "TEST-PATIENT0123456789abcdef",
+ "issues": [
+ {
+ "severity": "error",
+ "message": "MVH-Einschluss-Fallkonferenz darf nicht vor oder ohne Einwilligung zur Teilnahme stattgefunden haben",
+ "path": "/Datum der MVH-Einwilligung"
+ },
+ {
+ "severity": "warning",
+ "message": "Fehlende Angabe 'Tumor-Grading'",
+ "path": "/Diagnose[0123456789abcdef]/Tumor-Grading"
+ },
+ {
+ "severity": "fatal",
+ "message": "Nicht auflösbare Referenz-ID '0123456789abcdef' auf Objekt 'Diagnose'",
+ "path": "/Systemische-Therapie[0123456789abcdef]/Therapie-Grund (Diagnose)"
+ },
+ {
+ "severity": "warning",
+ "message": "Fehlende Angabe",
+ "path": "/Kostenübernahme-Anträge"
+ },
+ {
+ "severity": "info",
+ "message": "Sonstige Info",
+ "path": "/Kostenübernahme-Antworten"
+ },
+ {
+ "severity": "warning",
+ "message": "Fehlende Angabe",
+ "path": "/MTB-Therapien"
+ }
+ ],
+ "createdAt": "2025-11-04T10:00:00.000000000Z"
+}