mirror of
https://github.com/pcvolkmer/etl-processor.git
synced 2025-04-20 01:36:50 +00:00
Issue #12: Transform MTBFile objects by using transformation rules
This commit is contained in:
parent
2824951e5e
commit
4196664060
@ -26,6 +26,7 @@ import dev.dnpm.etl.processor.pseudonym.Generator
|
|||||||
import dev.dnpm.etl.processor.pseudonym.GpasPseudonymGenerator
|
import dev.dnpm.etl.processor.pseudonym.GpasPseudonymGenerator
|
||||||
import dev.dnpm.etl.processor.pseudonym.PseudonymizeService
|
import dev.dnpm.etl.processor.pseudonym.PseudonymizeService
|
||||||
import dev.dnpm.etl.processor.services.Transformation
|
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.autoconfigure.condition.ConditionalOnProperty
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties
|
import org.springframework.boot.context.properties.EnableConfigurationProperties
|
||||||
import org.springframework.context.annotation.Bean
|
import org.springframework.context.annotation.Bean
|
||||||
@ -73,10 +74,13 @@ class AppConfiguration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
fun transformations(configProperties: AppConfigProperties): List<Transformation> {
|
fun transformationService(
|
||||||
return configProperties.transformations.map {
|
objectMapper: ObjectMapper,
|
||||||
|
configProperties: AppConfigProperties
|
||||||
|
): TransformationService {
|
||||||
|
return TransformationService(objectMapper, configProperties.transformations.map {
|
||||||
Transformation.of(it.path) from it.from to it.to
|
Transformation.of(it.path) from it.from to it.to
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ import java.util.*
|
|||||||
@Service
|
@Service
|
||||||
class RequestProcessor(
|
class RequestProcessor(
|
||||||
private val pseudonymizeService: PseudonymizeService,
|
private val pseudonymizeService: PseudonymizeService,
|
||||||
|
private val transformationService: TransformationService,
|
||||||
private val sender: MtbFileSender,
|
private val sender: MtbFileSender,
|
||||||
private val requestService: RequestService,
|
private val requestService: RequestService,
|
||||||
private val objectMapper: ObjectMapper,
|
private val objectMapper: ObjectMapper,
|
||||||
@ -50,7 +51,7 @@ class RequestProcessor(
|
|||||||
|
|
||||||
mtbFile pseudonymizeWith pseudonymizeService
|
mtbFile pseudonymizeWith pseudonymizeService
|
||||||
|
|
||||||
val request = MtbFileSender.MtbFileRequest(requestId, mtbFile)
|
val request = MtbFileSender.MtbFileRequest(requestId, transformationService.transform(mtbFile))
|
||||||
|
|
||||||
requestService.save(
|
requestService.save(
|
||||||
Request(
|
Request(
|
||||||
|
@ -24,8 +24,8 @@ import com.jayway.jsonpath.JsonPath
|
|||||||
import com.jayway.jsonpath.PathNotFoundException
|
import com.jayway.jsonpath.PathNotFoundException
|
||||||
import de.ukw.ccc.bwhc.dto.MtbFile
|
import de.ukw.ccc.bwhc.dto.MtbFile
|
||||||
|
|
||||||
class TransformationService(private val objectMapper: ObjectMapper) {
|
class TransformationService(private val objectMapper: ObjectMapper, private val transformations: List<Transformation>) {
|
||||||
fun transform(mtbFile: MtbFile, vararg transformations: Transformation): MtbFile {
|
fun transform(mtbFile: MtbFile): MtbFile {
|
||||||
var json = objectMapper.writeValueAsString(mtbFile)
|
var json = objectMapper.writeValueAsString(mtbFile)
|
||||||
|
|
||||||
transformations.forEach { transformation ->
|
transformations.forEach { transformation ->
|
||||||
|
@ -37,6 +37,7 @@ import org.mockito.Mockito.*
|
|||||||
import org.mockito.junit.jupiter.MockitoExtension
|
import org.mockito.junit.jupiter.MockitoExtension
|
||||||
import org.mockito.kotlin.any
|
import org.mockito.kotlin.any
|
||||||
import org.mockito.kotlin.argumentCaptor
|
import org.mockito.kotlin.argumentCaptor
|
||||||
|
import org.mockito.kotlin.whenever
|
||||||
import org.springframework.context.ApplicationEventPublisher
|
import org.springframework.context.ApplicationEventPublisher
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -46,6 +47,7 @@ import java.util.*
|
|||||||
class RequestProcessorTest {
|
class RequestProcessorTest {
|
||||||
|
|
||||||
private lateinit var pseudonymizeService: PseudonymizeService
|
private lateinit var pseudonymizeService: PseudonymizeService
|
||||||
|
private lateinit var transformationService: TransformationService
|
||||||
private lateinit var sender: MtbFileSender
|
private lateinit var sender: MtbFileSender
|
||||||
private lateinit var requestService: RequestService
|
private lateinit var requestService: RequestService
|
||||||
private lateinit var applicationEventPublisher: ApplicationEventPublisher
|
private lateinit var applicationEventPublisher: ApplicationEventPublisher
|
||||||
@ -55,11 +57,13 @@ class RequestProcessorTest {
|
|||||||
@BeforeEach
|
@BeforeEach
|
||||||
fun setup(
|
fun setup(
|
||||||
@Mock pseudonymizeService: PseudonymizeService,
|
@Mock pseudonymizeService: PseudonymizeService,
|
||||||
|
@Mock transformationService: TransformationService,
|
||||||
@Mock sender: RestMtbFileSender,
|
@Mock sender: RestMtbFileSender,
|
||||||
@Mock requestService: RequestService,
|
@Mock requestService: RequestService,
|
||||||
@Mock applicationEventPublisher: ApplicationEventPublisher
|
@Mock applicationEventPublisher: ApplicationEventPublisher
|
||||||
) {
|
) {
|
||||||
this.pseudonymizeService = pseudonymizeService
|
this.pseudonymizeService = pseudonymizeService
|
||||||
|
this.transformationService = transformationService
|
||||||
this.sender = sender
|
this.sender = sender
|
||||||
this.requestService = requestService
|
this.requestService = requestService
|
||||||
this.applicationEventPublisher = applicationEventPublisher
|
this.applicationEventPublisher = applicationEventPublisher
|
||||||
@ -68,6 +72,7 @@ class RequestProcessorTest {
|
|||||||
|
|
||||||
requestProcessor = RequestProcessor(
|
requestProcessor = RequestProcessor(
|
||||||
pseudonymizeService,
|
pseudonymizeService,
|
||||||
|
transformationService,
|
||||||
sender,
|
sender,
|
||||||
requestService,
|
requestService,
|
||||||
objectMapper,
|
objectMapper,
|
||||||
@ -98,6 +103,10 @@ class RequestProcessorTest {
|
|||||||
it.arguments[0] as String
|
it.arguments[0] as String
|
||||||
}.`when`(pseudonymizeService).patientPseudonym(any())
|
}.`when`(pseudonymizeService).patientPseudonym(any())
|
||||||
|
|
||||||
|
doAnswer {
|
||||||
|
it.arguments[0]
|
||||||
|
}.whenever(transformationService).transform(any())
|
||||||
|
|
||||||
val mtbFile = MtbFile.builder()
|
val mtbFile = MtbFile.builder()
|
||||||
.withPatient(
|
.withPatient(
|
||||||
Patient.builder()
|
Patient.builder()
|
||||||
@ -153,6 +162,10 @@ class RequestProcessorTest {
|
|||||||
it.arguments[0] as String
|
it.arguments[0] as String
|
||||||
}.`when`(pseudonymizeService).patientPseudonym(any())
|
}.`when`(pseudonymizeService).patientPseudonym(any())
|
||||||
|
|
||||||
|
doAnswer {
|
||||||
|
it.arguments[0]
|
||||||
|
}.whenever(transformationService).transform(any())
|
||||||
|
|
||||||
val mtbFile = MtbFile.builder()
|
val mtbFile = MtbFile.builder()
|
||||||
.withPatient(
|
.withPatient(
|
||||||
Patient.builder()
|
Patient.builder()
|
||||||
@ -212,6 +225,10 @@ class RequestProcessorTest {
|
|||||||
it.arguments[0] as String
|
it.arguments[0] as String
|
||||||
}.`when`(pseudonymizeService).patientPseudonym(any())
|
}.`when`(pseudonymizeService).patientPseudonym(any())
|
||||||
|
|
||||||
|
doAnswer {
|
||||||
|
it.arguments[0]
|
||||||
|
}.whenever(transformationService).transform(any())
|
||||||
|
|
||||||
val mtbFile = MtbFile.builder()
|
val mtbFile = MtbFile.builder()
|
||||||
.withPatient(
|
.withPatient(
|
||||||
Patient.builder()
|
Patient.builder()
|
||||||
@ -271,6 +288,10 @@ class RequestProcessorTest {
|
|||||||
it.arguments[0] as String
|
it.arguments[0] as String
|
||||||
}.`when`(pseudonymizeService).patientPseudonym(any())
|
}.`when`(pseudonymizeService).patientPseudonym(any())
|
||||||
|
|
||||||
|
doAnswer {
|
||||||
|
it.arguments[0]
|
||||||
|
}.whenever(transformationService).transform(any())
|
||||||
|
|
||||||
val mtbFile = MtbFile.builder()
|
val mtbFile = MtbFile.builder()
|
||||||
.withPatient(
|
.withPatient(
|
||||||
Patient.builder()
|
Patient.builder()
|
||||||
|
@ -34,15 +34,16 @@ class TransformationServiceTest {
|
|||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
fun setup() {
|
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
|
@Test
|
||||||
fun shouldTransformMtbFile() {
|
fun shouldTransformMtbFile() {
|
||||||
val transformations = arrayOf(
|
|
||||||
Transformation.of("diagnoses[*].icd10.version") from "2013" to "2014",
|
|
||||||
)
|
|
||||||
|
|
||||||
val mtbFile = MtbFile.builder().withDiagnoses(
|
val mtbFile = MtbFile.builder().withDiagnoses(
|
||||||
listOf(
|
listOf(
|
||||||
Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also {
|
Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also {
|
||||||
@ -51,7 +52,7 @@ class TransformationServiceTest {
|
|||||||
)
|
)
|
||||||
).build()
|
).build()
|
||||||
|
|
||||||
val actual = this.service.transform(mtbFile, *transformations)
|
val actual = this.service.transform(mtbFile)
|
||||||
|
|
||||||
assertThat(actual).isNotNull
|
assertThat(actual).isNotNull
|
||||||
assertThat(actual.diagnoses[0].icd10.version).isEqualTo("2014")
|
assertThat(actual.diagnoses[0].icd10.version).isEqualTo("2014")
|
||||||
@ -59,10 +60,6 @@ class TransformationServiceTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun shouldOnlyTransformGivenValues() {
|
fun shouldOnlyTransformGivenValues() {
|
||||||
val transformations = arrayOf(
|
|
||||||
Transformation.of("diagnoses[*].icd10.version") from "2013" to "2014",
|
|
||||||
)
|
|
||||||
|
|
||||||
val mtbFile = MtbFile.builder().withDiagnoses(
|
val mtbFile = MtbFile.builder().withDiagnoses(
|
||||||
listOf(
|
listOf(
|
||||||
Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also {
|
Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also {
|
||||||
@ -74,7 +71,7 @@ class TransformationServiceTest {
|
|||||||
)
|
)
|
||||||
).build()
|
).build()
|
||||||
|
|
||||||
val actual = this.service.transform(mtbFile, *transformations)
|
val actual = this.service.transform(mtbFile)
|
||||||
|
|
||||||
assertThat(actual).isNotNull
|
assertThat(actual).isNotNull
|
||||||
assertThat(actual.diagnoses[0].icd10.code).isEqualTo("F79.9")
|
assertThat(actual.diagnoses[0].icd10.code).isEqualTo("F79.9")
|
||||||
@ -85,15 +82,11 @@ class TransformationServiceTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun shouldTransformMtbFileWithConsentEnum() {
|
fun shouldTransformMtbFileWithConsentEnum() {
|
||||||
val transformations = arrayOf(
|
|
||||||
Transformation.of("consent.status") from Consent.Status.ACTIVE to Consent.Status.REJECTED,
|
|
||||||
)
|
|
||||||
|
|
||||||
val mtbFile = MtbFile.builder().withConsent(
|
val mtbFile = MtbFile.builder().withConsent(
|
||||||
Consent("123", "456", Consent.Status.ACTIVE)
|
Consent("123", "456", Consent.Status.ACTIVE)
|
||||||
).build()
|
).build()
|
||||||
|
|
||||||
val actual = this.service.transform(mtbFile, *transformations)
|
val actual = this.service.transform(mtbFile)
|
||||||
|
|
||||||
assertThat(actual.consent).isNotNull
|
assertThat(actual.consent).isNotNull
|
||||||
assertThat(actual.consent.status).isEqualTo(Consent.Status.REJECTED)
|
assertThat(actual.consent.status).isEqualTo(Consent.Status.REJECTED)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user