summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjlidke2025-08-20 10:47:38 +0200
committerGitHub2025-08-20 10:47:38 +0200
commit3b66f42eb2b1b3e7f3ae11718ca6227f86c92214 (patch)
tree83d690ecb3f5594897fc3b96fce89596e3a76890
parentc40fd7f816b41bd3d2cf0694e728426734933cd7 (diff)
feat: configuration of genomDe test submission via 'app.genomDeTestSubmission' = 'true', is implemented, now. (#136)
Co-authored-by: Paul-Christian Volkmer <code@pcvolkmer.de>
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/services/ConsentProcessor.kt53
-rw-r--r--src/test/kotlin/dev/dnpm/etl/processor/services/ConsentProcessorTest.kt38
2 files changed, 62 insertions, 29 deletions
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/services/ConsentProcessor.kt b/src/main/kotlin/dev/dnpm/etl/processor/services/ConsentProcessor.kt
index 36c4246..2ed21eb 100644
--- a/src/main/kotlin/dev/dnpm/etl/processor/services/ConsentProcessor.kt
+++ b/src/main/kotlin/dev/dnpm/etl/processor/services/ConsentProcessor.kt
@@ -6,9 +6,9 @@ import com.fasterxml.jackson.core.type.TypeReference
import com.fasterxml.jackson.databind.ObjectMapper
import dev.dnpm.etl.processor.config.AppConfigProperties
import dev.dnpm.etl.processor.config.GIcsConfigProperties
-import dev.dnpm.etl.processor.consent.MtbFileConsentService
import dev.dnpm.etl.processor.consent.ConsentDomain
import dev.dnpm.etl.processor.consent.IConsentService
+import dev.dnpm.etl.processor.consent.MtbFileConsentService
import dev.dnpm.etl.processor.pseudonym.ensureMetaDataIsInitialized
import dev.pcvolkmer.mv64e.mtb.*
import org.apache.commons.lang3.NotImplementedException
@@ -72,7 +72,7 @@ class ConsentProcessor(
val broadConsent = consentService.getConsent(
personIdentifierValue, requestDate, ConsentDomain.BROAD_CONSENT
)
- val broadConsentHasBeenAsked = !broadConsent.entry.isEmpty()
+ val broadConsentHasBeenAsked = broadConsent.entry.isNotEmpty()
// fast exit - if patient has not been asked, we can skip and exit
if (!broadConsentHasBeenAsked) return false
@@ -83,7 +83,7 @@ class ConsentProcessor(
addGenomeDbProvisions(mtbFile, genomeDeConsent)
- if (!genomeDeConsent.entry.isEmpty()) setGenomDeSubmissionType(mtbFile)
+ if (genomeDeConsent.entry.isNotEmpty()) setGenomDeSubmissionType(mtbFile)
embedBroadConsentResources(mtbFile, broadConsent)
@@ -105,8 +105,8 @@ class ConsentProcessor(
}
fun embedBroadConsentResources(mtbFile: Mtb, broadConsent: Bundle) {
- for (entry in broadConsent.getEntry()) {
- val resource = entry.getResource()
+ for (entry in broadConsent.entry) {
+ val resource = entry.resource
if (resource is Consent) {
// since jackson convertValue does not work here,
// we need another step to back to string, before we convert to object map
@@ -124,14 +124,14 @@ class ConsentProcessor(
}
fun addGenomeDbProvisions(mtbFile: Mtb, consentGnomeDe: Bundle) {
- for (entry in consentGnomeDe.getEntry()) {
- val resource = entry.getResource()
+ for (entry in consentGnomeDe.entry) {
+ val resource = entry.resource
if (resource !is Consent) {
continue
}
// We expect only one provision in collection, therefore get first or none
- val provisions = resource.getProvision().getProvision()
+ val provisions = resource.provision.provision
if (provisions.isEmpty()) {
continue
}
@@ -139,10 +139,10 @@ class ConsentProcessor(
val provisionComponent: ProvisionComponent = provisions.first()
var provisionCode: String? = null
- if (provisionComponent.getCode() != null && !provisionComponent.getCode().isEmpty()) {
- val codableConcept: CodeableConcept = provisionComponent.getCode().first()
- if (codableConcept.getCoding() != null && !codableConcept.getCoding().isEmpty()) {
- provisionCode = codableConcept.getCoding().first().getCode()
+ if (provisionComponent.code != null && provisionComponent.code.isNotEmpty()) {
+ val codableConcept: CodeableConcept = provisionComponent.code.first()
+ if (codableConcept.coding != null && codableConcept.coding.isNotEmpty()) {
+ provisionCode = codableConcept.coding.first().code
}
}
@@ -153,12 +153,12 @@ class ConsentProcessor(
if (ModelProjectConsentPurpose.SEQUENCING == modelProjectConsentPurpose) {
// CONVENTION: wrapping date is date of SEQUENCING consent
- mtbFile.metadata.modelProjectConsent.date = resource.getDateTime()
+ mtbFile.metadata.modelProjectConsent.date = resource.dateTime
}
val provision = Provision.builder()
- .type(ConsentProvision.valueOf(provisionComponent.getType().name))
- .date(provisionComponent.getPeriod().getStart())
+ .type(ConsentProvision.valueOf(provisionComponent.type.name))
+ .date(provisionComponent.period.start)
.purpose(modelProjectConsentPurpose).build()
mtbFile.metadata.modelProjectConsent.provisions.add(provision)
@@ -170,27 +170,22 @@ class ConsentProcessor(
}
}
- if (!mtbFile.metadata.modelProjectConsent.provisions.isEmpty()) {
+ if (mtbFile.metadata.modelProjectConsent.provisions.isNotEmpty()) {
mtbFile.metadata.modelProjectConsent.version =
gIcsConfigProperties.genomeDeConsentVersion
}
}
}
- /**
- * fixme: currently we do not have information about submission type
- */
private fun setGenomDeSubmissionType(mtbFile: Mtb) {
if (appConfigProperties.genomDeTestSubmission) {
-
- // fixme: remove INITIAL and uncomment when data model is updated
- mtbFile.metadata.type = MvhSubmissionType.INITIAL
- // mtbFile.metadata.type = MvhSubmissionType.Test
-
+ mtbFile.metadata.type = MvhSubmissionType.TEST
logger.info("genomeDe submission mit TEST")
-
} else {
- mtbFile.metadata.type = MvhSubmissionType.INITIAL
+ mtbFile.metadata.type = when (mtbFile.metadata.type) {
+ null -> MvhSubmissionType.INITIAL
+ else -> mtbFile.metadata.type
+ }
}
}
@@ -251,7 +246,7 @@ class ConsentProcessor(
}
}.flatten()
- if (!entriesOfInterest.isEmpty()) {
+ if (entriesOfInterest.isNotEmpty()) {
return entriesOfInterest.first().type
}
return Consent.ConsentProvisionType.NULL
@@ -270,8 +265,8 @@ class ConsentProcessor(
}
fun isRequestDateInRange(requestDate: Date?, provPeriod: Period): Boolean {
- val isRequestDateAfterOrEqualStart = provPeriod.getStart().compareTo(requestDate)
- val isRequestDateBeforeOrEqualEnd = provPeriod.getEnd().compareTo(requestDate)
+ val isRequestDateAfterOrEqualStart = provPeriod.start.compareTo(requestDate)
+ val isRequestDateBeforeOrEqualEnd = provPeriod.end.compareTo(requestDate)
return isRequestDateAfterOrEqualStart <= 0 && isRequestDateBeforeOrEqualEnd >= 0
}
diff --git a/src/test/kotlin/dev/dnpm/etl/processor/services/ConsentProcessorTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/services/ConsentProcessorTest.kt
index 607234d..4d414c5 100644
--- a/src/test/kotlin/dev/dnpm/etl/processor/services/ConsentProcessorTest.kt
+++ b/src/test/kotlin/dev/dnpm/etl/processor/services/ConsentProcessorTest.kt
@@ -8,6 +8,7 @@ import dev.dnpm.etl.processor.config.JacksonConfig
import dev.dnpm.etl.processor.consent.ConsentDomain
import dev.dnpm.etl.processor.consent.GicsConsentService
import dev.pcvolkmer.mv64e.mtb.Mtb
+import dev.pcvolkmer.mv64e.mtb.MvhSubmissionType
import dev.pcvolkmer.mv64e.mtb.Patient
import org.assertj.core.api.Assertions.assertThat
import org.hl7.fhir.r4.model.Bundle
@@ -19,6 +20,7 @@ import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.CsvSource
+import org.junit.jupiter.params.provider.ValueSource
import org.mockito.Mock
import org.mockito.junit.jupiter.MockitoExtension
import org.mockito.kotlin.any
@@ -191,4 +193,40 @@ class ConsentProcessorTest {
.parseResource<Bundle>(Bundle::class.java, bundle)
}
+ @ParameterizedTest
+ @ValueSource(booleans = [true, false])
+ fun mvSubmissionTypeIsSet(isTestSubmission: Boolean) {
+ appConfigProperties.genomDeTestSubmission = isTestSubmission
+ val fixture =
+ ConsentProcessor(
+ appConfigProperties,
+ gIcsConfigProperties,
+ objectMapper,
+ fhirContext,
+ gicsConsentService
+ )
+
+ doAnswer { getDummyBroadConsentBundle() }.whenever(gicsConsentService)
+ .getConsent(any(), any(), eq(ConsentDomain.BROAD_CONSENT))
+
+ doAnswer {
+ Bundle().addEntry(
+ Bundle.BundleEntryComponent().setResource(getDummyGenomDeConsent())
+ )
+ }.whenever(gicsConsentService)
+ .getConsent(any(), any(), eq(ConsentDomain.MODELLVORHABEN_64E))
+
+ val inputMtb = Mtb.builder()
+ .patient(Patient.builder().id("d611d429-5003-11f0-a144-661e92ac9503").build()).build()
+ val checkResult = fixture.consentGatedCheckAndTryEmbedding(inputMtb)
+ assertThat(checkResult).isNotNull
+
+ if (isTestSubmission)
+ assertThat(inputMtb.metadata.type).isEqualTo(MvhSubmissionType.TEST)
+ else {
+ assertThat(inputMtb.metadata.type).isEqualTo(MvhSubmissionType.INITIAL)
+ }
+
+ }
+
}