1
0
mirror of https://github.com/pcvolkmer/etl-processor.git synced 2025-04-19 17:26:51 +00:00

refactor: use Fingerprint type instead of plain String

This commit is contained in:
Paul-Christian Volkmer 2024-04-30 11:01:31 +02:00
parent 5985327219
commit 9a6a0c6138
10 changed files with 84 additions and 32 deletions

View File

@ -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")

View File

@ -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"))
}
}

View File

@ -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()
}
}

View File

@ -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
}
}

View File

@ -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

View File

@ -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()
)
}
}

View File

@ -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("")
}
}

View File

@ -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")

View File

@ -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")

View File

@ -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
)