summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul-Christian Volkmer2024-04-30 11:01:31 +0200
committerPaul-Christian Volkmer2024-04-30 11:08:27 +0200
commit9a6a0c61385dfd1116947609cf1d675f7a52f192 (patch)
tree875deb2ac59eb2db2a9bf521b9d10b4e7b6ea60d
parent598532721936c18da528c32521566c41792467bf (diff)
refactor: use Fingerprint type instead of plain String
-rw-r--r--src/integrationTest/kotlin/dev/dnpm/etl/processor/monitoring/RequestRepositoryTest.kt3
-rw-r--r--src/integrationTest/kotlin/dev/dnpm/etl/processor/services/RequestServiceIntegrationTest.kt13
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt5
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/config/AppJdbcConfiguration.kt25
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/monitoring/Request.kt9
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt15
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/types.kt11
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt9
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/services/RequestServiceTest.kt23
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/services/ResponseProcessorTest.kt3
10 files changed, 84 insertions, 32 deletions
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<String, Fingerprint> {
+ override fun convert(source: String): Fingerprint {
+ return Fingerprint(source)
+ }
+}
+
+class FingerprintToStringConverter : Converter<Fingerprint, String> {
+ 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
)