diff options
| author | Paul-Christian Volkmer | 2026-11-06 12:11:56 +0100 |
|---|---|---|
| committer | GitHub | 2026-11-06 11:11:56 +0000 |
| commit | a29ed1021b5429cec31552defc54e190f406975b (patch) | |
| tree | 53c5677ae827f619c507775db21aab09a7a02f93 | |
| parent | 980e8996b98e0eae24f355f0e8ccfb4385fba2fc (diff) | |
10 files changed, 71 insertions, 53 deletions
diff --git a/build.gradle.kts b/build.gradle.kts index defc439..9a08216 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,11 +9,11 @@ plugins { java id("org.springframework.boot") version "4.1.2" id("io.spring.dependency-management") version "1.1.7" - id("com.diffplug.spotless") version "8.0.0" + id("com.diffplug.spotless") version "8.11.0" id("net.ltgt.errorprone") version "5.1.1" id("net.ltgt.nullaway") version "3.3.0" - kotlin("jvm") version "2.4.10" - kotlin("plugin.spring") version "2.4.10" + kotlin("jvm") version "2.4.20" + kotlin("plugin.spring") version "2.4.20" jacoco } @@ -21,15 +21,15 @@ group = "dev.dnpm" version = "0.18.1" // x-release-please-version // Additional versions -val mtbModelVersion by extra("0.6.0") -val hapiFhirVersion by extra("8.10.1") -val apacheCxfVersion by extra("4.2.3") -val springModulithVersion by extra("2.0.5") -val springRetryVersion by extra("2.0.12") +val mtbModelVersion = "0.6.0" +val hapiFhirVersion = "8.10.2" +val apacheCxfVersion = "4.2.4" +val springModulithVersion = "2.1.2" +val springRetryVersion = "2.0.13" // Additional test versions -val mockitoKotlinVersion by extra("6.2.3") -val testcontainersVersion by extra("1.21.4") +val mockitoKotlinVersion = "6.4.0" +val testcontainersVersion = "1.21.4" java { toolchain { @@ -75,20 +75,20 @@ dependencies { implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8") implementation("tools.jackson.module:jackson-module-kotlin") implementation("org.springframework.kafka:spring-kafka") - implementation("org.springframework.retry:spring-retry:${springRetryVersion}") + implementation("org.springframework.retry:spring-retry:$springRetryVersion") implementation("org.flywaydb:flyway-database-postgresql") implementation("org.flywaydb:flyway-mysql") implementation("commons-codec:commons-codec") implementation("io.projectreactor.kotlin:reactor-kotlin-extensions") - implementation("dev.pcvolkmer.mv64e:mtb-model:${mtbModelVersion}") - implementation("ca.uhn.hapi.fhir:hapi-fhir-base:${hapiFhirVersion}") - implementation("ca.uhn.hapi.fhir:hapi-fhir-structures-r4:${hapiFhirVersion}") + implementation("dev.pcvolkmer.mv64e:mtb-model:$mtbModelVersion") + implementation("ca.uhn.hapi.fhir:hapi-fhir-base:$hapiFhirVersion") + implementation("ca.uhn.hapi.fhir:hapi-fhir-structures-r4:$hapiFhirVersion") implementation("org.apache.httpcomponents.client5:httpclient5") implementation("com.jayway.jsonpath:json-path") implementation("org.jspecify:jspecify") // gPAS via Soap - implementation("org.apache.cxf:cxf-rt-frontend-jaxws:${apacheCxfVersion}") - implementation("org.apache.cxf:cxf-rt-transports-http:${apacheCxfVersion}") + implementation("org.apache.cxf:cxf-rt-frontend-jaxws:$apacheCxfVersion") + implementation("org.apache.cxf:cxf-rt-transports-http:$apacheCxfVersion") implementation("org.springframework.modulith:spring-modulith-starter-core") implementation("org.springframework.modulith:spring-modulith-starter-jdbc") @@ -109,10 +109,10 @@ dependencies { testImplementation("org.springframework.security:spring-security-test") testImplementation("org.springframework.modulith:spring-modulith-starter-test") testImplementation("io.projectreactor:reactor-test") - testImplementation("org.mockito.kotlin:mockito-kotlin:${mockitoKotlinVersion}") + testImplementation("org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion") - integrationTestImplementation("org.testcontainers:junit-jupiter:${testcontainersVersion}") - integrationTestImplementation("org.testcontainers:postgresql:${testcontainersVersion}") + integrationTestImplementation("org.testcontainers:junit-jupiter:$testcontainersVersion") + integrationTestImplementation("org.testcontainers:postgresql:$testcontainersVersion") integrationTestImplementation("org.htmlunit:htmlunit") integrationTestImplementation("org.springframework:spring-webflux") diff --git a/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java b/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java index 4c8e820..0a00d1f 100644 --- a/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java +++ b/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java @@ -169,10 +169,9 @@ public class GicsConsentService extends AbstractConsentService { new HttpEntity<>(parameterAsXml, this.headersWithHttpBasicAuth()); try { var responseEntity = - retryTemplate.execute( - ctx -> - restTemplate.exchange( - endpointUri(endpoint), HttpMethod.POST, requestEntity, String.class)); + retryTemplate.execute(ctx -> + restTemplate.exchange( + endpointUri(endpoint), HttpMethod.POST, requestEntity, String.class)); if (responseEntity.getStatusCode().is2xxSuccessful()) { return responseEntity.getBody(); @@ -332,10 +331,8 @@ public class GicsConsentService extends AbstractConsentService { consentAsOne .getCategory() - .removeIf( - category -> - category.hasCoding( - "http://fhir.de/ConsentManagement/CodeSystem/ResultType", "policy")); + .removeIf(category -> + category.hasCoding("http://fhir.de/ConsentManagement/CodeSystem/ResultType", "policy")); final var miiConsentCategory = new CodeableConcept(); miiConsentCategory.addCoding( @@ -347,12 +344,10 @@ public class GicsConsentService extends AbstractConsentService { gIcsResultBundle.getEntry().stream() .skip(1) - .forEach( - c -> - consentAsOne - .getProvision() - .addProvision( - ((Consent) c.getResource()).getProvision().getProvisionFirstRep())); + .forEach(c -> + consentAsOne + .getProvision() + .addProvision(((Consent) c.getResource()).getProvision().getProvisionFirstRep())); gIcsResultBundle.getEntry().clear(); gIcsResultBundle.addEntry(bundleEntryComponent); diff --git a/src/main/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentService.java b/src/main/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentService.java index fdf0a65..eb99ebf 100644 --- a/src/main/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentService.java +++ b/src/main/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentService.java @@ -129,10 +129,9 @@ public class GicsGetBroadConsentService extends AbstractConsentService { } final var response = - this.retryTemplate.execute( - retryContext -> - this.restTemplate.exchange( - uri, HttpMethod.GET, new HttpEntity<>(requestHeaders), String.class)); + this.retryTemplate.execute(retryContext -> + this.restTemplate.exchange( + uri, HttpMethod.GET, new HttpEntity<>(requestHeaders), String.class)); if (response.getStatusCode().is2xxSuccessful()) { return response.getBody(); } else { diff --git a/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java b/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java index b4641aa..2e8adf7 100644 --- a/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java +++ b/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java @@ -152,9 +152,8 @@ public class GpasPseudonymGenerator implements Generator { try { var targetUrl = buildRequestUrl(apiEndpoint); ResponseEntity<String> responseEntity = - retryTemplate.execute( - ctx -> - restTemplate.exchange(targetUrl, HttpMethod.POST, requestEntity, String.class)); + retryTemplate.execute(ctx -> + restTemplate.exchange(targetUrl, HttpMethod.POST, requestEntity, String.class)); if (responseEntity.getStatusCode().is2xxSuccessful()) { log.debug("API request succeeded. Response: {}", responseEntity.getStatusCode()); return responseEntity; diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt index 70cfca9..7965f96 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt @@ -57,6 +57,7 @@ class AppRestConfiguration { logger.info("Selected 'RestDipMtbFileSender'") RestDipMtbFileSender(restTemplate, restTargetProperties, retryTemplate, reportService) } + RestTargetType.NNGM -> { logger.info("Selected 'RestNngmMtbFileSender'") RestNngmMtbFileSender(restTemplate, restTargetProperties, retryTemplate, reportService) diff --git a/src/main/kotlin/dev/dnpm/etl/processor/consent/ConsentEvaluator.kt b/src/main/kotlin/dev/dnpm/etl/processor/consent/ConsentEvaluator.kt index 1f867e8..cc5e54e 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/consent/ConsentEvaluator.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/consent/ConsentEvaluator.kt @@ -36,11 +36,13 @@ class ConsentEvaluator( ttpConsentStatus == TtpConsentStatus.BROAD_CONSENT_GIVEN || ttpConsentStatus == TtpConsentStatus.GENOM_DE_CONSENT_SEQUENCING_PERMIT || // Aktuell nur Modellvorhaben Consent im File - ttpConsentStatus == TtpConsentStatus.UNKNOWN_CHECK_FILE && - mtbFile.metadata?.modelProjectConsent?.provisions?.any { - it.purpose == ModelProjectConsentPurpose.SEQUENCING && - it.type == ConsentProvisionType.PERMIT - } == true + ( + ttpConsentStatus == TtpConsentStatus.UNKNOWN_CHECK_FILE && + mtbFile.metadata?.modelProjectConsent?.provisions?.any { + it.purpose == ModelProjectConsentPurpose.SEQUENCING && + it.type == ConsentProvisionType.PERMIT + } == true + ) return ConsentEvaluation(ttpConsentStatus, consentGiven) } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/input/KafkaInputListener.kt b/src/main/kotlin/dev/dnpm/etl/processor/input/KafkaInputListener.kt index 51d093b..b752473 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/input/KafkaInputListener.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/input/KafkaInputListener.kt @@ -43,8 +43,14 @@ class KafkaInputListener( override fun onMessage(record: ConsumerRecord<String, String>) { when (guessMimeType(record)) { - MediaType.APPLICATION_JSON_VALUE -> handleDnpmV2Message(record) - CustomMediaType.APPLICATION_VND_DNPM_V2_MTB_JSON_VALUE -> handleDnpmV2Message(record) + MediaType.APPLICATION_JSON_VALUE -> { + handleDnpmV2Message(record) + } + + CustomMediaType.APPLICATION_VND_DNPM_V2_MTB_JSON_VALUE -> { + handleDnpmV2Message(record) + } + else -> { // ignore other messages } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt index e198952..dd988ed 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt @@ -51,13 +51,14 @@ class KafkaMtbFileSender( record.headers().add("requestId", request.requestId.value.toByteArray()) record.headers().add("requestMethod", "POST".toByteArray()) when (request) { - is DnpmV2MtbFileRequest -> + is DnpmV2MtbFileRequest -> { record .headers() .add( "contentType", CustomMediaType.APPLICATION_VND_DNPM_V2_MTB_JSON_VALUE.toByteArray(), ) + } } val result = kafkaTemplate.send(record) @@ -114,9 +115,16 @@ class KafkaMtbFileSender( private fun key(request: MtbRequest): String = when (request) { - is DnpmV2MtbFileRequest -> "{\"pid\": \"${request.content.patient?.id}\"}" - is DeleteRequest -> "{\"pid\": \"${request.patientId.value}\"}" - else -> + is DnpmV2MtbFileRequest -> { + "{\"pid\": \"${request.content.patient?.id}\"}" + } + + is DeleteRequest -> { + "{\"pid\": \"${request.patientId.value}\"}" + } + + else -> { throw IllegalArgumentException("Unsupported request type: ${request::class.simpleName}") + } } } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/PseudonymizeService.kt b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/PseudonymizeService.kt index c74345d..e8619bc 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/PseudonymizeService.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/PseudonymizeService.kt @@ -32,9 +32,13 @@ class PseudonymizeService( when (generator) { is GpasPseudonymGenerator, is VfpsPseudonymGenerator, - -> PatientPseudonym(generator.generate(patientId.value)) - else -> + -> { + PatientPseudonym(generator.generate(patientId.value)) + } + + else -> { PatientPseudonym("${configProperties.prefix}_${generator.generate(patientId.value)}") + } } fun genomDeTan(patientId: PatientId): String = generator.generateGenomDeTan(patientId.value) diff --git a/src/main/kotlin/dev/dnpm/etl/processor/web/StatisticsRestController.kt b/src/main/kotlin/dev/dnpm/etl/processor/web/StatisticsRestController.kt index 3ea9667..bba2b2a 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/web/StatisticsRestController.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/web/StatisticsRestController.kt @@ -49,11 +49,15 @@ class StatisticsRestController( private fun statusColor(status: RequestStatus) = when (status) { RequestStatus.ERROR -> "#FF0000" + RequestStatus.WARNING -> "#FF8C00" + RequestStatus.SUCCESS -> "#008000" + RequestStatus.NO_CONSENT, RequestStatus.BLOCKED_INITIAL, -> "#004A9D" + else -> "#708090" } |
