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 ccc4b78..70ae0f5 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt @@ -26,6 +26,7 @@ import dev.dnpm.etl.processor.pseudonym.Generator import dev.dnpm.etl.processor.pseudonym.GpasPseudonymGenerator import dev.dnpm.etl.processor.pseudonym.PseudonymizeService import dev.dnpm.etl.processor.services.Transformation +import dev.dnpm.etl.processor.services.TransformationService import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean @@ -73,10 +74,13 @@ class AppConfiguration { } @Bean - fun transformations(configProperties: AppConfigProperties): List { - return configProperties.transformations.map { + fun transformationService( + objectMapper: ObjectMapper, + configProperties: AppConfigProperties + ): TransformationService { + return TransformationService(objectMapper, configProperties.transformations.map { Transformation.of(it.path) from it.from to it.to - } + }) } } 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 3cd912c..fd9a3f5 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/services/RequestProcessor.kt @@ -38,6 +38,7 @@ import java.util.* @Service class RequestProcessor( private val pseudonymizeService: PseudonymizeService, + private val transformationService: TransformationService, private val sender: MtbFileSender, private val requestService: RequestService, private val objectMapper: ObjectMapper, @@ -50,7 +51,7 @@ class RequestProcessor( mtbFile pseudonymizeWith pseudonymizeService - val request = MtbFileSender.MtbFileRequest(requestId, mtbFile) + val request = MtbFileSender.MtbFileRequest(requestId, transformationService.transform(mtbFile)) requestService.save( Request( diff --git a/src/main/kotlin/dev/dnpm/etl/processor/services/TransformationService.kt b/src/main/kotlin/dev/dnpm/etl/processor/services/TransformationService.kt index f33900d..26de550 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/services/TransformationService.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/services/TransformationService.kt @@ -24,8 +24,8 @@ import com.jayway.jsonpath.JsonPath import com.jayway.jsonpath.PathNotFoundException import de.ukw.ccc.bwhc.dto.MtbFile -class TransformationService(private val objectMapper: ObjectMapper) { - fun transform(mtbFile: MtbFile, vararg transformations: Transformation): MtbFile { +class TransformationService(private val objectMapper: ObjectMapper, private val transformations: List) { + fun transform(mtbFile: MtbFile): MtbFile { var json = objectMapper.writeValueAsString(mtbFile) transformations.forEach { transformation -> 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 7856833..9aaa091 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/services/RequestProcessorTest.kt @@ -37,6 +37,7 @@ import org.mockito.Mockito.* import org.mockito.junit.jupiter.MockitoExtension import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor +import org.mockito.kotlin.whenever import org.springframework.context.ApplicationEventPublisher import java.time.Instant import java.util.* @@ -46,6 +47,7 @@ import java.util.* class RequestProcessorTest { private lateinit var pseudonymizeService: PseudonymizeService + private lateinit var transformationService: TransformationService private lateinit var sender: MtbFileSender private lateinit var requestService: RequestService private lateinit var applicationEventPublisher: ApplicationEventPublisher @@ -55,11 +57,13 @@ class RequestProcessorTest { @BeforeEach fun setup( @Mock pseudonymizeService: PseudonymizeService, + @Mock transformationService: TransformationService, @Mock sender: RestMtbFileSender, @Mock requestService: RequestService, @Mock applicationEventPublisher: ApplicationEventPublisher ) { this.pseudonymizeService = pseudonymizeService + this.transformationService = transformationService this.sender = sender this.requestService = requestService this.applicationEventPublisher = applicationEventPublisher @@ -68,6 +72,7 @@ class RequestProcessorTest { requestProcessor = RequestProcessor( pseudonymizeService, + transformationService, sender, requestService, objectMapper, @@ -98,6 +103,10 @@ class RequestProcessorTest { it.arguments[0] as String }.`when`(pseudonymizeService).patientPseudonym(any()) + doAnswer { + it.arguments[0] + }.whenever(transformationService).transform(any()) + val mtbFile = MtbFile.builder() .withPatient( Patient.builder() @@ -153,6 +162,10 @@ class RequestProcessorTest { it.arguments[0] as String }.`when`(pseudonymizeService).patientPseudonym(any()) + doAnswer { + it.arguments[0] + }.whenever(transformationService).transform(any()) + val mtbFile = MtbFile.builder() .withPatient( Patient.builder() @@ -212,6 +225,10 @@ class RequestProcessorTest { it.arguments[0] as String }.`when`(pseudonymizeService).patientPseudonym(any()) + doAnswer { + it.arguments[0] + }.whenever(transformationService).transform(any()) + val mtbFile = MtbFile.builder() .withPatient( Patient.builder() @@ -271,6 +288,10 @@ class RequestProcessorTest { it.arguments[0] as String }.`when`(pseudonymizeService).patientPseudonym(any()) + doAnswer { + it.arguments[0] + }.whenever(transformationService).transform(any()) + val mtbFile = MtbFile.builder() .withPatient( Patient.builder() diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/TransformationServiceTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/TransformationServiceTest.kt index 5b34562..487b502 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/services/TransformationServiceTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/services/TransformationServiceTest.kt @@ -34,15 +34,16 @@ class TransformationServiceTest { @BeforeEach fun setup() { - this.service = TransformationService(ObjectMapper()) + this.service = TransformationService( + ObjectMapper(), listOf( + Transformation.of("consent.status") from Consent.Status.ACTIVE to Consent.Status.REJECTED, + Transformation.of("diagnoses[*].icd10.version") from "2013" to "2014", + ) + ) } @Test fun shouldTransformMtbFile() { - val transformations = arrayOf( - Transformation.of("diagnoses[*].icd10.version") from "2013" to "2014", - ) - val mtbFile = MtbFile.builder().withDiagnoses( listOf( Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also { @@ -51,7 +52,7 @@ class TransformationServiceTest { ) ).build() - val actual = this.service.transform(mtbFile, *transformations) + val actual = this.service.transform(mtbFile) assertThat(actual).isNotNull assertThat(actual.diagnoses[0].icd10.version).isEqualTo("2014") @@ -59,10 +60,6 @@ class TransformationServiceTest { @Test fun shouldOnlyTransformGivenValues() { - val transformations = arrayOf( - Transformation.of("diagnoses[*].icd10.version") from "2013" to "2014", - ) - val mtbFile = MtbFile.builder().withDiagnoses( listOf( Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also { @@ -74,7 +71,7 @@ class TransformationServiceTest { ) ).build() - val actual = this.service.transform(mtbFile, *transformations) + val actual = this.service.transform(mtbFile) assertThat(actual).isNotNull assertThat(actual.diagnoses[0].icd10.code).isEqualTo("F79.9") @@ -85,15 +82,11 @@ class TransformationServiceTest { @Test fun shouldTransformMtbFileWithConsentEnum() { - val transformations = arrayOf( - Transformation.of("consent.status") from Consent.Status.ACTIVE to Consent.Status.REJECTED, - ) - val mtbFile = MtbFile.builder().withConsent( Consent("123", "456", Consent.Status.ACTIVE) ).build() - val actual = this.service.transform(mtbFile, *transformations) + val actual = this.service.transform(mtbFile) assertThat(actual.consent).isNotNull assertThat(actual.consent.status).isEqualTo(Consent.Status.REJECTED)