From cab0fdd3775a5d7fb933cb79c7e6c64d109a7631 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Thu, 26 Jun 2025 00:10:52 +0200 Subject: [PATCH] feat: add JSON medication mapper --- .../mapper/JsonToMedicationMapper.java | 87 +++++++++++++++++++ .../JsonToMedicationMapperTest.java | 54 ++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 src/main/java/dev/pcvolkmer/onco/datamapper/mapper/JsonToMedicationMapper.java create mode 100644 src/test/java/dev/pcvolkmer/onco/datamapper/datacatalogues/JsonToMedicationMapperTest.java diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/JsonToMedicationMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/JsonToMedicationMapper.java new file mode 100644 index 0000000..22965bb --- /dev/null +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/JsonToMedicationMapper.java @@ -0,0 +1,87 @@ +package dev.pcvolkmer.onco.datamapper.mapper; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import dev.pcvolkmer.mv64e.mtb.AtcUnregisteredMedicationCoding; +import dev.pcvolkmer.mv64e.mtb.RequestedMedicationSystem; +import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * Maps JSON strings used in form into DNPM medication + * + * @author Paul-Christian Volkmer + * @since 0.1 + */ +public class JsonToMedicationMapper { + + private JsonToMedicationMapper() { + // intentionally left empty + } + + public static List map(String wirkstoffejson) { + try { + return new ObjectMapper().readValue(wirkstoffejson, new TypeReference>() { + }).stream() + .map(wirkstoff -> AtcUnregisteredMedicationCoding.builder() + .code(wirkstoff.code) + .system( + // Wirkstoff ohne Version => UNREGISTERED + "ATC".equals(wirkstoff.system) && null != wirkstoff.version && !wirkstoff.version.isBlank() + ? RequestedMedicationSystem.FHIR_DE_CODE_SYSTEM_BFARM_ATC + : RequestedMedicationSystem.UNDEFINED + ) + .version(wirkstoff.version) + .display(wirkstoff.name) + .build() + ) + .collect(Collectors.toList()); + } catch (Exception e) { + throw new DataAccessException(String.format("Cannot map medication for %s", wirkstoffejson)); + } + } + + private static class Wirkstoff { + private String code; + @JsonAlias("substance") + private String name; + private String system; + private String version; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSystem() { + return system; + } + + public void setSystem(String system) { + this.system = system; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } + +} diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/datacatalogues/JsonToMedicationMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/datacatalogues/JsonToMedicationMapperTest.java new file mode 100644 index 0000000..3801438 --- /dev/null +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/datacatalogues/JsonToMedicationMapperTest.java @@ -0,0 +1,54 @@ +package dev.pcvolkmer.onco.datamapper.datacatalogues; + +import dev.pcvolkmer.mv64e.mtb.RequestedMedicationSystem; +import dev.pcvolkmer.onco.datamapper.mapper.JsonToMedicationMapper; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class JsonToMedicationMapperTest { + + // See example in: https://github.com/pcvolkmer/onkostar-plugin-dnpm/blob/master/sql/sql-queries.md + @Test + void shouldMapTherapielinieJson() { + var json = "[\n" + + " {\"system\":\"other\",\"code\":\"Gemcitabin\",\"substance\":\"Gemcitabin (dFdC)\"},\n" + + " {\"system\":\"other\",\"code\":\"Cisplatin\",\"substance\":\"Cisplatin (CDDP)\"}\n" + + "]"; + + var actual = JsonToMedicationMapper.map(json); + + assertThat(actual).hasSize(2); + + var elem0 = actual.get(0); + assertThat(elem0.getCode()).isEqualTo("Gemcitabin"); + assertThat(elem0.getDisplay()).isEqualTo("Gemcitabin (dFdC)"); + assertThat(elem0.getSystem()).isEqualTo(RequestedMedicationSystem.UNDEFINED); + assertThat(elem0.getVersion()).isNull(); + + var elem1 = actual.get(1); + assertThat(elem1.getCode()).isEqualTo("Cisplatin"); + assertThat(elem1.getDisplay()).isEqualTo("Cisplatin (CDDP)"); + assertThat(elem0.getSystem()).isEqualTo(RequestedMedicationSystem.UNDEFINED); + assertThat(elem0.getVersion()).isNull(); + } + + // See example in: https://github.com/pcvolkmer/onkostar-plugin-dnpm/blob/master/sql/sql-queries.md + @Test + void shouldMapEinzelempfehlungJson() { + var json = "[\n" + + " {\"code\":\"\",\"name\":\"PARP-Inhibierung\",\"system\":\"UNREGISTERED\"}\n" + + "]"; + + var actual = JsonToMedicationMapper.map(json); + + assertThat(actual).hasSize(1); + + var elem0 = actual.get(0); + assertThat(elem0.getCode()).isEmpty(); + assertThat(elem0.getDisplay()).isEqualTo("PARP-Inhibierung"); + assertThat(elem0.getSystem()).isEqualTo(RequestedMedicationSystem.UNDEFINED); + assertThat(elem0.getVersion()).isNull(); + } + +}