Skip to content

Commit

Permalink
#318 - Add endpoints for profile data
Browse files Browse the repository at this point in the history
- remove profile_tree.json and terminology_systems.json from resources and move to filesystem (will be loaded with ontology files when this is available)
- add tests
  • Loading branch information
michael-82 committed Aug 16, 2024
1 parent 46595a0 commit 527e944
Show file tree
Hide file tree
Showing 20 changed files with 520 additions and 101 deletions.
2 changes: 2 additions & 0 deletions .github/integration-test/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ services:
- ./ontology/ui_profiles:/opt/codex-feasibility-backend/ontology/ui_profiles
- ./ontology/codex-code-tree.json:/opt/codex-feasibility-backend/ontology/codex-code-tree.json
- ./ontology/codex-term-code-mapping.json:/opt/codex-feasibility-backend/ontology/codex-term-code-mapping.json
- ./ontology/terminology_systems.json:/opt/codex-feasibility-backend/ontology/terminology_systems.json
- ./ontology/dse/profile_tree.json:/opt/codex-feasibility-backend/ontology/dse/profile_tree.json
- ./ontology/migration/R__Load_latest_ui_profile.sql:/opt/codex-feasibility-backend/ontology/migration/R__Load_latest_ui_profile.sql
- ./secrets:/opt/codex-feasibility-security
feasibility-gui-backend-db:
Expand Down
63 changes: 63 additions & 0 deletions .github/integration-test/ontology/dse/profile_tree.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{
"name": "Root",
"module": "no-module",
"url": "no-url",
"children": [
{
"id": "de5c2903-00aa-4d64-92e5-2161d56e3daf",
"children": [
{
"id": "69f4718f-1767-4517-90f8-6c079f627eed",
"name": "MII_PR_Medikation_MedicationStatement",
"display": "MII PR Medikation MedicationStatement",
"module": "modul-medikation",
"url": "https://www.medizininformatik-initiative.de/fhir/core/modul-medikation/StructureDefinition/MedicationStatement",
"leaf": true,
"selectable": true
},
{
"id": "83b4d6be-b3e1-451a-adf2-c307477e7b97",
"name": "MII_PR_Medikation_Medikationsliste",
"display": "MII PR Medikation Medikationsliste",
"module": "modul-medikation",
"url": "https://www.medizininformatik-initiative.de/fhir/core/modul-medikation/StructureDefinition/medikationsliste",
"leaf": true,
"selectable": true
},
{
"id": "fd375ed9-b3cd-414f-8a56-c70e10bb9609",
"name": "MII_PR_Medikation_MedicationRequest",
"display": "MII PR Medikation MedicationRequest",
"module": "modul-medikation",
"url": "https://www.medizininformatik-initiative.de/fhir/core/modul-medikation/StructureDefinition/MedicationRequest",
"leaf": true,
"selectable": true
},
{
"id": "323a3ad1-1c10-45f5-848a-2dc5fb100c47",
"name": "MII_PR_Medikation_Medication",
"display": "MII PR Medikation Medication",
"module": "modul-medikation",
"url": "https://www.medizininformatik-initiative.de/fhir/core/modul-medikation/StructureDefinition/Medication",
"leaf": true,
"selectable": true
},
{
"id": "81ed0f03-1d77-49c9-8391-d4c25702652c",
"name": "MII_PR_Medikation_MedicationAdministration",
"display": "MII PR Medikation MedicationAdministration",
"module": "modul-medikation",
"url": "https://www.medizininformatik-initiative.de/fhir/core/modul-medikation/StructureDefinition/MedicationAdministration",
"leaf": true,
"selectable": true
}
],
"name": "modul-medikation",
"display": "Medikation",
"url": "https://www.medizininformatik-initiative.de/fhir/core/modul-medikation/StructureDefinition/MedicationStatement",
"module": "modul-medikation",
"selectable": true,
"leaf": false
}
]
}
File renamed without changes.
18 changes: 18 additions & 0 deletions ontology/terminology_systems.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[
{
"url": "http://loinc.org",
"name": "loinc"
},
{
"url": "http://fhir.de/CodeSystem/bfarm/icd-10-gm",
"name": "ICD-10"
},
{
"url": "http://fhir.de/CodeSystem/bfarm/ops",
"name": "OPS"
},
{
"url": "TBD",
"name": "obviously this is just an example"
}
]

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,38 @@
import de.numcodex.feasibility_gui_backend.dse.api.DseProfile;
import de.numcodex.feasibility_gui_backend.dse.api.DseProfileTreeNode;
import de.numcodex.feasibility_gui_backend.dse.persistence.DseProfileRepository;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class DseService {

@Value("classpath:de/numcodex/feasibility_gui_backend/dse/profile_tree.json")
private Resource profileTreeResource;
@Getter
private final DseProfileTreeNode profileTree;

private final DseProfileRepository dseProfileRepository;

private final ObjectMapper objectMapper;

public DseService(DseProfileRepository dseProfileRepository, ObjectMapper objectMapper) {
public DseService(@Value("${app.dseProfileTreeFile}") String dseProfileTreeFilename,
DseProfileRepository dseProfileRepository,
ObjectMapper objectMapper) throws IOException {
this.dseProfileRepository = dseProfileRepository;
this.objectMapper = objectMapper;
this.profileTree = readProfileTree(dseProfileTreeFilename);
}

public DseProfileTreeNode getProfileTree() {
try {
var profileTreeString = profileTreeResource.getContentAsString(StandardCharsets.UTF_8);
return objectMapper.readValue(profileTreeString, DseProfileTreeNode.class);
} catch (IOException e) {
throw new DseProfileException("Could not read profile tree: " + e.getMessage());
}
public DseProfileTreeNode readProfileTree(String dseProfileTreeFilename) throws IOException {
return objectMapper.readValue(
new URL("file:" + dseProfileTreeFilename), DseProfileTreeNode.class);
}

public List<DseProfile> getProfileData(List<String> profileIds) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
import de.numcodex.feasibility_gui_backend.dse.DseService;
import de.numcodex.feasibility_gui_backend.dse.api.DseProfile;
import de.numcodex.feasibility_gui_backend.dse.api.DseProfileTreeNode;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;

import java.io.FileNotFoundException;
import java.util.List;

@RequestMapping("api/v3/dse")
Expand All @@ -20,8 +23,13 @@ public DseRestController(DseService dseService) {
}

@GetMapping(value = "profile-tree", produces = MediaType.APPLICATION_JSON_VALUE)
public DseProfileTreeNode getProfileTree() {
return dseService.getProfileTree();
public DseProfileTreeNode getProfileTree() throws FileNotFoundException {
DseProfileTreeNode profileTree = dseService.getProfileTree();
if (profileTree == null) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "DSE profile tree not found");
} else {
return profileTree;
}
}

@GetMapping(value = "profile-data", produces = MediaType.APPLICATION_JSON_VALUE)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
package de.numcodex.feasibility_gui_backend.terminology;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.numcodex.feasibility_gui_backend.terminology.api.CategoryEntry;
import de.numcodex.feasibility_gui_backend.terminology.api.CriteriaProfileData;
import de.numcodex.feasibility_gui_backend.terminology.api.TerminologyEntry;
import de.numcodex.feasibility_gui_backend.terminology.api.*;
import de.numcodex.feasibility_gui_backend.terminology.persistence.*;
import de.numcodex.feasibility_gui_backend.terminology.persistence.UiProfile;
import lombok.Getter;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand All @@ -33,7 +32,10 @@ public class TerminologyService {

private final MappingRepository mappingRepository;

private String uiProfilePath;
private final String uiProfilePath;

@Getter
private final List<TerminologySystemEntry> terminologySystems;

@NonNull
private ObjectMapper jsonUtil;
Expand All @@ -45,10 +47,8 @@ public class TerminologyService {
private Map<UUID, TerminologyEntry> terminologyEntriesWithOnlyDirectChildren = new HashMap<>();
private Map<UUID, Set<TerminologyEntry>> selectableEntriesByCategory = new HashMap<>();

@Value("classpath:de/numcodex/feasibility_gui_backend/terminology/terminology-systems.json")
private Resource terminologySystemsResource;

public TerminologyService(@Value("${app.ontologyFolder}") String uiProfilePath,
@Value("${app.terminologySystemsFile}") String terminologySystemsFilename,
UiProfileRepository uiProfileRepository,
TermCodeRepository termCodeRepository,
ContextualizedTermCodeRepository contextualizedTermCodeRepository,
Expand All @@ -63,6 +63,7 @@ public TerminologyService(@Value("${app.ontologyFolder}") String uiProfilePath,
this.contextualizedTermCodeRepository = contextualizedTermCodeRepository;
this.mappingRepository = mappingRepository;
this.jsonUtil = jsonUtil;
this.terminologySystems = jsonUtil.readValue(new URL("file:" + terminologySystemsFilename), new TypeReference<>() {});
}

private void readInTerminologyEntries() throws IOException {
Expand Down Expand Up @@ -263,12 +264,4 @@ public List<CriteriaProfileData> getCriteriaProfileData(List<String> criteriaIds

return results;
}

public String getTerminologySystems() {
try {
return terminologySystemsResource.getContentAsString(StandardCharsets.UTF_8);
} catch (IOException e) {
throw new MappingNotFoundException();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package de.numcodex.feasibility_gui_backend.terminology.api;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Builder
public record TerminologySystemEntry(
@JsonProperty String url,
@JsonProperty String name
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@


import de.numcodex.feasibility_gui_backend.terminology.TerminologyService;
import de.numcodex.feasibility_gui_backend.terminology.api.CategoryEntry;
import de.numcodex.feasibility_gui_backend.terminology.api.CriteriaProfileData;
import de.numcodex.feasibility_gui_backend.terminology.api.TerminologyEntry;
import de.numcodex.feasibility_gui_backend.terminology.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
Expand Down Expand Up @@ -71,7 +69,7 @@ public List<String> getIntersection(
}

@GetMapping(value = "systems", produces = MediaType.APPLICATION_JSON_VALUE)
public String getTerminologySystems() {
public List<TerminologySystemEntry> getTerminologySystems() {
return terminologyService.getTerminologySystems();
}
}
3 changes: 2 additions & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ management:
enabled: ${ELASTIC_SEARCH_ENABLED:true}

app:
# AKTIN or DSF or MOCK or DIRECT
dseProfileTreeFile: ${DSE_PROFILE_TREE_FILE:ontology/dse/profile_tree.json}
terminologySystemsFile: ${TERMINOLOGY_SYSTEMS_FILE:ontology/terminology_systems.json}
ontologyFolder: ${ONTOLOGY_FILES_FOLDER_UI:ontology/ui_trees}
ontologyOrder: ${ONTOLOGY_ORDER:Diagnose, Prozedur, Person, Laboruntersuchung, Medikamentenverabreichung, Bioprobe, Einwilligung}
mappingsFile: ${MAPPINGS_FILE:ontology/mapping_cql.json}
Expand Down
Loading

0 comments on commit 527e944

Please sign in to comment.