diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/monitoring/RequestRepositoryTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/monitoring/RequestRepositoryTest.kt index d2890ac..a9ec3a1 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/monitoring/RequestRepositoryTest.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/monitoring/RequestRepositoryTest.kt @@ -20,6 +20,7 @@ package dev.dnpm.etl.processor.monitoring import dev.dnpm.etl.processor.AbstractTestcontainerTest +import dev.dnpm.etl.processor.Fingerprint import dev.dnpm.etl.processor.output.MtbFileSender import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -63,7 +64,7 @@ class RequestRepositoryTest : AbstractTestcontainerTest() { RequestId.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdef1", + Fingerprint("0123456789abcdef1"), RequestType.MTB_FILE, RequestStatus.WARNING, Instant.parse("2023-07-07T00:00:00Z") diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/services/RequestServiceIntegrationTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/services/RequestServiceIntegrationTest.kt index 3b8c0a7..9314846 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/services/RequestServiceIntegrationTest.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/services/RequestServiceIntegrationTest.kt @@ -20,6 +20,7 @@ package dev.dnpm.etl.processor.services import dev.dnpm.etl.processor.AbstractTestcontainerTest +import dev.dnpm.etl.processor.Fingerprint import dev.dnpm.etl.processor.monitoring.Request import dev.dnpm.etl.processor.monitoring.RequestRepository import dev.dnpm.etl.processor.monitoring.RequestStatus @@ -79,7 +80,7 @@ class RequestServiceIntegrationTest : AbstractTestcontainerTest() { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdef1", + Fingerprint("0123456789abcdef1"), RequestType.MTB_FILE, RequestStatus.SUCCESS, Instant.parse("2023-07-07T02:00:00Z") @@ -89,7 +90,7 @@ class RequestServiceIntegrationTest : AbstractTestcontainerTest() { UUID.randomUUID().toString(), "TEST_12345678902", "P2", - "0123456789abcdef2", + Fingerprint("0123456789abcdef2"), RequestType.MTB_FILE, RequestStatus.WARNING, Instant.parse("2023-08-08T00:00:00Z") @@ -99,7 +100,7 @@ class RequestServiceIntegrationTest : AbstractTestcontainerTest() { UUID.randomUUID().toString(), "TEST_12345678901", "P2", - "0123456789abcdee1", + Fingerprint("0123456789abcdee1"), RequestType.DELETE, RequestStatus.SUCCESS, Instant.parse("2023-08-08T02:00:00Z") @@ -115,8 +116,8 @@ class RequestServiceIntegrationTest : AbstractTestcontainerTest() { val actual = requestService.allRequestsByPatientPseudonym("TEST_12345678901") assertThat(actual).hasSize(2) - assertThat(actual[0].fingerprint).isEqualTo("0123456789abcdee1") - assertThat(actual[1].fingerprint).isEqualTo("0123456789abcdef1") + assertThat(actual[0].fingerprint).isEqualTo(Fingerprint("0123456789abcdee1")) + assertThat(actual[1].fingerprint).isEqualTo(Fingerprint("0123456789abcdef1")) } @Test @@ -135,7 +136,7 @@ class RequestServiceIntegrationTest : AbstractTestcontainerTest() { val actual = requestService.lastMtbFileRequestForPatientPseudonym("TEST_12345678901") assertThat(actual).isNotNull - assertThat(actual?.fingerprint).isEqualTo("0123456789abcdef1") + assertThat(actual?.fingerprint).isEqualTo(Fingerprint("0123456789abcdef1")) } } \ No newline at end of file diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt index 09839a9..6ebcadd 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt @@ -44,6 +44,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration import org.springframework.http.client.HttpComponentsClientHttpRequestFactory import org.springframework.retry.RetryCallback import org.springframework.retry.RetryContext @@ -274,5 +275,9 @@ class AppConfiguration { return GPasConnectionCheckService(restTemplate, gPasConfigProperties, connectionCheckUpdateProducer) } + @Bean + fun jdbcConfiguration(): AbstractJdbcConfiguration { + return AppJdbcConfiguration() + } } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppJdbcConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppJdbcConfiguration.kt new file mode 100644 index 0000000..898982c --- /dev/null +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppJdbcConfiguration.kt @@ -0,0 +1,25 @@ +package dev.dnpm.etl.processor.config + +import dev.dnpm.etl.processor.Fingerprint +import org.springframework.context.annotation.Configuration +import org.springframework.core.convert.converter.Converter +import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration + +@Configuration +class AppJdbcConfiguration : AbstractJdbcConfiguration() { + override fun userConverters(): MutableList<*> { + return mutableListOf(StringToFingerprintConverter(), FingerprintToStringConverter()) + } +} + +class StringToFingerprintConverter : Converter { + override fun convert(source: String): Fingerprint { + return Fingerprint(source) + } +} + +class FingerprintToStringConverter : Converter { + override fun convert(source: Fingerprint): String { + return source.value + } +} \ No newline at end of file diff --git a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/Request.kt b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/Request.kt index 79a3a5b..0ee07d6 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/Request.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/Request.kt @@ -19,10 +19,12 @@ package dev.dnpm.etl.processor.monitoring +import dev.dnpm.etl.processor.Fingerprint import org.springframework.data.annotation.Id import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable import org.springframework.data.jdbc.repository.query.Query +import org.springframework.data.relational.core.mapping.Column import org.springframework.data.relational.core.mapping.Embedded import org.springframework.data.relational.core.mapping.Table import org.springframework.data.repository.CrudRepository @@ -38,7 +40,8 @@ data class Request( val uuid: String = RequestId.randomUUID().toString(), val patientId: String, val pid: String, - val fingerprint: String, + @Column("fingerprint") + val fingerprint: Fingerprint, val type: RequestType, var status: RequestStatus, var processedAt: Instant = Instant.now(), @@ -48,7 +51,7 @@ data class Request( uuid: String, patientId: String, pid: String, - fingerprint: String, + fingerprint: Fingerprint, type: RequestType, status: RequestStatus ) : @@ -58,7 +61,7 @@ data class Request( uuid: String, patientId: String, pid: String, - fingerprint: String, + fingerprint: Fingerprint, type: RequestType, status: RequestStatus, processedAt: Instant diff --git a/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt b/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt index 939af16..c36ddef 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt @@ -21,6 +21,7 @@ package dev.dnpm.etl.processor.services import com.fasterxml.jackson.databind.ObjectMapper import de.ukw.ccc.bwhc.dto.MtbFile +import dev.dnpm.etl.processor.Fingerprint import dev.dnpm.etl.processor.config.AppConfigProperties import dev.dnpm.etl.processor.monitoring.Report import dev.dnpm.etl.processor.monitoring.Request @@ -146,7 +147,7 @@ class RequestProcessor( uuid = requestId, patientId = "???", pid = patientId, - fingerprint = "", + fingerprint = Fingerprint.empty(), status = RequestStatus.ERROR, type = RequestType.DELETE, report = Report("Fehler bei der Pseudonymisierung") @@ -155,14 +156,16 @@ class RequestProcessor( } } - private fun fingerprint(mtbFile: MtbFile): String { + private fun fingerprint(mtbFile: MtbFile): Fingerprint { return fingerprint(objectMapper.writeValueAsString(mtbFile)) } - private fun fingerprint(s: String): String { - return Base32().encodeAsString(DigestUtils.sha256(s)) - .replace("=", "") - .lowercase() + private fun fingerprint(s: String): Fingerprint { + return Fingerprint( + Base32().encodeAsString(DigestUtils.sha256(s)) + .replace("=", "") + .lowercase() + ) } } \ No newline at end of file diff --git a/src/main/kotlin/dev/dnpm/etl/processor/types.kt b/src/main/kotlin/dev/dnpm/etl/processor/types.kt new file mode 100644 index 0000000..c13714c --- /dev/null +++ b/src/main/kotlin/dev/dnpm/etl/processor/types.kt @@ -0,0 +1,11 @@ +package dev.dnpm.etl.processor + +class Fingerprint(val value: String) { + override fun hashCode() = value.hashCode() + + override fun equals(other: Any?) = other is Fingerprint && other.value == value + + companion object { + fun empty() = Fingerprint("") + } +} diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt index c82bccd..959db6b 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt @@ -21,6 +21,7 @@ package dev.dnpm.etl.processor.services import com.fasterxml.jackson.databind.ObjectMapper import de.ukw.ccc.bwhc.dto.* +import dev.dnpm.etl.processor.Fingerprint import dev.dnpm.etl.processor.config.AppConfigProperties import dev.dnpm.etl.processor.monitoring.* import dev.dnpm.etl.processor.output.MtbFileSender @@ -90,7 +91,7 @@ class RequestProcessorTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "zdlzv5s5ydmd4ktw2v5piohegc4jcyrm6j66bq6tv2uxuerndmga", + Fingerprint("zdlzv5s5ydmd4ktw2v5piohegc4jcyrm6j66bq6tv2uxuerndmga"), RequestType.MTB_FILE, RequestStatus.SUCCESS, Instant.parse("2023-08-08T02:00:00Z") @@ -149,7 +150,7 @@ class RequestProcessorTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "zdlzv5s5ydmd4ktw2v5piohegc4jcyrm6j66bq6tv2uxuerndmga", + Fingerprint("zdlzv5s5ydmd4ktw2v5piohegc4jcyrm6j66bq6tv2uxuerndmga"), RequestType.MTB_FILE, RequestStatus.SUCCESS, Instant.parse("2023-08-08T02:00:00Z") @@ -208,7 +209,7 @@ class RequestProcessorTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "different", + Fingerprint("different"), RequestType.MTB_FILE, RequestStatus.SUCCESS, Instant.parse("2023-08-08T02:00:00Z") @@ -271,7 +272,7 @@ class RequestProcessorTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "different", + Fingerprint("different"), RequestType.MTB_FILE, RequestStatus.SUCCESS, Instant.parse("2023-08-08T02:00:00Z") diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestServiceTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestServiceTest.kt index 02cd2cf..493fe37 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestServiceTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestServiceTest.kt @@ -19,6 +19,7 @@ package dev.dnpm.etl.processor.services +import dev.dnpm.etl.processor.Fingerprint import dev.dnpm.etl.processor.monitoring.Request import dev.dnpm.etl.processor.monitoring.RequestRepository import dev.dnpm.etl.processor.monitoring.RequestStatus @@ -45,7 +46,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_dummy", "PX", - "dummy", + Fingerprint("dummy"), RequestType.MTB_FILE, RequestStatus.SUCCESS, Instant.parse("2023-08-08T02:00:00Z") @@ -67,7 +68,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdef1", + Fingerprint("0123456789abcdef1"), RequestType.MTB_FILE, RequestStatus.WARNING, Instant.parse("2023-07-07T00:00:00Z") @@ -77,7 +78,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdefd", + Fingerprint("0123456789abcdefd"), RequestType.DELETE, RequestStatus.WARNING, Instant.parse("2023-07-07T02:00:00Z") @@ -87,7 +88,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdef1", + Fingerprint("0123456789abcdef1"), RequestType.MTB_FILE, RequestStatus.UNKNOWN, Instant.parse("2023-08-11T00:00:00Z") @@ -107,7 +108,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdef1", + Fingerprint("0123456789abcdef1"), RequestType.MTB_FILE, RequestStatus.WARNING, Instant.parse("2023-07-07T00:00:00Z") @@ -117,7 +118,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdef1", + Fingerprint("0123456789abcdef1"), RequestType.MTB_FILE, RequestStatus.WARNING, Instant.parse("2023-07-07T02:00:00Z") @@ -127,7 +128,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdef1", + Fingerprint("0123456789abcdef1"), RequestType.MTB_FILE, RequestStatus.UNKNOWN, Instant.parse("2023-08-11T00:00:00Z") @@ -147,7 +148,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdef1", + Fingerprint("0123456789abcdef1"), RequestType.DELETE, RequestStatus.SUCCESS, Instant.parse("2023-07-07T02:00:00Z") @@ -157,7 +158,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_12345678902", "P2", - "0123456789abcdef2", + Fingerprint("0123456789abcdef2"), RequestType.MTB_FILE, RequestStatus.WARNING, Instant.parse("2023-08-08T00:00:00Z") @@ -167,7 +168,7 @@ class RequestServiceTest { val actual = RequestService.lastMtbFileRequestForPatientPseudonym(requests) assertThat(actual).isInstanceOf(Request::class.java) - assertThat(actual?.fingerprint).isEqualTo("0123456789abcdef2") + assertThat(actual?.fingerprint).isEqualTo(Fingerprint("0123456789abcdef2")) } @Test @@ -190,7 +191,7 @@ class RequestServiceTest { UUID.randomUUID().toString(), "TEST_12345678901", "P1", - "0123456789abcdef1", + Fingerprint("0123456789abcdef1"), RequestType.DELETE, RequestStatus.SUCCESS, Instant.parse("2023-07-07T02:00:00Z") diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/ResponseProcessorTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/ResponseProcessorTest.kt index b9e4b7f..c96fe8f 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/services/ResponseProcessorTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/services/ResponseProcessorTest.kt @@ -19,6 +19,7 @@ package dev.dnpm.etl.processor.services +import dev.dnpm.etl.processor.Fingerprint import dev.dnpm.etl.processor.monitoring.Request import dev.dnpm.etl.processor.monitoring.RequestRepository import dev.dnpm.etl.processor.monitoring.RequestStatus @@ -50,7 +51,7 @@ class ResponseProcessorTest { "TestID1234", "PSEUDONYM-A", "1", - "dummyfingerprint", + Fingerprint("dummyfingerprint"), RequestType.MTB_FILE, RequestStatus.UNKNOWN )