From 947ea0ae41435e7b94a38555c5797d4e83715655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 28 Mar 2022 14:52:51 +0200 Subject: [PATCH 001/118] add troubleshooting script and Readme --- num-node/flare/docker-compose.yml | 2 +- troubleshooting/feasibility-test.sh | 36 +++++ .../test-queries/test-condition.json | 20 +++ .../test-queries/test-observation.json | 29 ++++ .../test-queries/test-patient.json | 33 +++++ .../test-queries/test-procedure.json | 20 +++ .../test-queries/test-specimen.json | 36 +++++ troubleshooting/troubleshooting.md | 134 ++++++++++++++++++ 8 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 troubleshooting/feasibility-test.sh create mode 100644 troubleshooting/test-queries/test-condition.json create mode 100644 troubleshooting/test-queries/test-observation.json create mode 100644 troubleshooting/test-queries/test-patient.json create mode 100644 troubleshooting/test-queries/test-procedure.json create mode 100644 troubleshooting/test-queries/test-specimen.json create mode 100644 troubleshooting/troubleshooting.md diff --git a/num-node/flare/docker-compose.yml b/num-node/flare/docker-compose.yml index 894643e..90bdfaf 100644 --- a/num-node/flare/docker-compose.yml +++ b/num-node/flare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: node-flare: - image: ghcr.io/rwth-imi/flare-query:1.0-rc8 + image: ghcr.io/rwth-imi/flare-query:1.0-rc11 ports: - ${NUM_NODE_PORT_FLARE:-127.0.0.1:8084}:8080 environment: diff --git a/troubleshooting/feasibility-test.sh b/troubleshooting/feasibility-test.sh new file mode 100644 index 0000000..cf87b5e --- /dev/null +++ b/troubleshooting/feasibility-test.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env sh + +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +# FHIR_SERVER_URL=${FEASIBILITY_TEST_FHIR_SERVER_URL:-"http://localhost:8081/fhir"} +FLARE_SERVER_URL=${FEASIBILITY_TEST_FLARE_SERVER_URL:-"http://localhost:8084"} +TEST_FILES=$BASE_DIR/test-queries/* +PRINT_SQ=${FEASIBILITY_TEST_PRINT_SQ:-true} + +for testQuery in $TEST_FILES; do + queryName=$(basename $testQuery) + printf "\n\nTest query = #################### $queryName ####################\n\n" + + printf "### Structured-Query file is:\n$testQuery\n" + + if [[ $PRINT_SQ == true ]];then + printf "\n### Query input structured query :\n" + printf "$(cat $testQuery)\n" + fi + + printf "\n### FLARE FHIR Search translation for query is: \n" + curl --location --request POST "$FLARE_SERVER_URL/query/translate" \ + --header 'Content-Type: application/sq+json' \ + -d @$testQuery + + printf "\n\n### FLARE result (number of patients) for query is: \n" + + patientsFound=$(curl -s --location --request POST "$FLARE_SERVER_URL/query/execute" \ + --header 'Content-Type: application/sq+json' \ + -d @$testQuery) + + if [[ $patientsFound == 0 ]];then + printf "Found 0 patients, please check if this is correct for your server\n" + else + printf "Number of patients found for the query $queryName is: $patientsFound" + fi +done \ No newline at end of file diff --git a/troubleshooting/test-queries/test-condition.json b/troubleshooting/test-queries/test-condition.json new file mode 100644 index 0000000..bb58122 --- /dev/null +++ b/troubleshooting/test-queries/test-condition.json @@ -0,0 +1,20 @@ +{ + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "I10.0", + "system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm", + "version": "2021", + "display": "Benigne essentielle Hypertonie" + } + ], + "attributeFilters": [], + "timeRestriction": {} + } + ] + ] +} \ No newline at end of file diff --git a/troubleshooting/test-queries/test-observation.json b/troubleshooting/test-queries/test-observation.json new file mode 100644 index 0000000..9da45b5 --- /dev/null +++ b/troubleshooting/test-queries/test-observation.json @@ -0,0 +1,29 @@ +{ + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "718-7", + "system": "http://loinc.org", + "display": "Hämoglobin" + } + ], + "attributeFilters": [], + "timeRestriction": {}, + "valueFilter": { + "selectedConcepts": [], + "type": "quantity-range", + "unit": { + "code": "g/dL", + "display": "g/dL" + }, + "minValue": 0, + "maxValue": 20 + } + } + ] + ] +} \ No newline at end of file diff --git a/troubleshooting/test-queries/test-patient.json b/troubleshooting/test-queries/test-patient.json new file mode 100644 index 0000000..fd520c5 --- /dev/null +++ b/troubleshooting/test-queries/test-patient.json @@ -0,0 +1,33 @@ +{ + "version": "http://to_be_decided.com/draft-1/schema#", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "gender", + "system": "mii.abide", + "display": "Geschlecht" + } + ], + "attributeFilters": [ + { + "type": "concept", + "selectedConcepts": [ + { + "code": "female", + "system": "http://hl7.org/fhir/administrative-gender", + "display": "Female" + } + ], + "attributeCode": { + "code": "gender", + "system": "mii.abide", + "display": "Geschlecht" + } + } + ] + } + ] + ] +} \ No newline at end of file diff --git a/troubleshooting/test-queries/test-procedure.json b/troubleshooting/test-queries/test-procedure.json new file mode 100644 index 0000000..dc7221d --- /dev/null +++ b/troubleshooting/test-queries/test-procedure.json @@ -0,0 +1,20 @@ +{ + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "3-990", + "system": "http://fhir.de/CodeSystem/bfarm/ops", + "version": "2021", + "display": "Computergestützte Bilddatenanalyse mit 3D-Auswertung" + } + ], + "attributeFilters": [], + "timeRestriction": {} + } + ] + ] +} \ No newline at end of file diff --git a/troubleshooting/test-queries/test-specimen.json b/troubleshooting/test-queries/test-specimen.json new file mode 100644 index 0000000..65b568f --- /dev/null +++ b/troubleshooting/test-queries/test-specimen.json @@ -0,0 +1,36 @@ +{ + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "119364003", + "system": "http://snomed.info/sct", + "version": "http://snomed.info/sct/900000000000207008/version/20210731", + "display": "Serum specimen (specimen)" + } + ], + "attributeFilters": [ + { + "selectedConcepts": [ + { + "code": "available", + "system": "http://hl7.org/fhir/specimen-status", + "display": "Available" + } + ], + "type": "concept", + "attributeCode": { + "code": "status", + "system": "mii.abide", + "display": "Status" + } + } + ], + "timeRestriction": {} + } + ] + ] +} \ No newline at end of file diff --git a/troubleshooting/troubleshooting.md b/troubleshooting/troubleshooting.md new file mode 100644 index 0000000..5734951 --- /dev/null +++ b/troubleshooting/troubleshooting.md @@ -0,0 +1,134 @@ +# + +## Troubleshooting AKTIN Connection + +To check if the aktin client is running use the command `docker logs -f abide-deploy_aktin-client_1` + +If it is running correctly it will display: +``` +INFO: websocket connection established +Mar 21, 2022 1:30:44 PM org.aktin.broker.client.live.sysproc.ProcessExecutionService run +INFO: websocket ping-pong delay set to 60s +``` + +If the container is not running follow these steps: + +Check if the aktin broker is currently available from your host: `curl https://aktin.forschen-fuer-gesundheit.de/broker/status` + +If the aktin client does not start up, add the following to the docker-compose.yml of the atkin client: +`entrypoint: sh -c "tail -f /dev/null"` and restart the container using `bash stop-node.sh`and `bash start-node.sh` + +Check if you can connect to the broker from within your docker container: + +`docker exec abide-deploy_aktin-client_1 sh -c "curl https://aktin.forschen-fuer-gesundheit.de/broker/status"` + +If you cannot connect to this endpoint, please check your proxy configurations. + +Other common errors invole the environment variables set. To check if they are correct: + +log in to the aktin container `docker exec -it abide-deploy_aktin-client_1 sh` and then execute `echo $`. +Note that you can find the name of your variable in the docker-compose.yml under environment. +If your variable is not set double check your .env file and if the env var is set and still not correct in the container directly +replace it in the docker-compose file, for example change, +from: +`BROKER_ENDPOINT_URI: ${CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI:-http://aktin-broker:8080/broker/}` +to: +`BROKER_ENDPOINT_URI: ' +``` + +You can extract a structured query from the `aktin-requests.log` once a request has been recieved by your system and send it to your local flare. + +this will give you an output, which contains the fhir search translation for each criterion in our Structured-Query, for example: + +The Structured-Query: +``` +curl --location --request POST 'http://localhost:8084/query/execute' \ +--header 'Content-Type: application/sq+json' \ +--data-raw '{ + "version": "http://to_be_decided.com/draft-1/schema#", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "gender", + "system": "mii.abide", + "display": "Geschlecht" + } + ], + "attributeFilters": [ + { + "type": "concept", + "selectedConcepts": [ + { + "code": "female", + "system": "http://hl7.org/fhir/administrative-gender", + "display": "Female" + } + ], + "attributeCode": { + "code": "gender", + "system": "mii.abide", + "display": "Geschlecht" + } + } + ] + } + ] + ] +}' +``` + +should give you an output similar to: + +``` +[[["http://fhir-server:8080/fhir/Patient?gender=female"]],[]] +``` + +The FHIR search string can then be used with your FHIR Server directly, to recieve the response from the server. +To use it the base url of the fhir server has to be replaced according to how you call the server from your system. +In our example: +Change `http://fhir-server:8080/fhir/Patient?gender=female` to `/Patient?gender=female` + +## Check if execution is correct and returns the expected results (manual) + + +To check if the execution is correct you can use the Flare execution endpoint /execute, which will execute the feasibility query on your FHIR server: + +``` +curl --location --request POST 'http://localhost:8084/query/execute' \ +--header 'Content-Type: application/sq+json' \ +--data-raw '' +``` + +Input for your structured query is identical to the input for the translation endpoint above. + +The return value should be a number >= 0 + From db72976d64993044a69095b79132d21be72e4807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 8 Apr 2022 10:14:34 +0200 Subject: [PATCH 002/118] rename folders, update docker image references and set restart policy --- README.md | 2 +- {zars => feasibility-portal}/.gitignore | 0 {zars => feasibility-portal}/README.md | 0 .../aktin-broker/api-keys.properties | 0 .../aktin-broker/docker-compose.yml | 0 .../auth/.gitkeep | 0 .../backend/docker-compose.yml | 4 +- {zars => feasibility-portal}/dsf-broker/.env | 0 .../dsf-broker}/bpe/app/last_event/.gitkeep | 0 .../dsf-broker/certs/ca.pem | 0 .../dsf-broker/certs/test-user.p12 | Bin .../dsf-broker/docker-compose.yml | 0 .../dsf-broker}/down.sh | 0 .../dsf-broker/fhir/app/conf/bundle.xml | 0 .../dsf-broker/proxy/nginx.conf | 0 .../dsf-broker/start.sh | 0 .../dsf-broker}/stop.sh | 0 .../gui/deploy-config.json | 0 .../gui/docker-compose.yml | 3 +- .../gui}/mime.types | 0 {zars => feasibility-portal}/gui/nginx.conf | 0 .../keycloak/docker-compose.yml | 8 +- .../keycloak/init/initial-realm-prod.json | 0 .../keycloak/keycloak-dump-deploy.json | 0 .../ontology/ui_profiles}/.gitkeep | 0 .../setup-base-auth.sh | 0 .../start-feasibility-local.sh | 0 {zars => feasibility-portal}/start-zars.sh | 0 {zars => feasibility-portal}/stop-zars.sh | 0 {num-node => feasibility-triangle}/.gitignore | 0 {num-node => feasibility-triangle}/README.md | 0 .../aktin-client/.env | 4 +- .../aktin-client/README.md | 0 .../aktin-client/aktin-requests.log | 0 .../client-exec-scripts/call-cql.sh | 0 .../client-exec-scripts/call-flare.sh | 0 .../aktin-client/client-exec-scripts/echo.sh | 0 .../client-exec-scripts/execute-cql.sh | 0 .../aktin-client/docker-compose.yml | 6 +- {zars => feasibility-triangle}/auth/.gitkeep | 0 .../down-triangle.sh | 0 .../dsf-client/.env | 0 .../dsf-client}/bpe/app/last_event/.gitkeep | 0 .../dsf-client/docker-compose.yml | 0 .../dsf-client}/down.sh | 0 .../dsf-client/fhir/app/conf/bundle.xml | 0 .../dsf-client/proxy/nginx.conf | 0 .../dsf-client/start.sh | 0 .../dsf-client}/stop.sh | 0 .../blaze-server/docker-compose.yml | 3 +- .../fhir-server/blaze-server/resetBlaze.sh | 0 .../fhir-server/hapi-fhir-server/README.md | 0 .../hapi-fhir-server/docker-compose.yml | 4 +- .../flare/docker-compose.yml | 3 +- .../init-testdata.sh | 0 .../ontology}/.gitkeep | 0 .../rev-proxy/add-nginx-user.sh | 0 .../rev-proxy/docker-compose.yml | 0 .../rev-proxy/generateCert.sh | 0 .../rev-proxy}/mime.types | 0 .../rev-proxy/nginx.conf | 0 .../rev-proxy/q_nginx_start.sh | 0 .../rev-proxy/reset-nginx.sh | 0 .../rev-proxy/setup-base-auth.sh | 0 .../setup-base-auth.sh | 0 .../start-triangle.sh | 0 .../stop-triangle.sh | 0 .../testdata/test-patient-all.json | 0 setup-all-base-auth.sh | 13 -- start-zars-and-num-node.sh | 138 ------------------ stop-zars-and-num-node.sh | 22 --- 71 files changed, 21 insertions(+), 189 deletions(-) rename {zars => feasibility-portal}/.gitignore (100%) rename {zars => feasibility-portal}/README.md (100%) rename {zars => feasibility-portal}/aktin-broker/api-keys.properties (100%) rename {zars => feasibility-portal}/aktin-broker/docker-compose.yml (100%) rename {num-node => feasibility-portal}/auth/.gitkeep (100%) rename {zars => feasibility-portal}/backend/docker-compose.yml (95%) rename {zars => feasibility-portal}/dsf-broker/.env (100%) rename {num-node/dsf-client => feasibility-portal/dsf-broker}/bpe/app/last_event/.gitkeep (100%) rename {zars => feasibility-portal}/dsf-broker/certs/ca.pem (100%) rename {zars => feasibility-portal}/dsf-broker/certs/test-user.p12 (100%) rename {zars => feasibility-portal}/dsf-broker/docker-compose.yml (100%) rename {num-node/dsf-client => feasibility-portal/dsf-broker}/down.sh (100%) rename {zars => feasibility-portal}/dsf-broker/fhir/app/conf/bundle.xml (100%) rename {zars => feasibility-portal}/dsf-broker/proxy/nginx.conf (100%) rename {zars => feasibility-portal}/dsf-broker/start.sh (100%) rename {num-node/dsf-client => feasibility-portal/dsf-broker}/stop.sh (100%) rename {zars => feasibility-portal}/gui/deploy-config.json (100%) rename {zars => feasibility-portal}/gui/docker-compose.yml (77%) rename {num-node/rev-proxy => feasibility-portal/gui}/mime.types (100%) rename {zars => feasibility-portal}/gui/nginx.conf (100%) rename {zars => feasibility-portal}/keycloak/docker-compose.yml (94%) rename {zars => feasibility-portal}/keycloak/init/initial-realm-prod.json (100%) rename {zars => feasibility-portal}/keycloak/keycloak-dump-deploy.json (100%) rename {num-node/ontology => feasibility-portal/ontology/ui_profiles}/.gitkeep (100%) rename {zars => feasibility-portal}/setup-base-auth.sh (100%) rename {zars => feasibility-portal}/start-feasibility-local.sh (100%) rename {zars => feasibility-portal}/start-zars.sh (100%) rename {zars => feasibility-portal}/stop-zars.sh (100%) rename {num-node => feasibility-triangle}/.gitignore (100%) rename {num-node => feasibility-triangle}/README.md (100%) rename {num-node => feasibility-triangle}/aktin-client/.env (93%) rename {num-node => feasibility-triangle}/aktin-client/README.md (100%) rename {num-node => feasibility-triangle}/aktin-client/aktin-requests.log (100%) rename {num-node => feasibility-triangle}/aktin-client/client-exec-scripts/call-cql.sh (100%) rename {num-node => feasibility-triangle}/aktin-client/client-exec-scripts/call-flare.sh (100%) rename {num-node => feasibility-triangle}/aktin-client/client-exec-scripts/echo.sh (100%) rename {num-node => feasibility-triangle}/aktin-client/client-exec-scripts/execute-cql.sh (100%) rename {num-node => feasibility-triangle}/aktin-client/docker-compose.yml (90%) rename {zars => feasibility-triangle}/auth/.gitkeep (100%) rename num-node/down-node.sh => feasibility-triangle/down-triangle.sh (100%) rename {num-node => feasibility-triangle}/dsf-client/.env (100%) rename {zars/dsf-broker => feasibility-triangle/dsf-client}/bpe/app/last_event/.gitkeep (100%) rename {num-node => feasibility-triangle}/dsf-client/docker-compose.yml (100%) rename {zars/dsf-broker => feasibility-triangle/dsf-client}/down.sh (100%) rename {num-node => feasibility-triangle}/dsf-client/fhir/app/conf/bundle.xml (100%) rename {num-node => feasibility-triangle}/dsf-client/proxy/nginx.conf (100%) rename {num-node => feasibility-triangle}/dsf-client/start.sh (100%) rename {zars/dsf-broker => feasibility-triangle/dsf-client}/stop.sh (100%) rename {num-node => feasibility-triangle}/fhir-server/blaze-server/docker-compose.yml (77%) rename {num-node => feasibility-triangle}/fhir-server/blaze-server/resetBlaze.sh (100%) rename {num-node => feasibility-triangle}/fhir-server/hapi-fhir-server/README.md (100%) rename {num-node => feasibility-triangle}/fhir-server/hapi-fhir-server/docker-compose.yml (93%) rename {num-node => feasibility-triangle}/flare/docker-compose.yml (91%) rename {num-node => feasibility-triangle}/init-testdata.sh (100%) rename {zars/ontology/ui_profiles => feasibility-triangle/ontology}/.gitkeep (100%) rename {num-node => feasibility-triangle}/rev-proxy/add-nginx-user.sh (100%) rename {num-node => feasibility-triangle}/rev-proxy/docker-compose.yml (100%) rename {num-node => feasibility-triangle}/rev-proxy/generateCert.sh (100%) rename {zars/gui => feasibility-triangle/rev-proxy}/mime.types (100%) rename {num-node => feasibility-triangle}/rev-proxy/nginx.conf (100%) rename {num-node => feasibility-triangle}/rev-proxy/q_nginx_start.sh (100%) rename {num-node => feasibility-triangle}/rev-proxy/reset-nginx.sh (100%) rename {num-node => feasibility-triangle}/rev-proxy/setup-base-auth.sh (100%) rename {num-node => feasibility-triangle}/setup-base-auth.sh (100%) rename num-node/start-node.sh => feasibility-triangle/start-triangle.sh (100%) rename num-node/stop-node.sh => feasibility-triangle/stop-triangle.sh (100%) rename {num-node => feasibility-triangle}/testdata/test-patient-all.json (100%) delete mode 100755 setup-all-base-auth.sh delete mode 100755 start-zars-and-num-node.sh delete mode 100755 stop-zars-and-num-node.sh diff --git a/README.md b/README.md index 3ab4a2e..f7d3782 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![CI](https://github.com/num-codex/codex-deploy/actions/workflows/ci.yml/badge.svg) -# codex-deploy +# Feasibility Deploy This codex deployment Repo offers an example deployment repository using Docker-compose and official codex images to setup an example environment. diff --git a/zars/.gitignore b/feasibility-portal/.gitignore similarity index 100% rename from zars/.gitignore rename to feasibility-portal/.gitignore diff --git a/zars/README.md b/feasibility-portal/README.md similarity index 100% rename from zars/README.md rename to feasibility-portal/README.md diff --git a/zars/aktin-broker/api-keys.properties b/feasibility-portal/aktin-broker/api-keys.properties similarity index 100% rename from zars/aktin-broker/api-keys.properties rename to feasibility-portal/aktin-broker/api-keys.properties diff --git a/zars/aktin-broker/docker-compose.yml b/feasibility-portal/aktin-broker/docker-compose.yml similarity index 100% rename from zars/aktin-broker/docker-compose.yml rename to feasibility-portal/aktin-broker/docker-compose.yml diff --git a/num-node/auth/.gitkeep b/feasibility-portal/auth/.gitkeep similarity index 100% rename from num-node/auth/.gitkeep rename to feasibility-portal/auth/.gitkeep diff --git a/zars/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml similarity index 95% rename from zars/backend/docker-compose.yml rename to feasibility-portal/backend/docker-compose.yml index 8cddce9..f57276a 100644 --- a/zars/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: zars-feasibility-gui-backend: - image: ghcr.io/num-codex/codex-feasibility-backend:1.0.4-RC8 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:1.0.4 ports: - ${CODEX_FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -31,6 +31,7 @@ services: DSF_WEBSERVICE_BASE_URL: "https://dsf-zars-fhir-proxy/fhir" DSF_WEBSOCKET_URL: "wss://dsf-zars-fhir-proxy:443/fhir/ws" DSF_ORGANIZATION_ID: "Test_ZARS" + restart: unless-stopped volumes: - ${CODEX_FEASIBILITY_BACKEND_UI_PROFILES_PATH:-../ontology/ui_profiles}:/opt/codex-feasibility-backend/ontology/ui_profiles - ${CODEX_FEASIBILITY_BACKEND_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:/opt/codex-feasibility-backend/ontology/conceptTree.json @@ -45,3 +46,4 @@ services: POSTGRES_USER: ${CODEX_FEASIBILITY_BACKEND_DATASOURCE_USERNAME:-codex-postgres} POSTGRES_PASSWORD: ${CODEX_FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-codex-password} POSTGRES_DB: codex_ui + restart: unless-stopped diff --git a/zars/dsf-broker/.env b/feasibility-portal/dsf-broker/.env similarity index 100% rename from zars/dsf-broker/.env rename to feasibility-portal/dsf-broker/.env diff --git a/num-node/dsf-client/bpe/app/last_event/.gitkeep b/feasibility-portal/dsf-broker/bpe/app/last_event/.gitkeep similarity index 100% rename from num-node/dsf-client/bpe/app/last_event/.gitkeep rename to feasibility-portal/dsf-broker/bpe/app/last_event/.gitkeep diff --git a/zars/dsf-broker/certs/ca.pem b/feasibility-portal/dsf-broker/certs/ca.pem similarity index 100% rename from zars/dsf-broker/certs/ca.pem rename to feasibility-portal/dsf-broker/certs/ca.pem diff --git a/zars/dsf-broker/certs/test-user.p12 b/feasibility-portal/dsf-broker/certs/test-user.p12 similarity index 100% rename from zars/dsf-broker/certs/test-user.p12 rename to feasibility-portal/dsf-broker/certs/test-user.p12 diff --git a/zars/dsf-broker/docker-compose.yml b/feasibility-portal/dsf-broker/docker-compose.yml similarity index 100% rename from zars/dsf-broker/docker-compose.yml rename to feasibility-portal/dsf-broker/docker-compose.yml diff --git a/num-node/dsf-client/down.sh b/feasibility-portal/dsf-broker/down.sh similarity index 100% rename from num-node/dsf-client/down.sh rename to feasibility-portal/dsf-broker/down.sh diff --git a/zars/dsf-broker/fhir/app/conf/bundle.xml b/feasibility-portal/dsf-broker/fhir/app/conf/bundle.xml similarity index 100% rename from zars/dsf-broker/fhir/app/conf/bundle.xml rename to feasibility-portal/dsf-broker/fhir/app/conf/bundle.xml diff --git a/zars/dsf-broker/proxy/nginx.conf b/feasibility-portal/dsf-broker/proxy/nginx.conf similarity index 100% rename from zars/dsf-broker/proxy/nginx.conf rename to feasibility-portal/dsf-broker/proxy/nginx.conf diff --git a/zars/dsf-broker/start.sh b/feasibility-portal/dsf-broker/start.sh similarity index 100% rename from zars/dsf-broker/start.sh rename to feasibility-portal/dsf-broker/start.sh diff --git a/num-node/dsf-client/stop.sh b/feasibility-portal/dsf-broker/stop.sh similarity index 100% rename from num-node/dsf-client/stop.sh rename to feasibility-portal/dsf-broker/stop.sh diff --git a/zars/gui/deploy-config.json b/feasibility-portal/gui/deploy-config.json similarity index 100% rename from zars/gui/deploy-config.json rename to feasibility-portal/gui/deploy-config.json diff --git a/zars/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml similarity index 77% rename from zars/gui/docker-compose.yml rename to feasibility-portal/gui/docker-compose.yml index cf76365..0f09da5 100644 --- a/zars/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,8 +1,9 @@ services: zars-feasibility-gui: - image: ghcr.io/num-codex/codex-feasibility-gui:0.2.0_RC9 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.2.0_RC10 ports: - "443:8443" + restart: unless-stopped volumes: - ../auth/cert.pem:/etc/nginx/conf.d/cert.pem - ../auth/key.pem:/etc/nginx/conf.d/key.pem diff --git a/num-node/rev-proxy/mime.types b/feasibility-portal/gui/mime.types similarity index 100% rename from num-node/rev-proxy/mime.types rename to feasibility-portal/gui/mime.types diff --git a/zars/gui/nginx.conf b/feasibility-portal/gui/nginx.conf similarity index 100% rename from zars/gui/nginx.conf rename to feasibility-portal/gui/nginx.conf diff --git a/zars/keycloak/docker-compose.yml b/feasibility-portal/keycloak/docker-compose.yml similarity index 94% rename from zars/keycloak/docker-compose.yml rename to feasibility-portal/keycloak/docker-compose.yml index e8c4e88..f750495 100644 --- a/zars/keycloak/docker-compose.yml +++ b/feasibility-portal/keycloak/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.7" services: - db: + auth-db: container_name: codexkeycloakdb image: postgres:14-alpine restart: unless-stopped @@ -18,7 +18,7 @@ services: restart: unless-stopped environment: DB_VENDOR: POSTGRES - DB_ADDR: db + DB_ADDR: auth-db DB_DATABASE: keycloak DB_USER: keycloak DB_SCHEMA: public @@ -33,7 +33,7 @@ services: - ../auth/cert.pem:/etc/x509/https/tls.crt - ../auth/key.pem:/etc/x509/https/tls.key depends_on: - - db + - auth-db volumes: - db: + auth-db: diff --git a/zars/keycloak/init/initial-realm-prod.json b/feasibility-portal/keycloak/init/initial-realm-prod.json similarity index 100% rename from zars/keycloak/init/initial-realm-prod.json rename to feasibility-portal/keycloak/init/initial-realm-prod.json diff --git a/zars/keycloak/keycloak-dump-deploy.json b/feasibility-portal/keycloak/keycloak-dump-deploy.json similarity index 100% rename from zars/keycloak/keycloak-dump-deploy.json rename to feasibility-portal/keycloak/keycloak-dump-deploy.json diff --git a/num-node/ontology/.gitkeep b/feasibility-portal/ontology/ui_profiles/.gitkeep similarity index 100% rename from num-node/ontology/.gitkeep rename to feasibility-portal/ontology/ui_profiles/.gitkeep diff --git a/zars/setup-base-auth.sh b/feasibility-portal/setup-base-auth.sh similarity index 100% rename from zars/setup-base-auth.sh rename to feasibility-portal/setup-base-auth.sh diff --git a/zars/start-feasibility-local.sh b/feasibility-portal/start-feasibility-local.sh similarity index 100% rename from zars/start-feasibility-local.sh rename to feasibility-portal/start-feasibility-local.sh diff --git a/zars/start-zars.sh b/feasibility-portal/start-zars.sh similarity index 100% rename from zars/start-zars.sh rename to feasibility-portal/start-zars.sh diff --git a/zars/stop-zars.sh b/feasibility-portal/stop-zars.sh similarity index 100% rename from zars/stop-zars.sh rename to feasibility-portal/stop-zars.sh diff --git a/num-node/.gitignore b/feasibility-triangle/.gitignore similarity index 100% rename from num-node/.gitignore rename to feasibility-triangle/.gitignore diff --git a/num-node/README.md b/feasibility-triangle/README.md similarity index 100% rename from num-node/README.md rename to feasibility-triangle/README.md diff --git a/num-node/aktin-client/.env b/feasibility-triangle/aktin-client/.env similarity index 93% rename from num-node/aktin-client/.env rename to feasibility-triangle/aktin-client/.env index a4d57b1..766be7b 100644 --- a/num-node/aktin-client/.env +++ b/feasibility-triangle/aktin-client/.env @@ -12,6 +12,6 @@ CODEX_FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS=10 CODEX_FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL=http://node-flare:8080 CODEX_FEASIBILITY_AKTIN_CLIENT_OBFUSCATE=true JAVA_OPTS= -AKTIN_CLIENT_AUTH_USER= -AKTIN_CLIENT_AUTH_PW= +AKTIN_CLIENT_FHIR_AUTH_USER= +AKTIN_CLIENT_FHIR_AUTH_PW= AKTIN_FHIR_BASE_URL= \ No newline at end of file diff --git a/num-node/aktin-client/README.md b/feasibility-triangle/aktin-client/README.md similarity index 100% rename from num-node/aktin-client/README.md rename to feasibility-triangle/aktin-client/README.md diff --git a/num-node/aktin-client/aktin-requests.log b/feasibility-triangle/aktin-client/aktin-requests.log similarity index 100% rename from num-node/aktin-client/aktin-requests.log rename to feasibility-triangle/aktin-client/aktin-requests.log diff --git a/num-node/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh similarity index 100% rename from num-node/aktin-client/client-exec-scripts/call-cql.sh rename to feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh diff --git a/num-node/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh similarity index 100% rename from num-node/aktin-client/client-exec-scripts/call-flare.sh rename to feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh diff --git a/num-node/aktin-client/client-exec-scripts/echo.sh b/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh similarity index 100% rename from num-node/aktin-client/client-exec-scripts/echo.sh rename to feasibility-triangle/aktin-client/client-exec-scripts/echo.sh diff --git a/num-node/aktin-client/client-exec-scripts/execute-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh similarity index 100% rename from num-node/aktin-client/client-exec-scripts/execute-cql.sh rename to feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh diff --git a/num-node/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml similarity index 90% rename from num-node/aktin-client/docker-compose.yml rename to feasibility-triangle/aktin-client/docker-compose.yml index 7784231..4251b2c 100644 --- a/num-node/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/num-codex/aktin-client:1.3.4 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.3.5-RC4 environment: BROKER_REQUEST_MEDIATYPE: ${CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} @@ -17,8 +17,8 @@ services: FLARE_BASE_URL: ${CODEX_FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL:-http://node-flare:8080} CLIENT_OBFUSCATE: ${CODEX_FEASIBILITY_AKTIN_CLIENT_OBFUSCATE:-true} JAVA_OPTS: $JAVA_OPTS - AUTH_USER: ${AKTIN_CLIENT_AUTH_USER:-} - AUTH_PW: ${AKTIN_CLIENT_AUTH_PW:-} + AUTH_USER: ${AKTIN_CLIENT_FHIR_AUTH_USER:-} + AUTH_PW: ${AKTIN_CLIENT_FHIR_AUTH_PW:-} FHIR_BASE_URL: ${AKTIN_FHIR_BASE_URL:-http://fhir-server:8080/fhir} volumes: - ./client-exec-scripts/echo.sh:/opt/aktin/echo.sh diff --git a/zars/auth/.gitkeep b/feasibility-triangle/auth/.gitkeep similarity index 100% rename from zars/auth/.gitkeep rename to feasibility-triangle/auth/.gitkeep diff --git a/num-node/down-node.sh b/feasibility-triangle/down-triangle.sh similarity index 100% rename from num-node/down-node.sh rename to feasibility-triangle/down-triangle.sh diff --git a/num-node/dsf-client/.env b/feasibility-triangle/dsf-client/.env similarity index 100% rename from num-node/dsf-client/.env rename to feasibility-triangle/dsf-client/.env diff --git a/zars/dsf-broker/bpe/app/last_event/.gitkeep b/feasibility-triangle/dsf-client/bpe/app/last_event/.gitkeep similarity index 100% rename from zars/dsf-broker/bpe/app/last_event/.gitkeep rename to feasibility-triangle/dsf-client/bpe/app/last_event/.gitkeep diff --git a/num-node/dsf-client/docker-compose.yml b/feasibility-triangle/dsf-client/docker-compose.yml similarity index 100% rename from num-node/dsf-client/docker-compose.yml rename to feasibility-triangle/dsf-client/docker-compose.yml diff --git a/zars/dsf-broker/down.sh b/feasibility-triangle/dsf-client/down.sh similarity index 100% rename from zars/dsf-broker/down.sh rename to feasibility-triangle/dsf-client/down.sh diff --git a/num-node/dsf-client/fhir/app/conf/bundle.xml b/feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml similarity index 100% rename from num-node/dsf-client/fhir/app/conf/bundle.xml rename to feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml diff --git a/num-node/dsf-client/proxy/nginx.conf b/feasibility-triangle/dsf-client/proxy/nginx.conf similarity index 100% rename from num-node/dsf-client/proxy/nginx.conf rename to feasibility-triangle/dsf-client/proxy/nginx.conf diff --git a/num-node/dsf-client/start.sh b/feasibility-triangle/dsf-client/start.sh similarity index 100% rename from num-node/dsf-client/start.sh rename to feasibility-triangle/dsf-client/start.sh diff --git a/zars/dsf-broker/stop.sh b/feasibility-triangle/dsf-client/stop.sh similarity index 100% rename from zars/dsf-broker/stop.sh rename to feasibility-triangle/dsf-client/stop.sh diff --git a/num-node/fhir-server/blaze-server/docker-compose.yml b/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml similarity index 77% rename from num-node/fhir-server/blaze-server/docker-compose.yml rename to feasibility-triangle/fhir-server/blaze-server/docker-compose.yml index cf144b8..fca8279 100644 --- a/num-node/fhir-server/blaze-server/docker-compose.yml +++ b/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml @@ -1,13 +1,14 @@ version: '3.7' services: fhir-server: - image: ghcr.io/num-codex/blaze:0.16 + image: ghcr.io/medizininformatik-initiative/blaze:0.16 environment: BASE_URL: "http://fhir-server:8080" JAVA_TOOL_OPTIONS: ${CODEX_FHIR_SERVER_JVM_ARGS:--Xmx4g} LOG_LEVEL: debug ports: - ${PORT_BLAZE_FHIR:-127.0.0.1:8081}:8080 + restart: unless-stopped volumes: - "blaze-data:/app/data" diff --git a/num-node/fhir-server/blaze-server/resetBlaze.sh b/feasibility-triangle/fhir-server/blaze-server/resetBlaze.sh similarity index 100% rename from num-node/fhir-server/blaze-server/resetBlaze.sh rename to feasibility-triangle/fhir-server/blaze-server/resetBlaze.sh diff --git a/num-node/fhir-server/hapi-fhir-server/README.md b/feasibility-triangle/fhir-server/hapi-fhir-server/README.md similarity index 100% rename from num-node/fhir-server/hapi-fhir-server/README.md rename to feasibility-triangle/fhir-server/hapi-fhir-server/README.md diff --git a/num-node/fhir-server/hapi-fhir-server/docker-compose.yml b/feasibility-triangle/fhir-server/hapi-fhir-server/docker-compose.yml similarity index 93% rename from num-node/fhir-server/hapi-fhir-server/docker-compose.yml rename to feasibility-triangle/fhir-server/hapi-fhir-server/docker-compose.yml index 968803b..2160c3e 100644 --- a/num-node/fhir-server/hapi-fhir-server/docker-compose.yml +++ b/feasibility-triangle/fhir-server/hapi-fhir-server/docker-compose.yml @@ -4,7 +4,7 @@ services: fhir-server: container_name: fhir-server image: hapiproject/hapi:v5.4.1 - restart: always + restart: unless-stopped ports: - ${PORT_HAPI_FHIR:-127.0.0.1:8081}:8080 environment: @@ -21,7 +21,7 @@ services: db: container_name: hapidb image: postgres:12.6-alpine - restart: always + restart: unless-stopped environment: POSTGRES_PASSWORD: postgres POSTGRES_DB: fhir diff --git a/num-node/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml similarity index 91% rename from num-node/flare/docker-compose.yml rename to feasibility-triangle/flare/docker-compose.yml index 894643e..766a26d 100644 --- a/num-node/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: node-flare: - image: ghcr.io/rwth-imi/flare-query:1.0-rc8 + image: ghcr.io/rwth-imi/flare-query:1.0-rc11 ports: - ${NUM_NODE_PORT_FLARE:-127.0.0.1:8084}:8080 environment: @@ -11,6 +11,7 @@ services: FLARE_FHIR_PW: ${FLARE_FHIR_PW:-} MAPPINGS_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json CONCEPT_TREE_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json + restart: unless-stopped volumes: - ${FLARE_LOCAL_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json - ${FLARE_LOCAL_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json diff --git a/num-node/init-testdata.sh b/feasibility-triangle/init-testdata.sh similarity index 100% rename from num-node/init-testdata.sh rename to feasibility-triangle/init-testdata.sh diff --git a/zars/ontology/ui_profiles/.gitkeep b/feasibility-triangle/ontology/.gitkeep similarity index 100% rename from zars/ontology/ui_profiles/.gitkeep rename to feasibility-triangle/ontology/.gitkeep diff --git a/num-node/rev-proxy/add-nginx-user.sh b/feasibility-triangle/rev-proxy/add-nginx-user.sh similarity index 100% rename from num-node/rev-proxy/add-nginx-user.sh rename to feasibility-triangle/rev-proxy/add-nginx-user.sh diff --git a/num-node/rev-proxy/docker-compose.yml b/feasibility-triangle/rev-proxy/docker-compose.yml similarity index 100% rename from num-node/rev-proxy/docker-compose.yml rename to feasibility-triangle/rev-proxy/docker-compose.yml diff --git a/num-node/rev-proxy/generateCert.sh b/feasibility-triangle/rev-proxy/generateCert.sh similarity index 100% rename from num-node/rev-proxy/generateCert.sh rename to feasibility-triangle/rev-proxy/generateCert.sh diff --git a/zars/gui/mime.types b/feasibility-triangle/rev-proxy/mime.types similarity index 100% rename from zars/gui/mime.types rename to feasibility-triangle/rev-proxy/mime.types diff --git a/num-node/rev-proxy/nginx.conf b/feasibility-triangle/rev-proxy/nginx.conf similarity index 100% rename from num-node/rev-proxy/nginx.conf rename to feasibility-triangle/rev-proxy/nginx.conf diff --git a/num-node/rev-proxy/q_nginx_start.sh b/feasibility-triangle/rev-proxy/q_nginx_start.sh similarity index 100% rename from num-node/rev-proxy/q_nginx_start.sh rename to feasibility-triangle/rev-proxy/q_nginx_start.sh diff --git a/num-node/rev-proxy/reset-nginx.sh b/feasibility-triangle/rev-proxy/reset-nginx.sh similarity index 100% rename from num-node/rev-proxy/reset-nginx.sh rename to feasibility-triangle/rev-proxy/reset-nginx.sh diff --git a/num-node/rev-proxy/setup-base-auth.sh b/feasibility-triangle/rev-proxy/setup-base-auth.sh similarity index 100% rename from num-node/rev-proxy/setup-base-auth.sh rename to feasibility-triangle/rev-proxy/setup-base-auth.sh diff --git a/num-node/setup-base-auth.sh b/feasibility-triangle/setup-base-auth.sh similarity index 100% rename from num-node/setup-base-auth.sh rename to feasibility-triangle/setup-base-auth.sh diff --git a/num-node/start-node.sh b/feasibility-triangle/start-triangle.sh similarity index 100% rename from num-node/start-node.sh rename to feasibility-triangle/start-triangle.sh diff --git a/num-node/stop-node.sh b/feasibility-triangle/stop-triangle.sh similarity index 100% rename from num-node/stop-node.sh rename to feasibility-triangle/stop-triangle.sh diff --git a/num-node/testdata/test-patient-all.json b/feasibility-triangle/testdata/test-patient-all.json similarity index 100% rename from num-node/testdata/test-patient-all.json rename to feasibility-triangle/testdata/test-patient-all.json diff --git a/setup-all-base-auth.sh b/setup-all-base-auth.sh deleted file mode 100755 index 1b4b6aa..0000000 --- a/setup-all-base-auth.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env sh - -BASE_DIR=$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P ) - -if [ -z "$1" ] && [ -z "$2" ]; then - echo "please provide a username and password" - echo "setup-all-base-auth.sh " - exit -fi - -cd num-node -sh $BASE_DIR/num-node/setup-base-auth.sh $1 $2 -sh $BASE_DIR/zars/setup-base-auth.sh diff --git a/start-zars-and-num-node.sh b/start-zars-and-num-node.sh deleted file mode 100755 index 2ceb7fa..0000000 --- a/start-zars-and-num-node.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env sh - -# Globals -COMPOSE_PROJECT=codex-deploy - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" - -# Globals -COMPOSE_PROJECT=codex-deploy - -# Option Defaults -MIDDLEWARE_TYPE=AKTIN -FHIR_SERVER_TYPE=BLAZE -QUERY_FORMAT=STRUCTURED -OBFUSCATE=true - - -usage() { - cat </dev/null 2>&1 ; pwd -P )" - -printf "Stopping ZARS components ..." -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/keycloak/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/flare/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/backend/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/gui/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/aktin-broker/docker-compose.yml stop -sh $BASE_DIR/zars/dsf-broker/stop.sh $COMPOSE_PROJECT - - -printf "Stopping Num-Node components" -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/aktin-client/docker-compose.yml stop -bash $BASE_DIR/num-node/dsf-client/stop.sh $COMPOSE_PROJECT -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/flare/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/fhir-server/blaze-server/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/fhir-server/hapi-fhir-server/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/rev-proxy/docker-compose.yml stop From 8b6a8f084e250077144f30a5be6e358bca5ebba5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 8 Apr 2022 13:05:33 +0200 Subject: [PATCH 003/118] add .env to all feasibility triangle folders for config, fix flare forward in nginx, rename folders and names of containers --- feasibility-triangle/aktin-client/.env | 34 ++++++------ .../aktin-client/docker-compose.yml | 34 ++++++------ feasibility-triangle/auth/.htpasswd | 2 + feasibility-triangle/auth/cert.pem | 29 +++++++++++ feasibility-triangle/auth/key.pem | 52 +++++++++++++++++++ .../fhir-server/blaze-server/.env | 7 +++ .../blaze-server/docker-compose.yml | 11 ++-- feasibility-triangle/flare/.env | 8 +++ feasibility-triangle/flare/docker-compose.yml | 10 ++-- .../resetBlaze.sh => reset-fhir-server.sh} | 5 +- feasibility-triangle/rev-proxy/.env | 1 + .../rev-proxy/docker-compose.yml | 6 +-- feasibility-triangle/rev-proxy/nginx.conf | 2 +- feasibility-triangle/start-triangle.sh | 4 +- 14 files changed, 154 insertions(+), 51 deletions(-) create mode 100644 feasibility-triangle/auth/.htpasswd create mode 100644 feasibility-triangle/auth/cert.pem create mode 100644 feasibility-triangle/auth/key.pem create mode 100644 feasibility-triangle/fhir-server/blaze-server/.env create mode 100644 feasibility-triangle/flare/.env rename feasibility-triangle/{fhir-server/blaze-server/resetBlaze.sh => reset-fhir-server.sh} (76%) create mode 100644 feasibility-triangle/rev-proxy/.env diff --git a/feasibility-triangle/aktin-client/.env b/feasibility-triangle/aktin-client/.env index 766be7b..cd0dcbb 100644 --- a/feasibility-triangle/aktin-client/.env +++ b/feasibility-triangle/aktin-client/.env @@ -1,17 +1,17 @@ -CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE=application/sq+json -CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE=application/json -CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI=http://aktin-broker:8080/broker/ -CODEX_FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS=org.aktin.broker.client2.auth.ApiKeyAuthentication -CODEX_FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM=xxxApiKey123 -CLIENT_WEBSOCKET_PING_SECONDS=60 -CODEX_FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS=10 -CODEX_FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING=false -CODEX_FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS=60 -CODEX_FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND=/opt/aktin/call-flare.sh -CODEX_FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS=10 -CODEX_FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL=http://node-flare:8080 -CODEX_FEASIBILITY_AKTIN_CLIENT_OBFUSCATE=true -JAVA_OPTS= -AKTIN_CLIENT_FHIR_AUTH_USER= -AKTIN_CLIENT_FHIR_AUTH_PW= -AKTIN_FHIR_BASE_URL= \ No newline at end of file +FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE=application/sq+json +FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE=application/json +FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI=https://aktin.forschen-fuer-gesundheit.de/broker/ +FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS=org.aktin.broker.client2.auth.ApiKeyAuthentication +FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM=GD4qAWNCOfNW1y1ARBR2-eIV2mQiCzBn4UuyqKM0IyVbkYt_-P10-Zm3L0zTkh8_6t7nCi +FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS=60 +FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS=10 +FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING=true +FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS=60 +FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND=/opt/aktin/call-flare.sh +FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS=10 +FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL=http://flare:8080 +FEASIBILITY_AKTIN_CLIENT_OBFUSCATE=true +FEASIBILITY_AKTIN_JAVA_OPTS= +FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER= +FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW= +FEASIBILITY_AKTIN_FHIR_BASE_URL=http://fhir-server:8080/fhir \ No newline at end of file diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 4251b2c..1f0d56c 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -3,23 +3,23 @@ services: aktin-client: image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.3.5-RC4 environment: - BROKER_REQUEST_MEDIATYPE: ${CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} - BROKER_RESULT_MEDIATYPE: ${CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} - BROKER_ENDPOINT_URI: ${CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI:-http://aktin-broker:8080/broker/} - CLIENT_AUTH_CLASS: ${CODEX_FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS:-org.aktin.broker.client2.auth.ApiKeyAuthentication} - CLIENT_AUTH_PARAM: ${CODEX_FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM:-xxxApiKey123} - CLIENT_WEBSOCKET_PING_SECONDS: ${CLIENT_WEBSOCKET_PING_SECONDS:-60} - CLIENT_WEBSOCKET_RECONNECT_SECONDS: ${CODEX_FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS:-10} - CLIENT_WEBSOCKET_RECONNECT_POLLING: ${CODEX_FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING:-true} - PROCESS_TIMEOUT_SECONDS: ${CODEX_FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS:-60} - PROCESS_COMMAND: ${CODEX_FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND:-/opt/aktin/call-flare.sh} - PROCESS_ARGS: ${CODEX_FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS:-10} - FLARE_BASE_URL: ${CODEX_FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL:-http://node-flare:8080} - CLIENT_OBFUSCATE: ${CODEX_FEASIBILITY_AKTIN_CLIENT_OBFUSCATE:-true} - JAVA_OPTS: $JAVA_OPTS - AUTH_USER: ${AKTIN_CLIENT_FHIR_AUTH_USER:-} - AUTH_PW: ${AKTIN_CLIENT_FHIR_AUTH_PW:-} - FHIR_BASE_URL: ${AKTIN_FHIR_BASE_URL:-http://fhir-server:8080/fhir} + BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} + BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} + BROKER_ENDPOINT_URI: ${FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI:-http://aktin-broker:8080/broker/} + CLIENT_AUTH_CLASS: ${FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS:-org.aktin.broker.client2.auth.ApiKeyAuthentication} + CLIENT_AUTH_PARAM: ${FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM:-xxxApiKey123} + CLIENT_WEBSOCKET_PING_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS:-60} + CLIENT_WEBSOCKET_RECONNECT_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS:-10} + CLIENT_WEBSOCKET_RECONNECT_POLLING: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING:-true} + PROCESS_TIMEOUT_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS:-60} + PROCESS_COMMAND: ${FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND:-/opt/aktin/call-flare.sh} + PROCESS_ARGS: ${FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS:-10} + FLARE_BASE_URL: ${FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL:-http://node-flare:8080} + CLIENT_OBFUSCATE: ${FEASIBILITY_AKTIN_CLIENT_OBFUSCATE:-true} + JAVA_OPTS: $FEASIBILITY_AKTIN_JAVA_OPTS + AUTH_USER: ${FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER:-} + AUTH_PW: ${FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW:-} + FHIR_BASE_URL: ${FEASIBILITY_AKTIN_FHIR_BASE_URL:-http://fhir-server:8080/fhir} volumes: - ./client-exec-scripts/echo.sh:/opt/aktin/echo.sh - ./client-exec-scripts/call-cql.sh:/opt/aktin/call-cql.sh diff --git a/feasibility-triangle/auth/.htpasswd b/feasibility-triangle/auth/.htpasswd new file mode 100644 index 0000000..1892a9f --- /dev/null +++ b/feasibility-triangle/auth/.htpasswd @@ -0,0 +1,2 @@ +test:$apr1$ZEdOKNC0$NrUNcaOicIaBp7RMH8QK50 + diff --git a/feasibility-triangle/auth/cert.pem b/feasibility-triangle/auth/cert.pem new file mode 100644 index 0000000..6de0775 --- /dev/null +++ b/feasibility-triangle/auth/cert.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCzCCAvOgAwIBAgIUDLNue2iDe6A2flVGsUdUVAHyEYowDQYJKoZIhvcNAQEL +BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTIxMTIwOTE1NTkyMFoYDzIyOTUw +OTIzMTU1OTIwWjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDxxvb0q5qaOJdNc5AvZaEY0KWEtLzSwVRzSKkpbFPT +JnV67IT27XJqHdIbBG+T89TuAzXQqveQtHBQoDAVWuFk8n21vQpfaV0blM5p7wik +NywS/E1DGVvSCv6NVTHJCDQiKYuWv7g7bIM9S28ywNPuepCY22Xk4LtD0eXwyf00 +2iu8hoBMIHnZmQ0MUr8dCMwWLJ06/6iCZdWBJxCUQooVJ1wwDueN4XKSqxkZjWeZ +u7ucrpaAv8EmceqlEYzuAV2USZ70YkTQQkNezRz8Y4z0qzAfhNb1L1V6CmTf4/al +eua93aj2/vKN4sZpUmnYNTleTKRphmNlAZJKduM1at2l19NY6Cnfo8LG0SD0huLe +Lh8gbzhjE0fxkRaaYEQnjbfnTOVmbShr5k83uZdWmK3d5BlP4yeuO4d1ToHkdaBf +vbdDC8vvyASKt95A5TlQIc1U4Apxd7k6Jq1MOs050Ttkh6nhoCEah4e4N+Va2Dbf +FeHQsqj8yJ1n0/o0nmAfQXkEv/cZejIMcsr8A4mjme6gb+VOgGdUy/XrW/1gMrx6 +JlOvSq4AJnC8r5K4BkHSpM8Eu1YMgAj8yoxYBjnMmddNqcqb9zJUq771NSvpCtmQ +MoLsGLWKqynRfxKyYa8WKCmhByYGvnJOIsL6wpamLpPXyFLU9tsbn+SZonsppxNV +kQIDAQABo1MwUTAdBgNVHQ4EFgQUFtb7LDGg6gXd6Ugj93E6TlHX2zQwHwYDVR0j +BBgwFoAUFtb7LDGg6gXd6Ugj93E6TlHX2zQwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQsFAAOCAgEAFaSJpyAn/wSG6MJChpuykArnHQOzWB3QLpHesJ+Gv6FE +3Vwwy2UuaB7QEywA9Dwrysci2GRByzfOMDMjop2BfqUnOtsIOFHpAQGdUcge6nLA +3NtUFJ7etnO3xjrVBWHVZmvxur1zqrxHl5r4QVtAj07WU9BX5EEvv1JKuZmOn0ak +AQJ2skANXLZSZoAND5S/tUsoMrkMW4t0+/VEFVNu/FMa0IYHsWDpOLl+R6pSlXXr +T0Kb6NoHKbiRfhHtIK+tIU4h6FmpX0f0MsOKB+cM/5KAWTL2pMykpugr52Sc8UwW +qHgZRYok6XaEDU15Tky7zBcFELB2UOx6m+dp1zlhEeFP3vMbGvMepaRifO9y1IZ6 +KDrxwlRJUT+umRk07W91Cfsnqmox19rKZfsTM3Ornj7rqT8vzprtw9TV8IYeaaCo +9qizkr9cnmaEeKyRnG4lnqRfsHUQvpK/kI8Amzx48FVigagn40T+UsEWIfUwnev5 +0SSrV/rgTNNwTuyXlsHRVo1woVm7lrlyauHuzS4o1wzGESyI3u0JVA6s+J/v/mRh +TVU9QQiyfDqvb7yeqJ3xPlxZKtRDvAg0NURYTmf+bGW5zAMbbRmQcFWK1weYWfkR +ubwE05TcHnJ1zqSIAUaryOdIYubfzWVi8Re6IruyXGt/+5toIh9y9aLsSb07y1U= +-----END CERTIFICATE----- diff --git a/feasibility-triangle/auth/key.pem b/feasibility-triangle/auth/key.pem new file mode 100644 index 0000000..09ed8ff --- /dev/null +++ b/feasibility-triangle/auth/key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +VD+9p7QIomqOkG7ply3JcpP8zPuoYQ== +-----END PRIVATE KEY----- diff --git a/feasibility-triangle/fhir-server/blaze-server/.env b/feasibility-triangle/fhir-server/blaze-server/.env new file mode 100644 index 0000000..35a6fb0 --- /dev/null +++ b/feasibility-triangle/fhir-server/blaze-server/.env @@ -0,0 +1,7 @@ +FHIR_SERVER_BASE_URL=http://fhir-server:8080 +FHIR_SERVER_LOG_LEVEL=error +BLAZE_JVM_ARGS=-Xmx4g +BLAZE_BLOCK_CACHE_SIZE=256 +BLAZE_DB_RESOURCE_CACHE_SIZE=2000000 +BLAZE_DB_RESOURCE_HANDLE_CACHE_SIZE=100000 +PORT_FHIR_SERVER_LOCALHOST=127.0.0.1:8081 diff --git a/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml b/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml index fca8279..c6aaf4d 100644 --- a/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml +++ b/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml @@ -3,11 +3,14 @@ services: fhir-server: image: ghcr.io/medizininformatik-initiative/blaze:0.16 environment: - BASE_URL: "http://fhir-server:8080" - JAVA_TOOL_OPTIONS: ${CODEX_FHIR_SERVER_JVM_ARGS:--Xmx4g} - LOG_LEVEL: debug + BASE_URL: ${FHIR_SERVER_BASE_URL:-http://fhir-server:8080} + LOG_LEVEL: ${FHIR_SERVER_LOG_LEVEL:-error} + JAVA_TOOL_OPTIONS: ${BLAZE_JVM_ARGS:--Xmx4g} + DB_BLOCK_CACHE_SIZE: ${BLAZE_BLOCK_CACHE_SIZE:-256} + DB_RESOURCE_CACHE_SIZE: ${BLAZE_DB_RESOURCE_CACHE_SIZE:-2000000} + DB_RESOURCE_HANDLE_CACHE_SIZE: ${BLAZE_DB_RESOURCE_HANDLE_CACHE_SIZE:-1000000} ports: - - ${PORT_BLAZE_FHIR:-127.0.0.1:8081}:8080 + - ${PORT_FHIR_SERVER_LOCALHOST:-127.0.0.1:8081}:8080 restart: unless-stopped volumes: - "blaze-data:/app/data" diff --git a/feasibility-triangle/flare/.env b/feasibility-triangle/flare/.env new file mode 100644 index 0000000..1f6cd51 --- /dev/null +++ b/feasibility-triangle/flare/.env @@ -0,0 +1,8 @@ +FLARE_FHIR_SERVER_URL=http://fhir-server:8080/fhir/ +FLARE_FHIR_USER= +FLARE_FHIR_PW= +FLARE_FHIR_PAGE_COUNT=1000 +FLARE_EXEC_CORE_POOL_SIZE=4 +FLARE_EXEC_MAX_POOL_SIZE=16 +FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS=10 +FLARE_LOG_LEVEL=debug \ No newline at end of file diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index 766a26d..661dfd4 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -1,18 +1,22 @@ version: "3.7" services: - node-flare: + flare: image: ghcr.io/rwth-imi/flare-query:1.0-rc11 ports: - - ${NUM_NODE_PORT_FLARE:-127.0.0.1:8084}:8080 + - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: FLARE_FHIR_SERVER_URL: ${FLARE_FHIR_SERVER_URL:-http://fhir-server:8080/fhir/} FLARE_FHIR_USER: ${FLARE_FHIR_USER:-} FLARE_FHIR_PW: ${FLARE_FHIR_PW:-} + FLARE_FHIR_PAGE_COUNT: ${FLARE_FHIR_PAGE_COUNT:-500} + FLARE_EXEC_CORE_POOL_SIZE: ${FLARE_EXEC_CORE_POOL_SIZE:-4} + FLARE_EXEC_MAX_POOL_SIZE: ${FLARE_EXEC_MAX_POOL_SIZE:-16} + FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS: ${FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS:-10} + LOG_LEVEL: ${FLARE_LOG_LEVEL:-warn} MAPPINGS_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json CONCEPT_TREE_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json restart: unless-stopped volumes: - ${FLARE_LOCAL_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json - ${FLARE_LOCAL_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json - diff --git a/feasibility-triangle/fhir-server/blaze-server/resetBlaze.sh b/feasibility-triangle/reset-fhir-server.sh similarity index 76% rename from feasibility-triangle/fhir-server/blaze-server/resetBlaze.sh rename to feasibility-triangle/reset-fhir-server.sh index e65db7e..64a02ae 100755 --- a/feasibility-triangle/fhir-server/blaze-server/resetBlaze.sh +++ b/feasibility-triangle/reset-fhir-server.sh @@ -1,8 +1,7 @@ -#!/usr/bin/env sh +#!/bin/bash -COMPOSE_PROJECT=codex-deploy +COMPOSE_PROJECT=${COMPOSE_PROJECT:-feasibility-deploy} BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" - docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/docker-compose.yml down -v docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/docker-compose.yml up -d diff --git a/feasibility-triangle/rev-proxy/.env b/feasibility-triangle/rev-proxy/.env new file mode 100644 index 0000000..37c6954 --- /dev/null +++ b/feasibility-triangle/rev-proxy/.env @@ -0,0 +1 @@ +FEASIBILITY_TRIANGLE_REV_PROXY_PORT=444 \ No newline at end of file diff --git a/feasibility-triangle/rev-proxy/docker-compose.yml b/feasibility-triangle/rev-proxy/docker-compose.yml index 60f5854..3874aa9 100644 --- a/feasibility-triangle/rev-proxy/docker-compose.yml +++ b/feasibility-triangle/rev-proxy/docker-compose.yml @@ -1,17 +1,15 @@ version: '2.0' services: - nginx-num-node: - container_name: nginx-num-node + feasibility-triangle-nginx: restart: unless-stopped image: nginxinc/nginx-unprivileged:1.20-alpine ports: - - ${PORT_NUM_NODE_REV_PROXY:-444}:8443 + - ${FEASIBILITY_TRIANGLE_REV_PROXY_PORT:-444}:8443 volumes: - ../auth/cert.pem:/etc/nginx/conf.d/cert.pem - ../auth/key.pem:/etc/nginx/conf.d/key.pem - ../auth/.htpasswd:/etc/nginx/.htpasswd - # - ./dhparam.pem:/etc/nginx/dhparam.pem - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./mime.types:/etc/nginx/conf.d/mime.types diff --git a/feasibility-triangle/rev-proxy/nginx.conf b/feasibility-triangle/rev-proxy/nginx.conf index e13c6fc..22c79f3 100644 --- a/feasibility-triangle/rev-proxy/nginx.conf +++ b/feasibility-triangle/rev-proxy/nginx.conf @@ -65,7 +65,7 @@ http { location /flare { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; - proxy_pass http://node-flare:8080/flare; + proxy_pass http://flare:8080/; proxy_set_header Authorization ""; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; diff --git a/feasibility-triangle/start-triangle.sh b/feasibility-triangle/start-triangle.sh index 746ec01..d055b5e 100755 --- a/feasibility-triangle/start-triangle.sh +++ b/feasibility-triangle/start-triangle.sh @@ -1,7 +1,7 @@ #!/usr/bin/env sh -COMPOSE_PROJECT=abide-deploy -export PORT_NUM_NODE_REV_PROXY=444 + +COMPOSE_PROJECT=${COMPOSE_PROJECT:-feasibility-deploy} BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" FHIR_SERVER=${FHIR_SERVER:-blaze} From a9814d334b721b55aa7ee454d4ac190ee5d96f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 8 Apr 2022 13:26:23 +0200 Subject: [PATCH 004/118] update .env vars, add compose project to .sh scripts --- feasibility-triangle/.gitignore | 4 +++- feasibility-triangle/aktin-client/.env | 4 ++-- feasibility-triangle/down-triangle.sh | 3 +-- feasibility-triangle/fhir-server/blaze-server/.env | 2 +- feasibility-triangle/flare/.env | 2 +- feasibility-triangle/start-triangle.sh | 2 +- feasibility-triangle/stop-triangle.sh | 2 +- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/feasibility-triangle/.gitignore b/feasibility-triangle/.gitignore index f9a40ae..cd1780e 100644 --- a/feasibility-triangle/.gitignore +++ b/feasibility-triangle/.gitignore @@ -1 +1,3 @@ -/ontology/*.json \ No newline at end of file +/ontology/*.json +/testdata/*.json +/testdata/*.zip \ No newline at end of file diff --git a/feasibility-triangle/aktin-client/.env b/feasibility-triangle/aktin-client/.env index cd0dcbb..d92afaa 100644 --- a/feasibility-triangle/aktin-client/.env +++ b/feasibility-triangle/aktin-client/.env @@ -1,8 +1,8 @@ FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE=application/sq+json FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE=application/json -FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI=https://aktin.forschen-fuer-gesundheit.de/broker/ +FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI=http://aktin-broker:8080/broker/ FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS=org.aktin.broker.client2.auth.ApiKeyAuthentication -FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM=GD4qAWNCOfNW1y1ARBR2-eIV2mQiCzBn4UuyqKM0IyVbkYt_-P10-Zm3L0zTkh8_6t7nCi +FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM=xxxApiKey123 FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS=60 FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS=10 FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING=true diff --git a/feasibility-triangle/down-triangle.sh b/feasibility-triangle/down-triangle.sh index 9bec110..99548bb 100755 --- a/feasibility-triangle/down-triangle.sh +++ b/feasibility-triangle/down-triangle.sh @@ -1,7 +1,6 @@ #!/usr/bin/env sh -COMPOSE_PROJECT=codex-deploy - +COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-client/docker-compose.yml down diff --git a/feasibility-triangle/fhir-server/blaze-server/.env b/feasibility-triangle/fhir-server/blaze-server/.env index 35a6fb0..519864e 100644 --- a/feasibility-triangle/fhir-server/blaze-server/.env +++ b/feasibility-triangle/fhir-server/blaze-server/.env @@ -1,5 +1,5 @@ FHIR_SERVER_BASE_URL=http://fhir-server:8080 -FHIR_SERVER_LOG_LEVEL=error +FHIR_SERVER_LOG_LEVEL=debug BLAZE_JVM_ARGS=-Xmx4g BLAZE_BLOCK_CACHE_SIZE=256 BLAZE_DB_RESOURCE_CACHE_SIZE=2000000 diff --git a/feasibility-triangle/flare/.env b/feasibility-triangle/flare/.env index 1f6cd51..88b897a 100644 --- a/feasibility-triangle/flare/.env +++ b/feasibility-triangle/flare/.env @@ -1,7 +1,7 @@ FLARE_FHIR_SERVER_URL=http://fhir-server:8080/fhir/ FLARE_FHIR_USER= FLARE_FHIR_PW= -FLARE_FHIR_PAGE_COUNT=1000 +FLARE_FHIR_PAGE_COUNT=500 FLARE_EXEC_CORE_POOL_SIZE=4 FLARE_EXEC_MAX_POOL_SIZE=16 FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS=10 diff --git a/feasibility-triangle/start-triangle.sh b/feasibility-triangle/start-triangle.sh index d055b5e..ea6bc88 100755 --- a/feasibility-triangle/start-triangle.sh +++ b/feasibility-triangle/start-triangle.sh @@ -1,7 +1,7 @@ #!/usr/bin/env sh -COMPOSE_PROJECT=${COMPOSE_PROJECT:-feasibility-deploy} +COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" FHIR_SERVER=${FHIR_SERVER:-blaze} diff --git a/feasibility-triangle/stop-triangle.sh b/feasibility-triangle/stop-triangle.sh index cef5686..32e923a 100755 --- a/feasibility-triangle/stop-triangle.sh +++ b/feasibility-triangle/stop-triangle.sh @@ -1,6 +1,6 @@ #!/usr/bin/env sh -COMPOSE_PROJECT=abide-deploy +COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" From 87c1044f86736a0b6c0eb92be9ed1018c2e8a422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 12 Apr 2022 15:24:53 +0200 Subject: [PATCH 005/118] make all variables available in .env files, remove codex references, rename scripts to generic version --- feasibility-portal/aktin-broker/.env | 3 + .../aktin-broker/docker-compose.yml | 3 +- feasibility-portal/backend/.env | 29 ++++++++ feasibility-portal/backend/docker-compose.yml | 68 ++++++++++--------- feasibility-portal/down-feasibility-portal.sh | 11 +++ feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-portal/gui/nginx.conf | 4 +- feasibility-portal/keycloak/.env | 7 ++ .../keycloak/docker-compose.yml | 26 ++++--- ...l.sh => start-feasibility-portal-local.sh} | 4 +- ...rt-zars.sh => start-feasibility-portal.sh} | 4 +- ...top-zars.sh => stop-feasibility-portal.sh} | 2 +- .../aktin-client/aktin-requests.log | 14 ++++ 13 files changed, 120 insertions(+), 57 deletions(-) create mode 100644 feasibility-portal/aktin-broker/.env create mode 100644 feasibility-portal/backend/.env create mode 100755 feasibility-portal/down-feasibility-portal.sh create mode 100644 feasibility-portal/keycloak/.env rename feasibility-portal/{start-feasibility-local.sh => start-feasibility-portal-local.sh} (85%) rename feasibility-portal/{start-zars.sh => start-feasibility-portal.sh} (77%) rename feasibility-portal/{stop-zars.sh => stop-feasibility-portal.sh} (87%) diff --git a/feasibility-portal/aktin-broker/.env b/feasibility-portal/aktin-broker/.env new file mode 100644 index 0000000..35d8eba --- /dev/null +++ b/feasibility-portal/aktin-broker/.env @@ -0,0 +1,3 @@ +AKTIN_BROKER_LOG_LEVEL=INFO +AKTIN_ADMIN_PW=changeme +AKTIN_BROKER_HOST_AND_PORT=0.0.0.0:8080 \ No newline at end of file diff --git a/feasibility-portal/aktin-broker/docker-compose.yml b/feasibility-portal/aktin-broker/docker-compose.yml index ee8a018..b71da74 100644 --- a/feasibility-portal/aktin-broker/docker-compose.yml +++ b/feasibility-portal/aktin-broker/docker-compose.yml @@ -1,8 +1,9 @@ version: '3.7' services: aktin-broker: - image: ghcr.io/aktin/aktin-broker:1.3.2 + image: ghcr.io/aktin/aktin-broker:1.3.4 environment: + LOG_LEVEL: ${AKTIN_BROKER_LOG_LEVEL:-INFO} PASSWORD: ${AKTIN_ADMIN_PW:-changeme} HOST_AND_PORT: ${AKTIN_BROKER_HOST_AND_PORT:-0.0.0.0:8080} volumes: diff --git a/feasibility-portal/backend/.env b/feasibility-portal/backend/.env new file mode 100644 index 0000000..3dca579 --- /dev/null +++ b/feasibility-portal/backend/.env @@ -0,0 +1,29 @@ +FEASIBILITY_BACKEND_DATASOURCE_HOST=feasibility-gui-backend-db +FEASIBILITY_BACKEND_DATASOURCE_PORT=5432 +FEASIBILITY_BACKEND_DATASOURCE_USERNAME=guidbuser +FEASIBILITY_BACKEND_DATASOURCE_PASSWORD=guidbpw +FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=false +KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER +FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://keycloak:8080 +FEASIBILITY_BACKEND_KEYCLOAK_REALM=codex-develop +FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID=feasibility-gui +FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=true +FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED=false +FEASIBILITY_BACKEND_API_BASE_URL=https://localhost/api/ +FEASIBILITY_BACKEND_DIRECT_ENABLED=false +# ---- Aktin +FEASIBILITY_BACKEND_AKTIN_ENABLED=true +FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL=http://aktin-broker:8080/broker/ +FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY=xxxApiKeyAdmin123 +# ---- DSF +FEASIBILITY_BACKEND_DSF_ENABLED=false +FEASIBILITY_BACKEND_DSF_CACERT=/opt/codex-feasibility-security/ca.pem +FEASIBILITY_BACKEND_DSF_DSF_SECURITY_KEYSTORE_P12FILE=/opt/codex-feasibility-security/test-user.p12 +FEASIBILITY_BACKEND_DSF_SECURITY_KEYSTORE_PASSWORD=password +FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL=https://dsf-zars-fhir-proxy/fhir +FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL=wss://dsf-zars-fhir-proxy:443/fhir/ws +FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID=Test_ZARS +FEASIBILITY_BACKEND_UI_PROFILES_PATH=../ontology/ui_profiles +FEASIBILITY_BACKEND_CONCEPT_TREE_PATH=../ontology/codex-code-tree.json +FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH=../ontology/codex-term-code-mapping.json +FEASIBILITY_BACKEND_CERTS_PATH=../dsf-broker/certs \ No newline at end of file diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index f57276a..e5e7984 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,49 +1,51 @@ version: '3.7' services: - zars-feasibility-gui-backend: + feasibility-gui-backend: image: ghcr.io/medizininformatik-initiative/feasibility-backend:1.0.4 ports: - - ${CODEX_FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 + - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: - - zars-feasibility-db + - feasibility-gui-backend-db environment: - SPRING_DATASOURCE_URL: ${CODEX_FEASIBILITY_BACKEND_DATASOURCE_URL:-jdbc:postgresql://zars-feasibility-db:5432/codex_ui?currentSchema=codex} - SPRING_DATASOURCE_USERNAME: ${CODEX_FEASIBILITY_BACKEND_DATASOURCE_USERNAME:-codex-postgres} - SPRING_DATASOURCE_PASSWORD: ${CODEX_FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-codex-password} - BROKER_CLIENT_TYPE: ${CODEX_FEASIBILITY_BACKEND_BROKER_CLIENT_TYPE:-AKTIN} - KEYCLOAK_ENABLED: ${CODEX_FEASIBILITY_BACKEND_KEYCLOAK_ENABLED:-true} - KEYCLOAK_BASE_URL: ${CODEX_FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} - KEYCLOAK_REALM: ${CODEX_FEASIBILITY_BACKEND_KEYCLOAK_REALM:-codex-develop} - KEYCLOAK_CLIENT_ID: ${CODEX_FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID:-feasibility-gui} - CQL_TRANSLATE_ENABLED: ${CODEX_FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED:-false} - FHIR_TRANSLATE_ENABLED: ${CODEX_FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED:-false} - FLARE_WEBSERVICE_BASE_URL: ${CODEX_FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL:-http://zars-flare:5000} - API_BASE_URL: ${CODEX_FEASIBILITY_BACKEND_API_BASE_URL:-https://localhost/api/} - BROKER_CLIENT_DIRECT_ENABLED: ${CODEX_FEASIBILITY_BACKEND_DIRECT_ENABLED:-false} + FEASIBILITY_DATABASE_HOST: ${FEASIBILITY_BACKEND_DATASOURCE_HOST:-feasibility-gui-backend-db} + FEASIBILITY_DATABASE_PORT: ${FEASIBILITY_BACKEND_DATASOURCE_PORT:-5432} + FEASIBILITY_DATABASE_USER: ${FEASIBILITY_BACKEND_DATASOURCE_USERNAME:-guidbuser} + FEASIBILITY_DATABASE_PASSWORD: ${FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-guidbpw} + BROKER_CLIENT_TYPE: ${FEASIBILITY_BACKEND_BROKER_CLIENT_TYPE:-AKTIN} + KEYCLOAK_ENABLED: ${FEASIBILITY_BACKEND_KEYCLOAK_ENABLED:-true} + KEYCLOAK_ALLOWED_ROLE: ${KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} + KEYCLOAK_BASE_URL: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} + KEYCLOAK_REALM: ${FEASIBILITY_BACKEND_KEYCLOAK_REALM:-codex-develop} + KEYCLOAK_CLIENT_ID: ${FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID:-feasibility-gui} + CQL_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED:-true} + FHIR_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED:-false} + API_BASE_URL: ${FEASIBILITY_BACKEND_API_BASE_URL:-https://localhost/api/} + BROKER_CLIENT_DIRECT_ENABLED: ${FEASIBILITY_BACKEND_DIRECT_ENABLED:-false} # ---- Aktin - BROKER_CLIENT_AKTIN_ENABLED: ${CODEX_FEASIBILITY_BACKEND_AKTIN_ENABLED:-false} - AKTIN_BROKER_BASE_URL: ${CODEX_FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL:-http://aktin-broker:8080/broker/} - AKTIN_BROKER_API_KEY: ${CODEX_FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY:-xxxApiKeyAdmin123} + BROKER_CLIENT_AKTIN_ENABLED: ${FEASIBILITY_BACKEND_AKTIN_ENABLED:-false} + AKTIN_BROKER_BASE_URL: ${FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL:-http://aktin-broker:8080/broker/} + AKTIN_BROKER_API_KEY: ${FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY:-xxxApiKeyAdmin123} # ---- DSF - DSF_SECURITY_CACERT: "/opt/codex-feasibility-security/ca.pem" - DSF_SECURITY_KEYSTORE_P12FILE: "/opt/codex-feasibility-security/test-user.p12" - DSF_SECURITY_KEYSTORE_PASSWORD: "password" - DSF_WEBSERVICE_BASE_URL: "https://dsf-zars-fhir-proxy/fhir" - DSF_WEBSOCKET_URL: "wss://dsf-zars-fhir-proxy:443/fhir/ws" - DSF_ORGANIZATION_ID: "Test_ZARS" + BROKER_CLIENT_DSF_ENABLED: ${FEASIBILITY_BACKEND_DSF_ENABLED:-false} + DSF_SECURITY_CACERT: ${FEASIBILITY_BACKEND_DSF_CACERT:-/opt/codex-feasibility-security/ca.pem} + DSF_SECURITY_KEYSTORE_P12FILE: ${FEASIBILITY_BACKEND_DSF_DSF_SECURITY_KEYSTORE_P12FILE:-/opt/codex-feasibility-security/test-user.p12} + DSF_SECURITY_KEYSTORE_PASSWORD: ${FEASIBILITY_BACKEND_DSF_SECURITY_KEYSTORE_PASSWORD:-password} + DSF_WEBSERVICE_BASE_URL: ${FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL:-https://dsf-zars-fhir-proxy/fhir} + DSF_WEBSOCKET_URL: ${FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL:-wss://dsf-zars-fhir-proxy:443/fhir/ws} + DSF_ORGANIZATION_ID: ${FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID:-Test_ZARS} restart: unless-stopped volumes: - - ${CODEX_FEASIBILITY_BACKEND_UI_PROFILES_PATH:-../ontology/ui_profiles}:/opt/codex-feasibility-backend/ontology/ui_profiles - - ${CODEX_FEASIBILITY_BACKEND_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:/opt/codex-feasibility-backend/ontology/conceptTree.json - - ${CODEX_FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:/opt/codex-feasibility-backend/ontology/termCodeMapping.json - - ${CODEX_FEASIBILITY_BACKEND_CERTS_PATH:-../dsf-broker/certs}:/opt/codex-feasibility-security + - ${FEASIBILITY_BACKEND_UI_PROFILES_PATH:-../ontology/ui_profiles}:/opt/codex-feasibility-backend/ontology/ui_profiles + - ${FEASIBILITY_BACKEND_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:/opt/codex-feasibility-backend/ontology/codex-code-tree.json + - ${FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:/opt/codex-feasibility-backend/ontology/codex-term-code-mapping.json + - ${FEASIBILITY_BACKEND_CERTS_PATH:-../dsf-broker/certs}:/opt/codex-feasibility-security - zars-feasibility-db: + feasibility-gui-backend-db: image: 'postgres:13.1-alpine' ports: - - ${CODEX_FEASIBILITY_BACKEND_DB_PORT:-127.0.0.1:5432}:5432 + - ${FEASIBILITY_BACKEND_DB_PORT:-127.0.0.1:5432}:5432 environment: - POSTGRES_USER: ${CODEX_FEASIBILITY_BACKEND_DATASOURCE_USERNAME:-codex-postgres} - POSTGRES_PASSWORD: ${CODEX_FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-codex-password} + POSTGRES_USER: ${FEASIBILITY_BACKEND_DATASOURCE_USERNAME:-guidbuser} + POSTGRES_PASSWORD: ${FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-guidbpw} POSTGRES_DB: codex_ui restart: unless-stopped diff --git a/feasibility-portal/down-feasibility-portal.sh b/feasibility-portal/down-feasibility-portal.sh new file mode 100755 index 0000000..03b9f95 --- /dev/null +++ b/feasibility-portal/down-feasibility-portal.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env sh + +COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} + +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" + +docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/keycloak/docker-compose.yml down +docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/backend/docker-compose.yml down +docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/gui/docker-compose.yml down +docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-broker/docker-compose.yml down +sh $BASE_DIR/dsf-broker/down.sh $COMPOSE_PROJECT diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 0f09da5..038b7e5 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,5 +1,5 @@ services: - zars-feasibility-gui: + feasibility-gui: image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.2.0_RC10 ports: - "443:8443" diff --git a/feasibility-portal/gui/nginx.conf b/feasibility-portal/gui/nginx.conf index 50f6d1f..8fc3b8a 100644 --- a/feasibility-portal/gui/nginx.conf +++ b/feasibility-portal/gui/nginx.conf @@ -64,7 +64,7 @@ gzip_disable "MSIE [1-6]\."; } location /api/ { - proxy_pass http://zars-feasibility-gui-backend:8090/api/; + proxy_pass http://feasibility-gui-backend:8090/api/; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; } @@ -73,7 +73,7 @@ gzip_disable "MSIE [1-6]\."; proxy_buffers 4 128k; proxy_busy_buffers_size 128k; proxy_buffer_size 64k; - proxy_pass https://keycloak:8443; + proxy_pass https://auth:8443; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; diff --git a/feasibility-portal/keycloak/.env b/feasibility-portal/keycloak/.env new file mode 100644 index 0000000..167f9f6 --- /dev/null +++ b/feasibility-portal/keycloak/.env @@ -0,0 +1,7 @@ +FEASIBILITY_KEYCLOAK_DB=keycloakdb +FEASIBILITY_KEYCLOAK_DB_USER=keycloakdbuser +FEASIBILITY_KEYCLOAK_DB_PW=keycloakdbpw +FEASIBILITY_KEYCLOAK_ADMIN_USER=admin +FEASIBILITY_KEYCLOAK_ADMIN_PW=adminpw +FEASIBILITY_KEYCLOAK_PROXY_ADDR_FORWARDING=true +FEASIBILITY_KEYCLOAK_BASE_URL=https://localhost/auth \ No newline at end of file diff --git a/feasibility-portal/keycloak/docker-compose.yml b/feasibility-portal/keycloak/docker-compose.yml index f750495..8424dd2 100644 --- a/feasibility-portal/keycloak/docker-compose.yml +++ b/feasibility-portal/keycloak/docker-compose.yml @@ -2,30 +2,28 @@ version: "3.7" services: auth-db: - container_name: codexkeycloakdb image: postgres:14-alpine restart: unless-stopped environment: - POSTGRES_PASSWORD: postgres - POSTGRES_DB: keycloak - POSTGRES_USER: keycloak + POSTGRES_DB: ${FEASIBILITY_KEYCLOAK_DB:-keycloakdb} + POSTGRES_USER: ${FEASIBILITY_KEYCLOAK_DB_USER:-keycloakdbuser} + POSTGRES_PASSWORD: ${FEASIBILITY_KEYCLOAK_DB_PW:-keycloakdbpw} volumes: - - "db:/var/lib/postgresql/data" + - "feasibility-auth-db:/var/lib/postgresql/data" - keycloak: - container_name: codexkeycloak + auth: image: jboss/keycloak:15.0.2 restart: unless-stopped environment: DB_VENDOR: POSTGRES DB_ADDR: auth-db - DB_DATABASE: keycloak - DB_USER: keycloak + DB_DATABASE: ${FEASIBILITY_KEYCLOAK_DB:-keycloakdb} + DB_USER: ${FEASIBILITY_KEYCLOAK_DB_USER:-keycloakdbuser} DB_SCHEMA: public - DB_PASSWORD: postgres - KEYCLOAK_USER: admin - KEYCLOAK_PASSWORD: ${FEASIBILITY_KEYCLOAK_ADMIN_PW:-admin} - PROXY_ADDRESS_FORWARDING: "true" + DB_PASSWORD: ${FEASIBILITY_KEYCLOAK_DB_PW:-keycloakdbpw} + KEYCLOAK_USER: ${FEASIBILITY_KEYCLOAK_ADMIN_USER:-admin} + KEYCLOAK_PASSWORD: ${FEASIBILITY_KEYCLOAK_ADMIN_PW:-adminpw} + PROXY_ADDRESS_FORWARDING: ${FEASIBILITY_KEYCLOAK_PROXY_ADDR_FORWARDING:-true} KEYCLOAK_IMPORT: /tmp/initial-realm.json KEYCLOAK_FRONTEND_URL: ${FEASIBILITY_KEYCLOAK_BASE_URL:-https://localhost/auth} volumes: @@ -36,4 +34,4 @@ services: - auth-db volumes: - auth-db: + feasibility-auth-db: diff --git a/feasibility-portal/start-feasibility-local.sh b/feasibility-portal/start-feasibility-portal-local.sh similarity index 85% rename from feasibility-portal/start-feasibility-local.sh rename to feasibility-portal/start-feasibility-portal-local.sh index dd8f02a..a073df0 100755 --- a/feasibility-portal/start-feasibility-local.sh +++ b/feasibility-portal/start-feasibility-portal-local.sh @@ -1,9 +1,7 @@ #!/usr/bin/env sh -COMPOSE_PROJECT=abide-deploy +COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} -export FEASIBILITY_KEYCLOAK_ADMIN_PW=${FEASIBILITY_KEYCLOAK_ADMIN_PW:-admin} -FEASIBILITY_BASE_URL=${FEASIBILITY_BASE_URL:-https://localhost} export CODEX_FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL=http://node-flare:8080 export CODEX_FEASIBILITY_BACKEND_DIRECT_ENABLED=true export CODEX_FEASIBILITY_BACKEND_API_BASE_URL=$FEASIBILITY_BASE_URL/api/ diff --git a/feasibility-portal/start-zars.sh b/feasibility-portal/start-feasibility-portal.sh similarity index 77% rename from feasibility-portal/start-zars.sh rename to feasibility-portal/start-feasibility-portal.sh index 4e0124d..7cbfa91 100755 --- a/feasibility-portal/start-zars.sh +++ b/feasibility-portal/start-feasibility-portal.sh @@ -1,6 +1,6 @@ #!/usr/bin/env sh -COMPOSE_PROJECT=abide-deploy +COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" @@ -8,4 +8,4 @@ docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/keycloak/docker-compose.yml up - docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/backend/docker-compose.yml up -d docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/gui/docker-compose.yml up -d docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-broker/docker-compose.yml up -d -sh $BASE_DIR/dsf-broker/start.sh $COMPOSE_PROJECT +#sh $BASE_DIR/dsf-broker/start.sh $COMPOSE_PROJECT diff --git a/feasibility-portal/stop-zars.sh b/feasibility-portal/stop-feasibility-portal.sh similarity index 87% rename from feasibility-portal/stop-zars.sh rename to feasibility-portal/stop-feasibility-portal.sh index fd1db94..5b9958a 100755 --- a/feasibility-portal/stop-zars.sh +++ b/feasibility-portal/stop-feasibility-portal.sh @@ -1,6 +1,6 @@ #!/usr/bin/env sh -COMPOSE_PROJECT=abide-deploy +COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" diff --git a/feasibility-triangle/aktin-client/aktin-requests.log b/feasibility-triangle/aktin-client/aktin-requests.log index e69de29..e85d122 100644 --- a/feasibility-triangle/aktin-client/aktin-requests.log +++ b/feasibility-triangle/aktin-client/aktin-requests.log @@ -0,0 +1,14 @@ +##### INCOMING REQUEST at Tue Apr 12 13:22:17 UTC 2022 ##### +----BEGIN REQUEST---- +{"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"gender","system":"mii.abide","display":"Geschlecht"}],"attributeFilters":[{"type":"concept","selectedConcepts":[{"code":"female","system":"http://hl7.org/fhir/administrative-gender","display":"Female"}],"attributeCode":{"code":"gender","system":"mii.abide","display":"Geschlecht"}}]}]]} +----END REQUEST---- +----BEGIN RESPONSE---- + +----END RESPONSE---- +##### INCOMING REQUEST at Tue Apr 12 13:23:18 UTC 2022 ##### +----BEGIN REQUEST---- +{"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"gender","system":"mii.abide","display":"Geschlecht"}],"attributeFilters":[{"type":"concept","selectedConcepts":[{"code":"female","system":"http://hl7.org/fhir/administrative-gender","display":"Female"}],"attributeCode":{"code":"gender","system":"mii.abide","display":"Geschlecht"}}]}]]} +----END REQUEST---- +----BEGIN RESPONSE---- +1120 +----END RESPONSE---- From 440c10a7a54a406965b5ccb1a57d082047f4ea2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 12 Apr 2022 20:13:09 +0200 Subject: [PATCH 006/118] fix env var dsf bpe --- feasibility-triangle/dsf-client/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feasibility-triangle/dsf-client/docker-compose.yml b/feasibility-triangle/dsf-client/docker-compose.yml index 2de047e..cffedcc 100644 --- a/feasibility-triangle/dsf-client/docker-compose.yml +++ b/feasibility-triangle/dsf-client/docker-compose.yml @@ -118,8 +118,8 @@ services: ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf-dic-fhir-proxy/fhir DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_FLARE_WEBSERVICE_BASEURL: http://node-flare:5000/ DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_FLARE_WEBSERVICE_CONNECTTIMEOUT: 2000 - DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_EVALUATION_STRATEGY: ${CODEX_FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY:"structured-query"} - DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_EVALUATION_OBFUSCATE: ${CODEX_FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE:"true"} + DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_EVALUATION_STRATEGY: ${CODEX_FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY:-"structured-query"} + DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_EVALUATION_OBFUSCATE: ${CODEX_FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE:-"true"} EXTRA_JVM_ARGS: ${CODEX_DSF_ZARS_BPE_APP_JVM_ARGS} TZ: "Europe/Berlin" depends_on: From 51c844a2c619a67da5ee556872341e5325be9e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 12 Apr 2022 21:50:25 +0200 Subject: [PATCH 007/118] Update readme for feasibility triangle --- feasibility-triangle/README.md | 190 ++++++++++++++++++++------------ feasibility-triangle/flare/.env | 1 + 2 files changed, 123 insertions(+), 68 deletions(-) diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 961477b..071ff2e 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -1,115 +1,169 @@ -# The Codex Num-Node - Feasibility Queries +# The Feasibility Triangle -The Num-Node part of this Repository provides a site (data integration center) with all the neccessary components to set up in order to allow feasibiliy queries from the central feasibility platform. -It is to be integrated with other parts of the Num-Node (see [Num-Node Repository](https://github.com/num-codex/num-knoten)). +The Feasibility Triangle part of this Repository provides a site (data integration center) with all the neccessary components to set up in order to allow feasibiliy queries from the central feasibility portal. -It can however be installed by itself in order to test the feasibility query setup and be later switched to a production environment. +## Overview -## Setting up the Num-Node for Feasibility Overview +The Feasibility Triangle is composed of three components: -This setup is configured to install the so called "feasibility triangle" on one VM, which combines the minimum neccessary components to load data into a FHIR store and connect to a central feasibility query platform. +1. A Middleware Client (AKTIN or DSF) +2. A Feasibility Analysis Request Executor (FLARE) +3. A FHIR Server (Blaze) +4. Reverse Proxy (NGINX) -
- -
Figure 1 - Overview Num Node Feasibility Triangle
-
+The Feasibility Triangle also comes with a reverse proxy, which provides a basic auth for the FHIR Server and the FLARE component, so that they can be integrated into a sites multi server infrastructure. +The triangle can be set up in different ways depending on which components and whether FHIR Search or CQL is to be used. +This leads to the following setup Options: -We will describe the setup process for all components on the same VM inside the same docker network here and then describe all components in more detail including the configuration variables and their purpose within the Num-Node. +AKTIN - FLARE (FHIR Search) - FHIR Server (not CQL ready) +AKTIN - FHIR Server (CQL ready) +DSF - FLARE (FHIR Search) - FHIR Server (not CQL ready) +DSF - FHIR Server (CQL ready) -The Num-Node parts here are only part of the Num-Node components to be deployed and can be later configured to work with the ETL Num_Node components described as part of the [Num-Node V2](https://github.com/num-codex/num-knoten). +The components all work with defined interfaces and can be exchanged if a component with equivalent capabilities is provided by the site. +In this manner the FHIR Server provided here (Blaze) can be exchanged for a FHIR server of choice, which either offers CQL or the required FHIR Search capabilities. -## Setting up the Num-Node on one VM +## Setting up the Feasibility Triangle -### Step 1 - clone this Repository to your virtual machine +### Step 1 - Installation Docker + +The installation of the Feasibility Triangle requires Docker (https://docs.docker.com/engine/install/ubuntu/) and docker-compose (https://docs.docker.com/compose/install/). +If not already installed on your VM, install using the links provided above. + +### Step 2 - clone this Repository to your virtual machine ssh to your virtual machine and switch to sudo `sudo -s`. -Create a folder for your setup, we suggest /opt/num-node (`mkdir -p /opt/num-node`) -Navigate to the directory and clone this repository: `git clone https://github.com/num-codex/codex-deploy` -Navigate to the num-node folder of the repository: `cd /opt/num-node/codex-deploy/num-node` +Designate a folder for your setup in which to clone the deploy repository, we suggest /opt (`cd /opt`) +Navigate to the directory and clone this repository: `git clone https://github.com/medizininformatik-initiative/feasibility-deploy.git` +Navigate to the feasibility-triangle folder of the repository: `cd /opt/feasibility-deploy/feasibility-triangle` +Checkout the version (git tag) of the feasibility triangle you would like to install: `git checkout tags/` + +### Step 3 - Set Up basic auth + +To set up basic auth you can execute the `setup-base-auth.sh ` to add a simple .htpasswd to protect your FHIR Server and FLARE component with basic authentication. +This creates a .htpasswd file in the `auth` directory, which will be mounted to the nginx, which is part of this deployment repository. + +### Step 4 - Set Up ssl certificates + +Running this setup safely at your site, requires a valid certificate and domain. Please contact the responsible body of your institution to recieve both a domain and certificate. +You will require two .pem files: a cert.pem (certificate) and key.pem (private key). -### Step 2 - Setup basic auth +Once you have the appropriate certificates you should save them under `/opt/feasibility-deploy/feasibility-triangle/auth`. +Set the rights for all files of the auth folder to 655 `chmod 655 /opt/feasibility-deploy/feasibility-triangle/auth/*`. -To set up basic auth you can execute the `setup-base-auth.sh //// +cd ///// +unzip mapping_*.zip +cd mapping +cp * /opt/feasibility-deploy/feasibility-triangle/ontology +``` -To configure the Num-Node to work with the central feasibility platform the only part that needs to be configured for a test setup is the `aktin-client`. +### Step 6 - Configure your feasibility triangle -#### 3.1 Broker API-Key +If you use the default triangle setup you only have to configure the AKTIN client to connect to the central feasibility portal as the rest of the setup will already be correctly configured for you. -Ask for an API key for the central platform from the central platform team and add the API key in the `aktin-client/.env` file by replacing the `CLIENT_AUTH_PARAM` env variable. +To configure the AKTIN client in the default setup, change the following environment variables in the file `/opt/feasibility-deploy/feasibility-triangle/aktin-client/.env` according to the paragraph **Configurable environment variables** of this README: -#### 3.2 Broker Endpoint +- FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI +- FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM +- FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS -Ask for the Broker Endpoint Uri for the central platfrom from central platform team and add the URI in the `aktin-client/.env` file by replacing the `BROKER_ENDPOINT_URI` env variable. +### Step 7 - Start the feasibility triangle +To start the triangle navigate to `/opt/feasibility-deploy/feasibility-triangle` and +execute `bash start-triangle.sh`. -### Step 4 - Start the Num-Node +This starts the following default triangle: +AKTIN (Middleware) - FLARE (FHIR Search executor) - BLAZE (FHIR Server) -Switch back to the num-node folder `cd ..` +- AKTIN: Used to connect to the central platform and allow queries from the Zars +- FLARE: A Rest Service, which is needed to translate, execute and evaluate a feasibility query on a FHIR Server using FHIR Search +- BLAZE: The FHIR Server which holds the patient data for feasibility queries -To start the Num-Node execute the `start-node.sh`. -This starts a standard Num-Node Setup, which includes: -- Aktin-Client: used to connect to the central platform and allow queries from the Zars -- GECCO FHIR Server: The FHIR Server which will later hold the GECCO patient data for feasibility queries -- Flare: A Rest Service, which is needed to translate, execute and evaluate a feasibility query on a FHIR Server +If you would like to pick other component combinations you can start each component individually by setting your compose project (`export FEASIBILITY_COMPOSE_PROJECT=feasibility-deploy`) +navigating to the respective components folder and executing: +`docker-compose -p $FEASIBILITY_COMPOSE_PROJECT up -d` -### Step 5 - Access the Num-Node -The Num-Node will expose the following services. +### Step 8 - Access the Triangle + +In the default coniguration and given that you have set up a ssl certifcate in step 4 the setup will expose the following services: These are the URLs for access to the webclients via nginx: | Component | URL | User | Password | |-------------|----------------------------------|------------------|------------------| -| Flare | | chosen in step 2 | chosen in step 2 | -| FHIR Server | | chosen in step 2 | chosen in step 2 | +| Flare | | chosen in step 2 | chosen in step 2 | +| FHIR Server | | chosen in step 2 | chosen in step 2 | Accessible service via localhost: | Component | URL | User | Password | |-------------|----------------------------------|------------------|------------------| -| Flare | | None required | None required | +| Flare | | None required | None required | | FHIR Server | | None required | None required | -Please be aware, that if you would like to access the services on localhost without a password you will need to -set up an ssh tunnel to your server and forward the respective ports. +Please be aware, that if you would like to access the services on localhost without a password you will need to set up an ssh tunnel to your server and forward the respective ports. For example for the FHIR Server: ssh -L 8081:127.0.0.1:8081 your-username@your-server-ip -### Step 6 - Init Testdata (Optional) - -If you would like to test your setup you can initialise the testdata provided with this repository. - -`bash init-testdata.sh` - -Alternatively if you are part of the CODEX project, please download the testdata here: - -https://confluence.imi.med.fau.de/download/attachments/156379181/gecco-feasibility-testdata.zip?version=1&modificationDate=1624281356939&api=v2 - -remove the current testdata and unzip the file in the testdata directory of this projects num-node folder. - -`rm -f testdata/* && unzip gecco-feasibility-testdata.zip -d testdata` - -then execute `bash init-testdata.sh` to load the testdata in your FHIR server - -## Change Certificate - -To change the certificate of the Num-Node request a cert.pem and key.pem file from your institution and add replace the cert.pem and key.pem files in the `auth` folder. - -After replacing the *.pem files restart the num-node using the `stop-node.sh` and `start-node.sh` in sequence. - - - - +### Step 9 - Init Testdata (Optional) + +TODO - add description of testdata initialisation here. + + +### Configurable environment variables + +| Env Variable | Description | Default | Possible Values | Component | +|-------------|----------------------------------|------------------|------------------|------------------| +|FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE|The media type of the query you would like to handle|application/sq+json|application/sq+json, text/cql|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE|The media type of the query response you return|application/json|application/json|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI|The URL of the AKTIN broker endpoint|http://aktin-broker:8080/broker/|URL|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS|Type of authentication used by AKTIN|org.aktin.broker.client2.auth.ApiKeyAuthentication|org.aktin.broker.client2.auth.ApiKeyAuthentication|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM|The API key of your site|xxxApiKey123|API key token|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS|The time in which your AKTIN client pings the AKTIN broker to ensure idle websocket conections stay open|60|Integer (seconds)|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS||10|Integer (seconds)|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING||TRUE||AKTIN| +|FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS|The timeout within which a process has to return before the client sends a "failed" message to the AKTIN broker|60|Integer (seconds)|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND|The command to be executed on recieving a feasibility query. Allows one to switch between flare and cql execution|/opt/aktin/call-flare.sh|/opt/aktin/call-flare.sh, /opt/aktin/call-cql.sh|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS||10|Integer (seconds)|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL|the URL of the FLARE component if used|http://flare:8080|URL|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_OBFUSCATE|Sets whether the AKTIN Client should obfuscate the results (response) of a feasibility query|TRUE|true or false|AKTIN| +|FEASIBILITY_AKTIN_JAVA_OPTS|Provides Java options to the AKTIN client - can be used to configure proxy use. For example : " Dhttps.proxyHost=squid -Dhttps.proxyPort=3128"||valid java options|AKTIN| +|FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER|basic auth user to connect to FHIR server if CQL is used|||AKTIN| +|FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW|basic auth password to connect to FHIR server if CQL is used|||AKTIN| +|FEASIBILITY_AKTIN_FHIR_BASE_URL|FHIR server base url the AKTIN client is to use to connect to the FHIR server|http://fhir-server:8080/fhir||AKTIN| +|FHIR_SERVER_BASE_URL|The base URL of the FHIR server the fhir server uses to generate next links|http://fhir-server:8080||BLAZE| +|FHIR_SERVER_LOG_LEVEL|log level of the FHIR server|debug|debug, info, error|BLAZE| +|BLAZE_JVM_ARGS|see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md|-Xmx4g||BLAZE| +|BLAZE_BLOCK_CACHE_SIZE|see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md|256||BLAZE| +|BLAZE_DB_RESOURCE_CACHE_SIZE|see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md|2000000||BLAZE| +|BLAZE_DB_RESOURCE_HANDLE_CACHE_SIZE|see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md|100000||BLAZE| +|PORT_FHIR_SERVER_LOCALHOST|The exposed docker port of the FHIR server|127.0.0.1:8081|should always include 127.0.0.1|BLAZE| +|FEASIBILITY_FLARE_PORT|The exposed docker port of the FLARE componenet|127.0.0.1:8084|should always include 127.0.0.1|FLARE| +|FLARE_FHIR_SERVER_URL|The Url of the FHIR server FLARE uses to connect to the FHIR server|http://fhir-server:8080/fhir/|URL|FLARE| +|FLARE_FHIR_USER|basic auth user to connect to FHIR server|||FLARE| +|FLARE_FHIR_PW|basic auth password to connect to FHIR server if CQL is used|||FLARE| +|FLARE_FHIR_PAGE_COUNT|The number of resources per page FLARE asks for from the FHIR server|500||FLARE| +|FLARE_EXEC_CORE_POOL_SIZE|The core thread pool size|4|Integer|FLARE| +|FLARE_EXEC_MAX_POOL_SIZE|The max thread pool size|16|Integer|FLARE| +|FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS|The time threads are kept alive|10|Integer|FLARE| +|FLARE_LOG_LEVEL|log level of flare|debug|off, fatal, error, warn, info, debug, trace|FLARE| +|FEASIBILITY_TRIANGLE_REV_PROXY_PORT|The exposed docker port of the reverse proxy - set to 443 if you want to use standard https and you only have the feasibility triangle installed on your server|444|Integer (valid port)|REV Proxy| \ No newline at end of file diff --git a/feasibility-triangle/flare/.env b/feasibility-triangle/flare/.env index 88b897a..2f3b73d 100644 --- a/feasibility-triangle/flare/.env +++ b/feasibility-triangle/flare/.env @@ -1,3 +1,4 @@ +FEASIBILITY_FLARE_PORT=127.0.0.1:8084 FLARE_FHIR_SERVER_URL=http://fhir-server:8080/fhir/ FLARE_FHIR_USER= FLARE_FHIR_PW= From 9a5ed4df9e572cde9f679109d9c7255d9e80c926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 12 Apr 2022 21:51:57 +0200 Subject: [PATCH 008/118] update readme --- feasibility-triangle/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 071ff2e..437642a 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -110,8 +110,8 @@ These are the URLs for access to the webclients via nginx: | Component | URL | User | Password | |-------------|----------------------------------|------------------|------------------| -| Flare | | chosen in step 2 | chosen in step 2 | -| FHIR Server | | chosen in step 2 | chosen in step 2 | +| Flare | | chosen in step 3 | chosen in step 3 | +| FHIR Server | | chosen in step 3 | chosen in step 3 | Accessible service via localhost: From 0d2ec3e286e62c5e78b0cc74a3e8e6ca19fbb535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 12 Apr 2022 22:05:19 +0200 Subject: [PATCH 009/118] update main readme, remove old files --- README.md | 172 +------------------ down-zars-and-num-node.sh | 21 --- img/access-usability.png | Bin 283513 -> 0 bytes img/codex-ap2-overview.drawio | 1 - img/codex-ap2-overview.png | Bin 103244 -> 0 bytes img/codex-ap2-query-translation.drawio | 1 - img/codex-ap2-query-translation.png | Bin 33974 -> 0 bytes img/codex-feasibility-deploy-overview.drawio | 1 - img/codex-feasibility-deploy-overview.png | Bin 369154 -> 0 bytes img/feasibility-gui-example.png | Bin 209323 -> 0 bytes 10 files changed, 7 insertions(+), 189 deletions(-) delete mode 100755 down-zars-and-num-node.sh delete mode 100644 img/access-usability.png delete mode 100644 img/codex-ap2-overview.drawio delete mode 100644 img/codex-ap2-overview.png delete mode 100644 img/codex-ap2-query-translation.drawio delete mode 100644 img/codex-ap2-query-translation.png delete mode 100644 img/codex-feasibility-deploy-overview.drawio delete mode 100644 img/codex-feasibility-deploy-overview.png delete mode 100644 img/feasibility-gui-example.png diff --git a/README.md b/README.md index f7d3782..ea80c5b 100644 --- a/README.md +++ b/README.md @@ -1,176 +1,18 @@ -![CI](https://github.com/num-codex/codex-deploy/actions/workflows/ci.yml/badge.svg) - # Feasibility Deploy -This codex deployment Repo offers an example deployment repository using Docker-compose and official codex images to setup an example environment. +This feasibility deployment repository offers an example deployment repository using docker-compose and official images to setup a feasibility portal (central) as well as feasibility triangle (decentral - at site) It is divided into two parts: -A "ZARS" (Zentrale Antrags- und Registerstelle - Central Application and Registration Center) part, which creates a deployment of the centralized components neccessary for the deployment of the dezentralized feasibility query tool. - -A "Num-Node" part, which provides a deployment for the decenctralized components - -
- -
Figure 1 - Overview Codex AP2 - Feasibility Queries
-
- - -## Initial Setup - -### Step 1 - Initialise certificates - -Use the `setup-all-base-auth.sh ` to initialise the deployment with self signed certificates and setup basic auth for the num node.The `setup-all-base-auth.sh` requires two arguments. First the username, second the password for the user. -This sets up a user and basic auth authentication for the FHIR server of the num-node and creates two sets of self signed certificates (cert.pem, key.pem) in the `num-node/auth` and `zars/auth`folders. - - -### Step 2 - Start Zars and Num-Node - -Use the `start-zars-and-num-node.sh` to start up the ZARS and num node. - -Additional flags are explained when running `start-zars-and-num-node.sh -h`. - - -### Step 3 - Restrict rights for certificates - -Once keycloak has successfully started up, set the rights of the certificate files to 600. - -`chmod 600 zars/auth/* num-node/auth/*` - - -### Step 4 - Initialise test data (optional) - -If you would like to test your setup you can initialise the testdata provided with this repository - -`cd num-node && bash init-testdata.sh` - - -## Exposed Services - -Services exposed via the two nginx reverse proxys provided: - -| Service | URL | Part of | Default User | Default Password | -|------------------------------|--------------------------------------------------|----------|---------------------|-----------| -| Feasibility GUI | | ZARS | codex-developer | codex | -| Feasibility UI backend | | ZARS | connect via keycloak| - | -| Keycloak | | ZARS | admin | admin | -| (GECCO) FHIR Server | | Num-Node | - | - | -| Flare | | Num-Node | - | - | - - -Direct (non reverse proxy) access to the services: - -| Service | URL | Part of | Default User | Default Password | -|------------------------------|--------------------------------------------------|----------|--------------|------------------| -| feasibility backend | | ZARS | - | - | -| flare zars (for translation) | | ZARS | - | - | -| Aktin Broker | | ZARS | admin | changeme | -| keycloak | | ZARS | admin | admin | -| flare num node | | Num-Node | - | - | -| FHIR Server | | Num-Node | - | - | - - -## Certificates - -Both the ZARS as well as the Num-Node require certificates to be set up as these are required to run the system with HTTPS on deployment. -If you have followed the setup steps above, you should have self signed certificates set up in the respective `auth` folders. -To install your own certificates stop the ZARS and num node (`stop-zars-and-num-nodes.sh`) and replace the respective cert.pem and key.pem with your own files (note: the file name has to stay the same). - -Startup the services again `start-zars-and-num-node.sh`. - - -## Sending your first feasibility request - -Please be aware, that we are using self-signed certificates in the initial setup, which your browser will flag and for some browsers will not allow you to continue to the websites. - -We found that firefox works best. Navigate to the respective service exposed via the nginx webservers above and accept the risk. - -After setting up your FHIR server, check if the FHIR server contains some test data: - (user and password as set before) - -Access the user interface and log in: -- username: codex-developer -- password: codex - -If you have loaded the test data provided with the repository you can create a query with one inclusion criterion "Biologisches Geschlecht" = female. -This criterion can be found under "Demographie" > "Biologisches Geschlecht". - -It will take a couple of seconds, but should the user interface should then return "1". - -## Sending a feasibility request via REST - -You can also send a request to the UI backend via REST. - - -``` bash -# request access token -curl -k --location --request POST 'https://localhost/auth/realms/codex-develop/protocol/openid-connect/token' \ ---header 'Content-Type: application/x-www-form-urlencoded' \ ---data-urlencode 'grant_type=password' \ ---data-urlencode 'client_id=feasibility-gui' \ ---data-urlencode 'scope=openid' \ ---data-urlencode 'username=codex-developer' \ ---data-urlencode 'password=codex' +A feasibility portal part, which creates a deployment of the centralized components neccessary for the deployment of the dezentralized feasibility query tool. -# run query -curl -k --location --request POST 'https://localhost/api/v1/query-handler/run-query' \ ---header 'Authorization: Bearer ' \ ---header 'Content-Type: application/json' \ ---header 'Cookie: JSESSIONID=node0v3dnl2dqawhlbymawm3cl7ib22.node0' \ ---data-raw '{ - "version": "http://to_be_decided.com/draft-1/schema#", - "inclusionCriteria": [ - [ - { - "termCode": { - "code": "76689-9", - "system": "http://loinc.org", - "display": "Sex assigned at birth" - }, - "valueFilter": { - "type": "concept", - "selectedConcepts": [ - { - "code": "female", - "system": "http://hl7.org/fhir/administrative-gender", - "display": "Female" - } - ] - } - } - ] - ], - "display": "" -}' +A feasibility triangle part, which provides a deployment for the decenctralized components. -# get query result -curl -k --location --request GET '' \ ---header 'Authorization: Bearer ' \ ---header 'Content-Type: application/json' -``` -## Components +## Feasibility Portal (central) -The following components alongside their versions are used within this deployment: +See: `feasibility-portal/README.md` of this repository. -### NUM-Node -| Component | Version | -|-----------|---------| -|aktin-client|1.3.0| -|codex-processes-ap2/fhir|0.1.0-rc5| -|codex-processes-ap2/bpe|0.1.0-rc5| -|num-codex/blaze|0.0.2| -|hapi-fhir-jpaserver-starter|5.2.0-distroless| -|codex-flare|0.0.5| -|nginx-unprivileged|1.20-alpine| +## Feasibility Triangle (decentral) -### ZARS: -| Component | Version | -|-----------|---------| -|aktin-broker|1.3.0| -|codex-feasibility-backend|0.0.6| -|codex-processes-ap2/fhir|0.1.0-rc5| -|codex-processes-ap2/bpe|0.1.0-rc5| -|codex-flare|0.0.5| -|codex-feasibility-gui|0.1.1| -|codex-keycloak|0.0.1| +See: `feasibility-triangle/README.md` of this repository. \ No newline at end of file diff --git a/down-zars-and-num-node.sh b/down-zars-and-num-node.sh deleted file mode 100755 index 86c8441..0000000 --- a/down-zars-and-num-node.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env sh - -COMPOSE_PROJECT=codex-deploy - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" - -printf "Down ZARS components ..." -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/keycloak/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/flare/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/backend/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/gui/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/zars/aktin-broker/docker-compose.yml down -sh $BASE_DIR/zars/dsf-broker/down.sh $COMPOSE_PROJECT - -printf "Down Num-Node components ..." -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/aktin-client/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/flare/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/fhir-server/blaze-server/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/fhir-server/hapi-fhir-server/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/num-node/rev-proxy/docker-compose.yml down -sh $BASE_DIR/num-node/dsf-client/down.sh $COMPOSE_PROJECT diff --git a/img/access-usability.png b/img/access-usability.png deleted file mode 100644 index 20b6b2338c45a103bddc4e2bebe4e7ab0bb5acb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283513 zcmeFYXH*l9x9<%iC@7*Jpddx12uN?zK~$t8Rl10@gd)8LL=*)p1E~Q_l0$$;hQgtFDyXx$us;Z~1s>-S7;b!mTY)3}+JR-s5lHoUX z<_tL3-McxIkK^bA7=D`Y-L1NOL7$TKE;ZNpTMX|bQ4jfRd~W=XERB3nS9jsHYTMSm z!g25N>>njRgd%_J>ONP-5POd2WcK>{GNcJ8{}lLDvQ(5s1Q#><0;g`eaCFRNo3Gm1 zw(+uLG=*g3KCdn&@qR1&^XCV7Rr5Li@SJM@gHNA&&cVPA2_zd78g+?GjQ!8m#;BxA z?i6H4&oZB+(viJrHrMG(da!Nr**i}}`x{hC?Snu|)=^HE!<{M{tF@_U2@fB$ccHCJEDtqO;}=k(Xb|Vr8K$7j0YkGo9?nm=(uIv!Z;} z_lm6c_W|_}<79t+Uod_7zT2VL%cFsx$?O}SU8Uiff2kK|>Af)ue;sfy}_TPn!UUB9R2#@9QpwB5L?0V&}$U}1;v z3ip4bEoGkKzv=$k@aR>eh^W3PM@d8nTPH^;CHTf?Q}r;}3lrn3&4_Kv9Gh;0?EvMU zpBEE!;9N>vRx->5&pj3m&ucz%Nom#A*UYJsuU3Q>))rS^IoJRCfkG(u{XURF2;Dd3?{l~018E*sQ9UJ#QJyZ+xDdZ@HK5Zu;ez|1l^RmCcr0iW7CI0sQ{D;6_ zj~>cjes=ibp?L!G2Y)X|6{-3?{+u>}W8z~}{6Saqn|clh&?85`Yef%0L5&H>T_A{Q$~x>tBx|WUu`)A(2{1BHX*x- zXIWlcXS1DWdoLmsyvX$M0%vwbQxj=bS_n$>});6pDOv(G|Ll5*@EDeIVFD!MsIgHly&kch)qWCk6#l4YHerzv46{zTf7EMZ%3QT+2H{j0b;Z%x?!9j^3Gy3G!Ynme>d zt_@UfE${`p9oI8~&}Sk%kLb@X-)VXIn8}7e=d+&1xcVclM-=$HYb}BI;yO7e=}`-) zWQ|^)eoi57*Lz#MQrFERVj>i{=(}QTq?5Z>-ohB*F;8d2areV3wnB?3Sr7v>bjTRGlOh?SV<;lFL)T=by zi^Veb2?rVV3vsjDvbDe=iX)ZbK?WUk6ukM(l)YVkUfz2aTH zo<8QU)v=oBC6%FOtvsiqq>3Np#!ccpyehply$EYk>ptsitNyFp>)Im%7`akR|F2t8 zSFhbqDo=Nhbr0K7pL>#(Cp>8V!x|Q1L<(yb3428ms#4w@93~Z}8?MzV(t4*gAsi7- zh<z%3{f0QzFcp}Ew`6DWnrybw{qLBwePfxMq#d?ypdtE(k_nv#!9!u@n? zZKay3`p(qjDgLQIABlR-dOjaUAIxUNq2i&;VcLfI9lcAsmvU5VTN%|xhk9Nt)pV76 zKeDO8zuno6T#(Kv)OlENp@6^OQ~%W!$CcxLL_hr5%joB<@q?Ej=uKYNox> z?rh7lbBNgkSXvnC0Bm}*POeX38uB$T8i_VMrZES3+cNnDe zgL+5&Fh?mnEA*?>-{=py8g#F!TV(o4cL}LyjwY9+$Sc;09jj_Mc0<1(mfvshX9?s( zKQQ`kmh?Yq3d zQ4OVSbZ!VvaCp4-^jY3t$zR$UFzC@7kh?c_W94%iPnu4qRISmU2Ym5Wx;tqVJ{m{~ zjXHzyPM%KOuJ?i((XKY*jQ6}JRSa#_T`M(#WYHoNzm2mPvaY6JpA|BpD)}(+x#K?mz>C4hp37@{>=Nuc{yV~i}j?zk9ugzMZe!tP|O4K!fYVPLpW!%`n#^6O= zMh)uK=?GhwTtD&8p60SnZU(np(*`{rG{@FdUo>1_;SsZwxoqT^&;a$sAE5+K9~00< zaz<`b1LM{nWOrgY{C2=6aOrE$*qr5;JPS{x*XN|z^Ere{RY3U|FANQMYF&TbEG9~J z_$A&tMZ*LZeuxvhnP$a_WiP~tgDosL~b!1SY{ovpR<0=RUv6G)N4 z8+$gfU0E9+&D0Vu6C&~88DYq) zv+O@~r%H#&Km<9R>>J^m6ZqH8azMlT_ zH7Py`V)--#M5^6Mm?@sKy42J-tx#RR7`?Aen##jpo!dO=S%kM|)?{A7@68e*54I#X zW{5*8i?zCZS(yjgM6DBx!{6tcL`)%^aI$xD%5A~tJ8wW1M%&kWaeh;X%&~}UaG^F@ zOvj(;j>r@LU^eA>C7We`_g@WUh2a^0#4~5eevywmzt1_eAiJ5h9nnnY?aKk;|7KTL z&xa`7=6bTai4SqOKvu;5PI&nIyiuD-wD$S+#*Jc7FOMAD3AM7VazgS@T`}gJdldMlby6DBfZjt z>e8<1LQ&s_+kV3nf}2(X8&~A8!n^)rHv61>0(|iY z>(a?F2NeMapou!~;=${ys~7G+iz>UQ*(i?8H7E6 z&&bICzWm=mgdTETFK(WIc8kgU1oO%qAC>DH)~G3_N}FH@vV`;U@;04dC6xdD|M-7> zHv$HI7?-Q{dt!m2zK8bQ$thnK+>z88W+=96k8*gkJ_cipeaC(OAAIybZ{o!jI*uDw*xmS2`Lm&+ z;XW)4aqmBG@eg*#OD}ZQwDR(R&)`a?-T(GJu<3KAc2~0P`a2B$tHb`Ud#3z}@$*)h zfWyN7?gz;(u<5@ebNLiBX)5tAPxgQL)h$Yip$hrJ8 zFR#ngA%i>jS#-rr(nHgG0}6!nn@mjM9x{-BPfm`N7g#d;`unT*FvQ~0y1Ks7j}iYU zx_&h?Iu4O-##Y_Doe*~~Y$X1tuKo`%Z3!ftX~Nj-E;v&2%~PB5hl1k*Jv5QmBD>2J z)y48dDz0v2JcQJ>Ya)9e#XX3F)py$+RO_3TSHENmG2qIA^C>>q(;U!@k5cK1cg3cp zGYC^>cn72PD~caSBEPGLreHFKzx;f4(3~=-qO$f%8oj+iK_|~iap~H&v7&viV~V_g zg@yle!UsnMMxTE>!pYosR|asCXN0LmGgF5DILrUtxs-q_f4S(WmOQxeeM85?IqB*e zTGE`JA)bq8_Jh*mAMNu>jS~~Y?uBJLeSQ6V>qxh66H|oFDLJ2>g1|#bJP!Pf11)T- zb0_U?M~qgI)u*58uV24!<89M0)QajNJnPD_4_5o0q^a(nQZl8-iGL^0+#+`H`(^9(A`!8Dui^xC!Zr~jh#{Fky38gMaHLHTrM%W^4dT1c$g#7$jG zTQX<#LDBGdL6Lm%f^NiDrihqCKZg8hO)0dsxOkr1mep;953Hfgsi2|C-$B73rgvfO zo0#3n&wh`#?b7(<_y<37OvTF`#hY*-hOB5YI<1$Iieo`syxnE}PQ!5B{3u+#Wo8yq zGczlVBPC)~Tw_Z#Ww1t2H(*7H9)XO5Vy@~*yppvOa49~ts$0RL{zER&y=gSDh zCq$j6*^QhYSFD9$GprRxuy4gLFJXO>zUjyo&Bh%}FUBYdrAfJzBI$VlWflIboFp?@2> zni^VFz2jvl)6C*8I-T(x!E%~ZS3Bbh9~s=hTr?>5cEyIUXd|etAr>PNn&2OZ`1Ck_ zHI6vWTFXD&+@jAiPX?}GxPMGp&8^)->2$}tQUpxCE9r+pTcooZ9E;Fb<$}L!8a@)hOz0*Us5_!c@8Oj9H`7A`?q?+G+yCGzwLL_ zHte*sYNsYyS--5&#r7U&t7ANG{G&^ObMOXbs-Uu5pJ67d?SsSK?n%m9P?YvhklxsL z-2+OcP2(=fi=cCdmdY3QU4~nd>mW{F2<7r0?46%Wd_`%*tZX-iT+6zV*$2dxy2JFYpjKWhEp?%n$w z@q!q?T%w+l*Hk1gklz9moPm0J-Zk@dqb)WDe;#u#hB_;lMM$j=;%Z;mn_D{NyOyFw zy&kfO>kHS={_ICw2a@K~UeW&|J*wN}~dB4@a-p=hn z%6|E(4z9m|C>{vj?V^`ij1u4Yv~`M{gb)XwzE%>itXx%t2+GJzWV#g>iyDIe(Sb z;rzbx z?2a1fYLL!}DA7g&3f~oo?@PQbo_Y9H(r%?@@hid>C|RxAwP)E@BM5MH`rDSB-7pS| zdn|Pu=wgS#<5kZ+LKDf-ejwN+UpI@rO1JP5zKLYD?u{!d_z<98xnKV$vZrtTk9#dP z6`X1p#3sSZtEQvq4-GnW^FjmFVR@{fy#5AW@f;w0*U_KBd9F%L;(EHM6KU8a_)c4|%`##k$|G(6+M>Z_>y}66R#J<9QWUc`}%oE6HlW zgz4>N{)sM?Y6U?XaE&^HQSL`&&O@U2(RE*SleX^HYdQzLr)@Fg7cb}cR6^Mys5>UJ z-TUq!?v+X+%;zZPWTD*sQE}ow>Q|Gis`;*$oNTxOD%N?jY9e^GF=T|lDnQ$_O4PPJ z6?rSmPD!X{z9k#!w?Cw|ag4DJ5p*0hRt<5D0>fPzMJxupyvxFLm59;7msUU+tA|gV{FmR*1qpmf2_7I1j`l|4{?ejD1z%rp*@<$^6YkADe z2_{x?Q*KR`!AGqelaYDi4*lOvE3Lk{FJ7Zdolnwv-RP`U0yvy30f5<0uoVtM8t`nb}Xy2MIOUo*S*efdf3VNRvprs0}E0?n$ zpmI4#J|1M)s=FvYR&Kf`CZTY~4{bf+>e{(K!YzZAPNYr6acPMmG{UL^@TsTkcQ*JS zC4E}YDN3YPiyf-!Wnvx2g5KXY=(vW=BWTBO05$!4JV@Y=F<QE zy<0Dtwf~{^SW+%m5)kFC|Z~u<$I&==jvy#C-w5G<-ZBV@b(aaRwZDpf! zfQgo-4h!wA>-fSX_#I;9G!(9HWIiG$866SM`ge>biQG{8B>)(yC;^XPp54w1>s>bpVb^b0h zb?9@OsB`z;uWWJ`u)gCqpStFo!}5^FVVPJ*-)VP;+{abTEtRrVwEwyC{(t^_oL-@y zlk{0r;`kN%rnEG@s%VoynFgx)QeL17g;KbpX5GqMa$WNobkbqfsjN5c?3yX-O>`Ud zcCm@E$?cRz%S6VTPDwmSQKG?5lNgBzFT}UoFlj{HFr{{l z*!RXuLed!aci3OH|F+_+Vq!=AyVH% zt7tZX9>rB)G<;ZTRFTDMba4GwD23hXU>*5n1Vc>8@yS7SVS=c2@NvSs1+{1vCl2s) zm)VAx3;jEs6&HU0K5eoFQBIa(1NW+3rq)qid_z3^^IeN+l}x)rRLsLC%j?(x8R;EVWLR4g-lD?15Uwa4TErIkp?f&Jfo0 z=!l58FG6+Ctsn=IQ*I;q+G5^Ne691=%J12-j3Bd0`)KF!vgXqKA3yHBGCJ&lDg0>4 zlF;=ee@Q%tX$uU2>i7ER#$l&V{KnMF{$VHD!tmMeozGjdcrNbLvKVcD(Do=Y*G4Ao z5v(iIvCP1C^TpI}=Bv@e{BW#NVE-LB-!Fb@EUf-gng)EKx)}x86Zbb{jYRt&=P%WV zc*9OH=_RILBl1%B4pp=_t!PJ63(L5;+q$lc`_u^b8D>Xoi!pNcxj?o2Es()8C$Gzy zdh~HOP)+cAup5%p915(ktWEdIa@!~B7W(ghs%1ZRtyy0@X{Y{Rpl%HJ4lQY)K`hLE zVHU0+pWNT~TAOQXq8+Uh05v6?tq$c*^SQ}6kL%Sp1svdH88szuK5`sX?&|H8SSsOS#}m7N z@6)OY{C41#V-+&;ieOMoQM2zO~e__MB0C56kl4uRk1MX z77`c<*$SuQ*g~CGR@6P$*RLQ*{;^y|<`Pd2*4@&_B7!YH4e#!rbe7q)_Oke-ftfB5 zWp_E$vcBDqk$-%+H6y?gB+@}L{MAUp#FYk~9ku2e6!eRQoQG_Jxw9+%W8;R@pMAY! zlL;0DpIi8Bf@)66!(;b$ce%#S+`FMh#p@ZqAQ1F6%FG8pYwK3Tm~wERr=75_@9bQ{ zl{%+ZrK_%9w7E!9Z|$Ajr}GMGA{=EYY&V`}T3UZj+};SKT?_s1MCAXXS0DJV?~u7< z{d^K3>Bd^BqLU_xkV_?uCOaXDKI7!(uZ#uoYU5L%!(^7ejGgcoPlBp=mROiMcp>o+ zqoc=`7G=TymWy0Mca60~O~e^cO|ugc3faEZpCt6x?={+E*!K?5zo4jL=UhqW;v6H- z2mKcv_dHs%tUXK^#>(C5UEiasmohR6Q<7?%YGZ%~@+bfCg=&_Q8II(Gz7DMl``N~f znh$>JTh%1k#HPO@0u-8WoaOxmRLWn)5z?UCuRxFwOmkmsr@VNrBkK01s~a*y)?3Ui zFgTeu97j&uY46~RSYZ-0b4H%<3BzNi1J+?u$;C02BiAQ^s9uUwWB2~#{A(W{LaK+H zWsw^0f8)_Ep{|NJJDqczB3mf$U>9gQ?#rki7|~S{TuJx*O50qk68YteHhT2ZvNb87 zi%kqHYf@T=D>&S7?_jg$edRj`Ax!!AXA(21#m>7A!QGJk$Fz*I5Q3%Ho6c7Zy?c~f z`!!VL7`U~AfNo-9Vz+2VkS5(!zRj}JNdAP#Lgj$s`ZZ}#F+AerLe(5`%a`sEkp2{w zF-_+PY8g5)l{TW1qR-Z}6Ev%lKjgT_dOb=s`0R$qj5lU{yF#vLV4c;i!AarM)!X-g zN*bSazR&L~yLxy@spd()9A2K`p-`f2jDk@1z>u15VirJhc%IDEV^8z(RpI<@O++2m zma8?{*yg;X^Or#D_Ws>Uc6PRMDeBM+FS#C)(U>o>T|%ylsdk$a8c-tr@Xt`(yyiaz zF0C~KT4vYCLd@Ckr+q1e*}yqNMpR`#xVOH{o|m_vSQ_avRgG43;UFywhs42~&L_9( zw`&xSR+LCig8MT5yIs7S{seVQjt%zv_nW?*REl#UB;vc+Qs3bXueEq?;l`u)L>8Y8 zNlvJ>CvwIoO>W8MK&EzoIO}8$dk3EX&Oue|5-D_+;(B zY~*G^45(c%olD-{crdin-P5z#0bFFg@~+Z3WAt$NmSbn&$-X!@Z$X-=ZC-8u@S({7 zo#N52@J}<8GxfgGHgos2vpiD79lp|1uY)a{V%8x0!RlDw^uG;G$2ta%gsY*f1P{QE zPiy=oxs{7;(ab;4bJP}P#-}Ji-db5hrj4h7KBEtV&%-)|`4isrRE3}da(>_v;EG7RMhSUt8s+PmWEZ!vp0^euFtZtBVFtI~;6LKZc@t`s>@KF3Hn z=G#cR=*sVW@K-o#{1GFIdw_X*O(`fHsT6X4p&oA2rp5uO((yCa1#Roi<)6oE3hk8c z&B-i$SVV1?unP+wd|UxFLdHv(t^911{fy~&xVgIqf_*Yz*Wmxe(^-klV2{ZQg2 zRJ*uDCq*o;pV5r+aJ!Wb*@4h^EX&WC3&f)aJ_LWd_`v}I{~EaSn>kGc_mMmayL=$3 zGBiceQaPzYs|(0MwjM%_P2lFD{Iqe5(+EG5WqxC%AO_Rn+s>TXu#!2~^H*QU-7G_` z{`i8Ezhq{5JR68d+;t%Jn{66}W&Rb7@SLU|VNyi8M|aoxOyBytgU8{7!xRFTMQbOo2wIq7fO>3c-Z>xk>M%PYws^ioA7- z#7Ww*d@Y%~obttxeRkf=BbU?E{U-a>!5r*CK=INtr6Mnj2pV(5K{`?+ZP}+2=?)I? zBuQh7JGVZwiM)C@TIvNeA>h#Ft~CqcM2ZyD69Zb3n$k&*0y6`{(Ynq`f65`a88R?@ zB`n41mNCWLIjnBd#Bz*nptG}V&S3grD=>>B89jr!4x@TwX^?byD-(V2ks;GtF~|7; zY=r-(3MpOr)sHqdT3hg9CXcj(Y8lVj8kprLI_yM=I3PJQ;#X+>_P6|7+i?an>M`~` zHeVAd@AZ(7Ijx{d_h#lmUE1?CQZEEyU)n#@KP11qIWgixbGiqWY@W~8>8;nHK(UPN z^l1t#QcXAUtbzx|dV6@@f$5+7WCrMSm~4gw9MnkX&#V}LnJyzwO3c%!O1(;+BL@^u zN3RvB$Y82Ga;0cvP}?n<`C^+Ir!VIkXC+}QMcT#1!TUp>d`JMENT{lks3!rbI5l>> z>j&d2Am{oF&F54{Fz`;gl<8h!>P_kqs-L#<#8~=b)_&~yZ#RG1@P~aaO5jE~J$IX| z8d=|W!-eYMJ%J<_*gPZLbT(|fmM*gJ9H0{GTDLqrQAk~lN$Ud%?x%D1iu;E{Y8-*& z{Uf^YdV5$rj(?#)RZ?K}7mz}~5X^>Ypk}njS-i04=7xrE;I$hSnl9OB+Ux-v5Y(;I z4Rzqg`Tz}KcB zAhlB+?~e>POVbX0oC^ESHLyqX~w?6^P!hq{0M+Ts_q!wKU$1Io*qC>{(KQ$YNb<>81O9L)PGrnF&;ug zn@%8F=C5D>m;q%QH!+#zhal)1MtL)KwA z^>I>cZw0%zf!>x+?@Q1zL!H$vnp*xf_q zi`jYGeRQ5-JU`Re?VEa%ly;nwwo06_q}YOg+9dW}?4=ey1M|GeMal{XHt=kN+o2EP zvGkU5Fzw4vDm#?m!FjjZW#d!#y*}wFu;hnBKrD8>r)=a${54QcPVqs&8y*K}O!sh}ChB?t z$$tie3<&{9;D$fs%V`$rj9LHXOUHUPkLNLyGihg!Mo%3nbzIEi_9ww`>1IW1M*~#w zVdXjs`2nsFce+)tEAgvP#gNqf9dSw-SfbJakcpAZVQBM~j3>m>uE(w?u?vSTo>_PY z3*3@WhN|e8upKCo{MEJ^rV}6dfdu!eqAKk zfZg%Hl(rrexEL+Hyzq&m9L@pjK3UBTxk38|oV*jOdW~APAzb;uJ71e(rs@2k&#I~Q znq2RcFSvVP0I9OVD9~88G7IsoK07Bgdbg$UujQ)6RCjo9mR77``_fzzUMl2RGn-f) z8yutIt`*@ze$K+sl@USY^gW^NBFm~s>{>yVeOOPWJqq+VhwdVb|BiEwsBIAW;h#UR zSzFMc;YqK}01oE!eY*B~cZsS1w2{daVpTRXXjgsc0K7*)ue8C4DGv62)`2I}q$U!< z(_O`qghOw!*Fo0uLb`|qQrE@prXm8^jF>2FZPR4DFB81*aRqhv zU`QJIRT!?6>%47Xo7?ybwrQhd_&uSA1rXjY2i0OJuP#XJxOX+yr_GmaJxMtp|5GZt zzzl$}5$vwWDc$i{4l{_3Xkn~>w;1_Rsp*ek9*?rQ>zqep_e;}H&{Y5Nu2tTQvJ@os zeG`FFok6XB<74zlK!U2Y=a+bZwxry2i`M$B7I;NbGEMm>&>2yK9_{XQaJZG#6|J-4 zd}bSJu`cVvl`|bNN-b3PKV4&c%~3zUFTiwZuKke zegn|%Jhd1L*2q!*Vxi6zXznEI5oDK+>4fdtIGP55m!&@+_h+gW*ndKE0 z9+PsGERm@^Nkb`G=<^BDvyFIWk4JB`-=Sey0viH zia>t9;J&}RkbN8FDqErHO&6~e+2))nMX}iqqVe!Ivj8rASmYpr zH+V{MzzkwSq@tVUNXBqz8x&;Td}|4U;=!c=-yrXp36t?;362JD2ce-xrS&tV7PZ5H z>6u%__A@YZ>AmT;DgN4%z|O)K_g##}`S#635I)Np&tJZGX+0o;Lh z?b$u8Kp=soK!1k@%XSnQ6igP)`mea9iY*)a_C+!ZI6smbjUX;^gwU-90B4I*9!vhu zOt9-vj;D=je*YxDyBYcn+UYmwU} z_M&_hT^P0iErN(&0l`BwD+?fi|yJx%B=f_FE2?> z7cxR(9{ss&P`-arSXs_xa?NMjvfgK+ySgAVKqKSyD*MKjSX_i8*cc-Nza;VQ(VNce z2Hw?K3Ul>@^LI-p2drUMm3BSG04QVFw|H<#a=ci(H4-4Ab`O#+?hj$yH}e-vXuInY zQzj+?H$krs^3z;B3UJPWgsn}sdeZr6A7+~E@OaE0*AWwPcK?L~Z2GSSGHPyvW^HqG z*!lDH2gf8pn36d+pBx_|3&!0K#wnRC9_(QuOGXl7w&&UurKM*0R7o&V_hS_t-ZSYk z*N8&UbpfCjWqaa1qc?&{D8{az0J8h{Ce@7Vggzn2#%9JJ@HKWyF)L5Qj?E%!TMV-a zEJ`*>AtE{j-o9e1Cyu zD9X{?tW0-ob6g0Wz!Hnrb4bwiNL6bbED%1r?NZ!0_8lS#*)Kd^I?bXjd5{uX zqAWrJ<2B}oK}I(L8q=6U`52}c2qcpUQ0XKosp$+&?vR&LtoOe9(w$CtD{t1r@|Y@` zLaH|ir&q>dm8DJzMlQA;Uqu-?A#NOS^2emIMcrVJA`71h-G;Z;>go}I&CIQtSZC8R zX>5G**u#eQwa_7ih*8o2;t^R6FWm0q<>mF;mXSu96Q!y5q8g)7Qnar^2=yaRC{TaL z_c~?+)&=Wn57k@Wl{!5VdFk09z#jx5Qv6m3xM&U5(ZRe@{TNgNFxNwcK~IL=cXz$c z01u@PEWfQPe0s9(wiH4-&5~}p#L-*Mn4ASUG&RWa&tT36N=csS=gMvNc|Q z|1|-o5KEHZ2OBgUN;!{nvP!#(plhU42AhOG*L$xU?{!?JLQ@V0+PvMSkb!)%oNUa%kn158?$u4Xfar)8oN1=rT9>h<`(fqU~JXT-* z?mCk30xS5fj}#O-m`VeGVRnM%Qjok3<ZQ(CVCQm6Pccq8X)oCGePgGuwSJL%?-BE{b~g+_O>x;5oj-*A2EnJtfxXFrPdf4uuAzF+0UXV~;FRSpu~EjSbu=(zaWqY`*~c-IcKwy! zIvL2>PKO7ublv@Q=bovl>0#NG**e9)Kx76Tixmzz)--s!r|PTW+OYGC+V}=~eNaoz z?5XG4@GmlWT1XAj0x&>eEYO_SFxS+qrXE&(3K)R7_t@0})Lf+9W*`0qTBQXVKy&6S z@=`Sfa6U^2K3TzaN;hE%hJZ3MFK~lfp*G6ljVF_?N~E*ORJ{2MtmNDG4QIOog39?C9IB<*4QzOlLvUXTyBQ#bMI5e8A>9Vep$SqX%$vclw0A~VmX^L1OtSmV5zSe{-LeBKGj`z>r$7%< zK44in(|fff)RHvlYM?rE@X=vr+LGIye@OPmKb2Y|ltJ8vX~B>|fw@^=s%tDYGB7WH z_y=DMs5Kv}Q-`oIV%U-x(g}ox+viq&fEs(F2ciAXRiRP{kYZB8MEUG&`P5-dTLDrl z*{iuAU!%0>yCX$;s+J_cgDTO3MYNfzhERA#v0J{Z@RW%|{s_WA>eN2!qy6963YV#~ z3lkMy-@d0I%)g`tu4%hG=#a1Od&HloIJ(G^>AjK*VfY?7tUqx!VLv451T*Ix#Z}ft zq5=t%8XwG}^$4m?aixz>&rk7zXeI^*hRvIbCypUUMs$uG%>14ZCLxRKB9_bz(`7cc z06e4k#K3ds#voFLe#!agfvC<6*r|$obhZk3}tN_AcUeL8CUR+G#|mSiFPd zY@S|SL!)BFve1Yk4U8#8bVzK&62!c>P8xz&hYXM#^fL^PN;=l)@K-Uk#S%Y~@EDsFeO#!{h zqNX{kEP2gk9G>*mC6zT z>mOk?M>;1^^h;u!BN=;8TL4Lt83c zF9UH%{ZHf2@4^kZa`DKq*MOqG&7RI$VvWYh!6q*~L$RnS!*{eEG+#w~yE2~(76F-5 zhIR$xGLH>Ct>jXWmR2bHXg1A`C`0p#iszYWX~Hx0Z9TtK>r>{Ps)}ZzFAT*g(ozqM z0?~Zq58%cDk{!i;V`D+lQV_|j&iwrlBHGyBbyn!_Sjb_J0ax1WKvG-D!7xP6EyB1- z1BI-0i_S_Z^d1ew^+G%)BlBOw+E&}NqvyIkCUz12^*F-r(~h5ivt983=+$AQKbQ&NKj-2^c7k?GYWeWr-0hSMy9?LFibU}rTC|U>Yd@O>>jH%mC`|x5Q98vVQSzE1!ww-3bTUPu%OQh5~(7UPABL-+RT>;mLqaMrrxeBZzt{U=j_Zl|TIgUz>rT7#s* zBy8nutyz$z*q7E00F;BnuuVth^GE?9Y4U+5wM+4uKTY7XJ`li+_?DjT>d`{o(eqdT z3!^c=0dCFVd<#FmF;Te*elU5~JMs%JJ|Hj9lPD;CcP?}nh0kz1_j?jT|Aol1F9cfZ zk7Ts&1Y#V}mFzyj0mt?DMq4WZ${#BGYa<0ya6wwTvK}te`OC!?45lTEa z0jx@w;%yM+>aD#>1kjo&N@Me;UX5T3ot@K(bwm7(EDtc4Knsf!+K*sL7uvzCDda$~ za8=0Y52XTC=bUhdnYV^Nyy=~9{Hr??{>>x_&A%d{`OdgtFP?fZzwJrSZ~G=|ynN9Z z)P?1I^j2YCD6Ub8Rh^OHbl=Dip<=X`T{8W_!K7<(y?U~|%7JTYk7qwM^`@YbNazST zh4yDDq5cnV`q+9uWyEFVj{5_RV1Os9m83)8XmQ_Jqv*m!$L#Fgfiw}K5qs#>0&*-BU6`dYK>4gouiMSA%021$0bB^}hFNI6 z3}DJ`$TF7s!0xIQNV#6j!qI$2el<9avCyvi|-IU5Z?GJCKz%oTT`ip8gdc({#k z*!xO5i1RjkD)EwgXwp`y!xr|d&Tr@5ZE^b&FWjhlRe*gNP3pp|c{Jc&2OKw%PNPi; zWWrU2i=dBsv^TT7hJA6<&%)kKN-RABjTZ7;ay&R^@fzFClcE(HE4|~aJ9^?Z<$_cv zY|YrUeO{=B;+$_kDrf?gRnNg;HfKK+PND>QN}&{5!xbA^I%VE z@I)3p>xwrK4d*AUw3h8M|7_fkER-eG{>mWkNLdwq zMXw5VITcAgS)NGogV#B|m6|*=vBO&0HGJ{Ge-q4dtuS(?9+2%DL(w8moVko|0NI;F z#9xpBO!18>i3hADDAM_*KVt-7)M|8XcYj28%628gw-h4aMN0v?<+3$hThVTqJ$4=J zmeqnMZpwxW3Y^i&{b zy$*r4`a+c@85;x`gDG$Em)8KT1tB^%0R~MsRlMMA-P6^!K<;2qnvot61uvoC~?9SNAaMR{=?T9fMW<`3M3FJ36Q{eNty6i0p6SdyT z^pDK%>&l!p%7!3N>NAlvM0Dr#I6l)94`-k7{od{hw-q*4F#m9S+F9xBjPZMcBr%34 zQ>1NuL%nTG14_YKab`qJCHC*kb6fdskCslaHUH;z)K`9|DW|2FJ4eCx%v|0}Fmfm8 z8-lRN9KBgnGfp?b$@`kdRN+0TS497gJVy=0mXtfi$EER6t4Gi?aPW$jm-Br88N`_X zr{sk3Ki&S&=#+9SiK#PRtYH}(VS3oc*dN3Zw5@VmA;9pts^cqsw*Y(}I(Y5QBV~5K zd2-fkSM1*DDw@8YWjc@4tE=|ofQ=Qo;AbJ;Eop)ZDZRb@?GnrHj2^Sf!2z895}>*u zVW2Rd;-W}^^)v~BnW2nSt6_+unCeN!kHnS0(@o^mFK3$tD}#tbCXzw5$Bu!nf)nY% zJkY>@16l&%`5*(1)rR<9!gE@8DHBZ{o$B@BK}XefUjjzv_wV0Nmb?`}qmHNIhOL=B zNy1mw*V|yZwN0~Te`MUpXkEU2Gw59xoD6T2yv3n2Qs%tL3Hw?Q`o`rv=WXCTSymMd ztUBK~2E8sRFXzyI=~9isQGrRxOV>*gl1*WEq7DJ*r7&L&jPzRlvSt5Y^GN^gS`JOs z^AnY@vXdR`p{1A@r2eXocDy1V^)TAda`fV+ltGS9bkQvUYWY}#P6WlL5}jE-pkqw; ze0!45`NV2`e=K=x$ENqYSDS5NgT$L$>?&ScmOnfX$O>xY@k94uQ!A-#4s3fm>bY&_ zb<}}7eSVg@$B&y5wSKo*F6%pEP0H$C9tN4dLH0>9x4W>D!=i41MjBa?Gl0Pm)SKNU zK(RXL zSRdpHpvcC@bIhwk9!QCbiq4vOdeo(M*W#z3%>egK*jc1QE|_NQ1I1AKwI@Nr?FOsR zslA#45D_NdJ{BzGnQ=@gB`TMyMVD(0}$ zF=e8`tgPwY1Tg5Wls=~3ef%HZ)ySrv{q#cBH7`?@xK%Z<3rm#C+FNJahcw11G?mz} zvGa?K=O+St)!Rf>tK{%k1v(il9wDT!0m75b41NnAnco29Xc+0136nToHq2Ob+5GiQSCJ2ZX>q`$;t;N{^nE2s)(RNeNl{YrAU7kGPpFZF9`csC%_*v@ ztCwGyYD68J4Lv>mX8-h`xTaMhp~*)_AIzsnVy1U5#NAjOgQc+*0+XR)6k|~pZ@TDN zp;1Vql>4$?zg_`oHUY?vIxUdX-FGVfgN~s|Rsrht^naWs=a-h=1VR9?7j%F&*#%Os znrq`RM&HV6cGcZ{in88kv%*b%4goe%*U~D>k%kS{It;K6Awxresf}fL2&4p|op$_h zx3~Te_TDq9$+T@76$EL5C;|#n>8j6Z22TINNaxA~?9X2IULKrE$&T z{A%@cbq=hPO5EN$1AcMy5l^1%sBI6V!uUi*^DAovBixTN+fnFWhL@M0=up6%AKM0E z+u?3kSJ$J6!nggBuHzqItAj$p!NL2v;@`ewZ)1jPY0c!fa1rSbQ&3Q$!vY@;m)18R zC*uzx*e~_$tZ(o?gM7*}?6xhtpfl#O!iw81(qQ_S%2s-VKM=Q*tX`Wx6;sRRJd#IF z@7|6!{_~Z$HBiyEA&XBxncATg|MbfbPRj?1$;cJ#Xb}1rw`6MxHi+qCX>i+FnDX;4 zzhmK*=S<|$-^tPZDEa?!D2NLblnCf7on_@uoA|G`^3R_ep<_;FY>mwQ_v=N+?4m%6 z;U8Qu-653ybF)DU;Bp>LGSXTmIqJC&E8ehzdqbJ;6x9Q{coc6gR; z+}p+^#O9gkjt~7m4|#A77?V4EQvcozA!vZKU`Gt^F#fcO9WLM~15oSO(1?Hko7l^| z$aFR>UEPyWQBgNdO;76Tf*Il(U-#yaIi>zcTb7yd(9oBYlV_^Hq{W5JJ22fx4|jNs z|2Y#NlJf99w)}jb(qF%0f5n z|KPn7^oYi`^i!UYMDCP6n0}EjPDv6?A;CXWgy4k85f~f zgXcGvmM)$>dp4@$<{(@Ad1&zZLa;q9#w_!)5o349Pg1?3{T3z1T6h@3KFQcO| z$+=Y(d#pP1Yz z#d;n%({;>6-`=;awaKG&Ix09K%5ci7$)ZzRrz%h{eUlj5w%UmO{t(hwlm!6VQa- zgn#__5kFDjh@0Tu>GTu0BBpc9qCP8qr+V``zc_e%$JT`Hu>rHRC#9t^4-8V7{3d8u zvT|}>VlibZ{{FSu)%sRSpgrfb{6Pxihu;s|b`XsDV~1+0Kr$=aUE@Xnj`g>Vo;pq^ zNH4d=p0zJ0N4e@mz68i3MZ9llKujJG&5D2CsS6TL$1q4}DXX1mo3WvxU2gZyaOBk_ zCdcn0-FA$!dpz=*A{d1MvXPCCxO(*}lEV+AcoeUeege7IRbw_{V@e4=e~7u4Ik zf^O;sdTP@6>cls<=UrVdtmDjV>+J7}i;L@bbP5An5&Gn*JUGv{_T8kEv8$xf&TeE~zu>^Q-%*=2I?1u+H{}%YrrnF+g zK}+kIzBf`J|9-`e?PePX)fM_S`(35g)dMZ!pjrQpl~w7(3ULXVgwz(@_?84_=zWt{ z-*KqzaY`V}9vO3yM(7WS*i$<^yzQ~{FM$-G@#3P8OniJie}c3PGKX43(^L;`-gXo>)Mp5IQF(}@Re;`$uw#fJ$^hjN>zHr zZt|7sNu&Ip3BIX^mnda_;5CVI%I?i&_>dxaMm6jQZN!eORkAZBZjWtlPEHy~#YenM zNEpoEYwbDJri`fE1Fbw|%K0x;{PzbYThe!NCJTV>dz;SA&XfH7xy>_^9Bu;W0W^B+ zwZXsk5rOil)c5w-Hhub}8r7rxI5IMtTh>R!r>(~)sNiaE8l+S7|AAqaN|aCdVG*M@ z-=#}R4x$qt89y)3>Q&z92=1RAVA6onof1)S5pwO?!?cVHgfye+^8&SaV@Q?p35FjG zMSts~{^CEf^m%(os#aF%V4U^3jt;^N8#fw|V~U+Y)6>&qjoh0-@Q<~Joy)+|?d6iv zX}Pp{PI@s`IO#d)MJ=tldfswJAnHHMKX&42RMg4QhH!YQfJwQg$86vJlxMIyDk|G1 zFaXp3`LpWda40I}rfGbEb8kVyYY6C#YVSRGU-YKMKzXs5m!1$9P++*KfM8$;MWO3% z|H@I@Hc?ho$bMeQjfc?zt_yp-?*rHSYinMTSVSk_2Y$=+9B7xY_2;K0B_($sGM4u+ zv~B1o0kRjS$*v>&_Ut{x3kE;)xHiJYho0hQdc_-|(_GrUF-b|o(>ZM!z^bAAVc6>4 z0#nG9+I3t(N`6us`$}7i!e^h&8#iyhp0tG4*PncC{)%6}KqSf_8bjFV$?4tDckG6s zZ{~6(y1RNpjw#M40_!KQ!Z6vI3L24bL~>XB7B#k6W6>CaEpZ+_wZ667s&;bq-pj-T zt2-1Pbb8>!tC7-k5+9qIAnmw(vl=5X`Zf6I;mzZvfzOUBd5suyX@lk}hqw2FpH&9G zcbiZ2&5h7AGdl$cusX7}Pv6kc20N$rjfJZc=Y|6Yx>lkj-=;P{={zT#6l#t!!o@iTdgB~AXfH^C@PKhbrfCATxP zlsijEW@bEh+jfRv$}0f z4RWZRFz3oTgv1!D?cH_tp<*vMrnw*8)chZub>__BWTUp_}=?v#ww~P%9qZGn>50hmV zy4z+@vw%L|_sCq&OVj+UGvcE<@%BYGC{8-naaH4Sz@~zpR?{j-n2esPsVhizWnFe~ zFbNwdONq}jt@*Z|)LcPn zhn6Kso+7_|dN^*=w28oAVINTWvnS_Yq(EN}N3S@0U_XhEwCR4m0(U&IS}yR=c7~yq zjXk>0jupoQ`?@w9$EbSXv=q=p<_p%CMKF?E;-z~mEyNHBGX@NnOSpHPmdim3_t!2 zbe|61%9N+*v`vm+Q;yiY}8LvOUj~)R_svF7rb*CARHf zr6Bn*;sX}-r=YW?j9}gJ>MR)c&1?|`xlC4l6UTt)tOB-*(Fo}~U;{%3h-;0$pLw)S zeoB<3b^)URK8^jC|H3!?$7=uKYei{6zg1JSRCtpRs@kw|pUnagAydts;3uZ6Xle$w zhpwEy`QcB%RibH#K`}*2c+TXMh1n9Tq)nW|x~VDr;mw50O|8juT&CB1f~`&Wt@b5& zHX1MM)fK(vYqgJ=0Od7SM#XMNFg%r<hoP-V%|?y{x>d@+h(E=`5&5jDh~c0@l}DJr26IRc;@D z1M%YxH8r{zo_*8o*VWbWd~}WP-*-(Nn)NGl9Q$|}lN%5(xh%;U zfs@l4u6<~ihp@1DZODf z^6rt7nNgp%}8Z*zlHP&$%@cBkmxBNA^CjjB8n z^2}e3A+*LEN$~W1t^3%3C%p&!|+HxDeuNG<+g< zM+8Y~2LYRd$J9;pK)vCUk{!CXmZoFf@874LQm-I38ToqkG@JC+I+>^BU%?nrBBaFG ze{)YU6gU4NCm212RL25G$8fsVN{Ab1t8>DH5RanKmYb_iYMbGVt(6s3PxBa>D@Xs7 zjCcD#eELLRZUXAfy#Q?-zRSnYFa5-H+1S>ZPhg3*r+zM5}IA zJ&FfY;?!TX^+0h1ZhvSr#{nS57OAdy;Lu`Tk}Ts;I(OOW3a>0dCcjr z=Z;x1KXx{`j`T3-lJ%H4?p%01()k_TX{x=Fo^#bt`CIpx7%a;xASxZp@D?y5OmPNi zS&=f?)~-S4@2A$k9m+gAa2MrA#aWn~%-eS>qVzyeSC@|T^XX~({?c4WYV_^|r;|+< z96RwOyqd?8FKZK4{Tai=UQ8{}blT^0D1-J*r_}rD#8E|i^WLY?y^SqrMMc$oR%rdo zzM)s!-7BZzKI*Fw{gmdWCSl8QYLiOm(QEMWE09tjT-=^sZev|ts8A0*^qD>MtV}M% z1LDc{%;iy+gy0EdX^Cm>s^w>u<|i83Pk4cW&LK?zqB25f1F9R<2G=L#Y(5qGyIX1t zIknHc0}}AD@_$Nz)IE7OH-tCm<{4wzTG2dlK|yuU{q&h(B7plsXgfhiG|G@AtlVsD{QsZmd% zIZw6a(^OEWe=$_!8&&|V4`ub>Of!DIFZ{4@L-nA-tHYaN*YdN?QT`pEo1{3Bl@Nvm z14s{K$^ezmVG-M>1UV^AF^8hwJ;s6fnXZreYKE;dr1o~p0&3sdLCKwT-@D zhMflmD5@-hF*WpETLu1(0PP;gKova-*AxGmbStf1y}*QE-WFpbvl?ME8jF& ztS?Y720}b*79nN-S_I)yND19e1hgSb7xE}8OUoMQ5p#4NM-AEI+#3fiJ%_mD`Y@R{ILs}i=&My*4C#vxw{rc5S6Vjo`FUcyEo>0xqK#hH{ps3$byq6PJHOf zKHVQOHa3ReCmkWPbX_`ekBe#3$Ej&tCw&1=z?QkM{pXnW4lwyrwLPcJGL+BEXk!1U zeK0d8=O)r|(0U@(m7&LtJA~&_%bruBUb$-b%QnIiAKnnHHZ<=vzstFya*;8*@?}!e zyhjZ-sKuA-{_GLJ({vHG5$jH*RGlbr^#{#8-)0I?OfKp3Z5JAkSOy@g%ymo~0gKQ2 zbZ+6dAR6u$0>;Slx*;*pUb#KD4a(_=^@Qe$F?GfBL2m~c_X}OK| zeQJj)s#Z7JFRvI8YNl#8=T-}3K_k|;SFSBgbkN=^k>2FET)muj0D>Nv{%pd&Aiixn4#E( zJTpH)YQ){OD_<`Hs@j=c6o51I%;)A5nQW6Hsn562V5Vzk81}`}BWhJ{TkhUX_jZp| zTQL%hR*P1YN{8*vU$#i_{4Pz)cenlAmWAWstAQh+{yOKOfJQbhU1wQbHW6bmUd^}g><1bG$-Itw|i(rL~+n{!pW^cPn#-mWq>XXv=tsl zx1y$GMGY{hfPjx5r%nNmHGg?g42VZ1mp;&Wm~HgX!)<8xx!bSxmRdxa?sFS5HTLyg zX@5QjB!HgQr}C22>QRL~O`uoY{$7?i=v0i~=CpDCst6{abDJwyX`%*i#|DY_dp5( zn+Iszoej<+Y;L!ejTerpugHDFLfZ668u6E+!JJ5f=K%JVbHibmx75Q7( zPN)}hL|it5C5U$+mIVGezhc`;xiP=cnW<4mLeBMM-?|CQTmb`3wd#+M6`NI(i1&J7 zD(m9S?6!|Q8lD_>54}qb+6PNH#kvS(exwWWzNqBnH<$EF=Ton~7on}OZ1h+z?v#lP zF0t!u0K?FYX!BmcceD(G<=D^i?8bKD{QOP)AI42BJXVHqqRWNYZoG+ugT>R-T83%q z0#=1gbw;z>`jNe!1+|M;WNUp_xno6V+*x}1n5R#=Z(z-IPNrUm`*Q#Sd}czVf6y_cX$x`M0nNYGbDCw$RzFx~am|bAp1; zKq@0xcyBKVyJ-%zna2QeupzxW)7P2@V6IHoLt=32=U8E^kcAvKO7#?Ok#G;!pbz`T zqq1jD&8Y)4qIYwg%nQ5Karx8k+#B#K0dw}9%Yd@w1sHdMZh9?`3*f8wFqGcTNAfL4 zUo_Ivi`SFwM*0)>045=L{+`@h%FvCbmz!hRc%c;J{q=8v=!=IDYfr725XK;tk(SoS z2WMbA=N8?UuUG62Qn8xb!z|iY%R1ukdnl`@L~Re~>bRSZnC4RGvQMk2sg*|Ey{`-D zc163Hfh_ZCfu}T$)cnS}lTySHyL)Myb#S9aPe4sH&fe2}(Lz4pu*BWu{JpuB!~UDt zQ|EnZKu2yP=k30t6p9f;7;$By8}Mb#ng>tKpXYej?GD+s3NjF@1%#p1meqIgjcPy8 zPVm(~GX{*kuQuVbGZSwQz5W`WJYwop(}4LQ;Qh+_M3Y0G$HJGlcw7o(8pKqLlS3{|`4pbL_9cR)3J*74zR^TjI&5EbJ# zw%HX-eKe69>UkS2MNF{dG!_I1&8yEc#K=7I*Wl|gqxyfx#tR13*-a@CLoB4%a= z+7_Q{B%<4{t-4$G#-aoprP-#q7=x#U)B$&0O-hw}(}m03by!Oh zZ_z^)oPt8^@J3JB?E2D@%Q|Q}uYtHv07XDVhV0`x1>0CD-rNwjdV7!B1C^q&q4IK% zhr3w;80ckB3!aL&3D(7VuD(F=jOT1eX*iqyt$FM!rFrJugaW5ZWE#dzM$JY&bRTp zhX-=o^0@$0SJmmVO*Dbpm5T*kl3dJ1-9-x|!myKrfi4)J($4q*SQDVT+qP%ZN3#|| zYmCkMm-~`K<>1ylE9Pr`u|j=5cfWnmQUjTL-n9nKfU}UEyv2q@Y0rXfHYR-Wp8L28 zx1cdloB9NrNk?&})n3JPABW~-dlEpCy0&2T0;R7*SC*E`r?aPAzE7w!V`jt%|W39^_~!Ez7*<>fgDDdzUtCF@15i!)|cLI$0= zFsKTX`=sLQ^N^#$0tehTrZRmGQ`UqqREvo!&WszHd+E(jg=SUM5{+4s!&R5}MJigq zZ&O-q%75UmC5)4aaZ1T$wKcX>QC`wr*(A*lG883Q!A>un{&?fc^((Y=4<7jLx=}8^ zXaCz$6XPgl_Zl~3rzr%BQ0?w_M<=8d8E0y{1q%*3mf|njdRm+6b76J#-d-8I8TOj; zp2_pOD&^m}4_v?EQZhd;TTNP)1An4Vf0UHeSd$SBA^Ca_H7$Ebj5mMVB-Kc+vK@T} zOop&z$iaSbK5->nUrX{`7Fx%gSyo92akaoV57-ONs^cK414jeR=FKQn5h6WcO0 zcov&QA5lx1J>4iGzX>K;nP^)Z7^@fFg}LL}6!ys?YLikUq;d)zj0&HO1bnTS01PM` z%z@!eSFL)ym&d!iT`UQGmZL$)`5AQvwv~{uR7%GQcqbU!cm`m|F^-q;=1(k)A$o)(1}IBMk;e+G;nt3-!9)hhMaSc{-m>%#g<|etAw5kJ=343ASv& zMTPZCZ5cf?kI~_*a~Om56Y_z(C@86DnR)->!usq{~SPnkLD%Xh!gv(e?O=WO>n1(&Ib3BWp7NT6w#I;;Z zGQHM3Z)k`(ZCA&2zN^*=HuDm6P)_01;>GlDJ%&|zkouO1N)KBrYPparA^ z^4)9KmuUiW^GaRi1RVe~0@Iv_^jK=-r4F&{>{F|cdCQft0c4hSy=bYnhiFj^rchn`uIxFKEER3I?$ghkWDb; z(*c;;F!Y6D($=42wDf~zXN&6M)OOdV^q?g|gHz13i+yme`KcI%!pv7L%8*UKM=E_r zb6|FB&XbgF=%9Ntf>Et|)F4808BANe5UiRlsr>5b5C+1i4WEINl2p?9FBB)&$U3r zC%D2|X%R#Iz9dwpcyIaISCyO#-)t^@jgdgY>qW28w>DhRrAE_+&)on$jRp5;e9fPV z@mcxL7?TQfxbZD5zS(7RD{UGy(4;e*w`XC{;oS(Wxz*Eh6#<_gvK3ytwEnIBehcb$ z{U@pGlD3T$Xy&MSbZ!n3^=@O=U`M%$7}4{owq)60*7BYZOz#Q|1UEOgY=NX7f&@8s z+w6*raJ;7g8*n}{ zr&uk_=0TPW#=*GgOBTZ7ZF;wGU%|oJ{pVpDQ#NsP{Yh#D;`j0ZS>0Chs1jOkGSFUO zGwCX@9u8%K`A{&4sHR0Bf!yolP!nu3gnc6VYK?GC&KC)pahn8 zKVxvbg2bRzmjL}zyVhX%z^$s3_J$|Kb^N`Mzd5I4tzMp2$y86=av$^2ue8U+kB(}q zOG?7NvhZktd9}vr>354q))VIaGMUJ~wNuj1R+>~uE>ba$T?Fmn5x{8f2zzP7j! z9_~(RnZeF%e2UW0b@G7lNJW z%N?Wrc3p4-p4WVK53Df88X6jL z(w>e|V1lG0O24+shqoobI@DD)L8|l;v@B!-=<2Y>=F*eHAxOR6LY`UbT6xK6);2`&reST?9YkK9OqVA?l%)H z$CMq4cU8pot(n>y`7YoqXNW456Nv%Yb)C(`L%m>%Q$G^7oJ2C&sFT~OvyRsIJNx@X z2dhV@U)y%;*Dgh^bZO^K2Y5yX_(qQPv299W3|8l>hiVIy>Id)v^O2g96%%+Gd+Ao5 zqwOuqh;|!rdb5$PNE-FgxYX<}j>fsx9_*#jTEWW6*IMSMHjt4gnT~w2%6g7h4fPbv z%$jDqF-Ck^r%Ce!QIjo#F?@_PbizlvB`yvOi{o?HoS+vH^|=Y9%0P3oULSxcN0;s? z_gjzeH1!-5{RW9J<`UTUB5xkBJPK(UPnr325@!B1E4LLnXt%Xr3hKcDR16v|{UuCI zv^T{uZT;a*8+qZL`SQ`E8JhBRmFS)*qvLnb53Y=svuMZ^Gu06%mE^dmSMDQ~7E0{4 z>$+^lNyo8H?z0A7V^Pq20VVE!eN$vu` za!b!55mGfvpZIlgJt3Xj(+ni5GX>5-UDFtZ{ETy3z0SRdi9pLQaKTpE^S#4~SXQVx z4A;HV-|CNKI%MuMl|GdRZ&6lx`AUx_JKnX?+^7IWjO-}wHS2X)y78x#{0kKe5=Y2C zxb0M7bvLLrMYExjq}e-&!2+^Jd868`>Yfps1b2^0Fv+xs3Sums8%!H^&A8;w4MK%= zb6gI`{2Yk;o{v^U`nONh@{-Ko&ZR6o5M&)<4N}X0H(7_CmjtLOlv}pdA^{q65 z8mgrgaEl|vz*{+r^T%3(X(?LcJryCYt^*C>gj+)_>Jqi30U`_&3B9D~duvF{{8mfj z9@zfVe1l>XXaF4S3sWUYLwLJFgzwhk>Al`@^_cJCYfy z^EDjlVl`}2*5ceEq3>JYlXZ!+_tkX)zQqXS)#0mQ$IOdYp)T6)?u`)%z5y=HoV?ndeL7(>+wjxbswO_Glm-km^s&5;bx*~96lR7 z))zN-t{>Z-1GhS2rq~7sGN_Mk5y$&UP@%VH$6CoxRWnihG6B}+>$yH|GodX6ght+)XE5Y)kDzb2E z-N)awkRZ8`*X@d%e!K5EP${l~;)R7eIS5pexHg(gg9{o~gm`Sf)c~q%99}dD)KP2R zXW=bPyx>%fWyB39Ukt`*2Frk2q9UJmOs@DsQtMjpzb+r za{$1sWNW~3aK6kaVJs6CHqjj4`@8A?YpDADI_cRT$wO?e_N^~(zi-Cp2EPsl`e^?v zuCp?m_%d^ynv<&^C_+f!^&m$|DzSkPmgN^Adbr9_Boekc>6(`SlWy(yKp$m4tpON0 zhbmy3#6kyMaLO)Le+;4rU2k*$RKWz{R zHHPS$fGqLLOu*nMQcB~NszBuu@03(u=f?65%EWCK&{>F?01VN;nE?~#qd!nLPZ*ll z+t;=Ge!P=+llRnpo-O&A1wfTRlRrk=Ar>@5d*2_xhr)Y^Fr!V&qxaJ0y<3ISYu96c z>&f%39Rh=2u-@<}00N3P=HGaL(Uda2Qlu&Pu@cj zXLz`o#cF2?s*GU%%i?lz;MF{FD>MNM<}*bOkj5E?{Y8wqwgC7!20yc`sW||p%8M2> z<%k#k@4k>(;yTr_F0{@I=tDQOoyzodF}5Ba2RjaHxS-`N*3v%ol_TNSAf7N0aP%%a4afn2um;Y1^-beS%~2 zfy*nK=WHE2)%e3M&F*_YsoABg?IlU zU0nZW3)gud6xfJnn6B+S%=&F0VYKEzK#Ni`g6@PFNQ&t4xxjar^ zn;MQlrEVs7xBBBBx)E>zFPJ31J*`Afn-jXt^*tgp0oH5f2T2^0nOea5Q?U{(v{fJI z>IX_2H^c`P`bAvFKf3|YozV)LbDaXCx_PGTLYK}a+W~uag`=X*ljg=#P*pASWiJr?e z++G&%KNas6lLgRn`m07lY};DddU=DQ?Xyx_C*!hOlR}Rwk{87B+n%^ZaajB)hLm61 zFVW6=(}Yj70ZN3oRt@fhox{$U56*49I=i1RULuoiT!4{fM^ zJ9ga_*NqyaZ*Rc!7nE1$46Nc0zI~ddvkB6+`)D62YEFXKp^#E|kbgy#b^oXd$M!~^ zgv&3JO7#;e_?lyDh1GJ1S+AtvqegJEeQl04sM6yAIOh?)pgC>alg!xhX5)^Lkk;&Z zp?Aev6z(JMQfa7cQ_)ierd39)_BJ5$q>%=8cvw`PGi94+|Fys4bY2z*d#LN6_e6rg za{~jznv1tU@0j}|k)F}DwJ8U!!4=}>X6{Aix;%hpHX=OD^kg^K}@7Pc=|rMj7Piy&6$=!M4W(kH{qmG~hi0Ry`BqwRP5HNn6V^ z*b6+1?1{oH62f$COs`A+A&|OC{~lw5S`2sEOW%GC3D0h*1nzg5u`oCHw%TrfBuM;h zA#B?(bjO=%OiSTG(yC&VgC)gXFDm?=t;)-DHvkXJNb)&|FtLv(%7@2yww*$uFMbxn zm5iNwOpnN>Z*$~&YQ%jP4>Pg5Qle&ylr+s#>PFJq9C^fM8Ns%PC8a($FqP8O#<=*l zm1%6At1n;>@5!6ucpYw!*#DG^?*sY{XHqoTC`ImE>6)(*8wa*RnA@+y9($VMQvY!Po0_jmIB+iKf1NoWaC~rf; zlTLkaRDUPwaJL!w$AJ7=Z+AUbJ=r|n{i5k}DW9{bI9L@lWN|Mlr)^2GH%((jxx0=j zV*0;wnmC7pl$*ci*d}eDV}FU{pld5ir`4+azM-)%m^|+=9`?EH{yA-<^_eJS<9>rFJbr2#VU&aSN!z-aclZD7&?y{4UfH;E|Bfb+5Z*R1PT#`7m#<9wAYX*#~hq;Rm zjmO|y*Y+6bs1Vvh{L>4#F}2&T@t6Wkm>L0in_H!Wy+4Rm-&JR$~@^%67m+DWGiE0a;vipLTr!fd)*@T&nN)U?fn zCu-Bw?(MyxsF#3&{^d4+(miE9Et6-4!lP$8HirPJY4NOu7hD?9xgL?A)xH))GY2xD znI!m3vH0N1=_$fIscZ_2SZDiZPIL!kAD&*VoS}30uQ|HFT|sn0Z4YdPKu{;8iT1Ah zanb!{hLPgA+x?&{r(`%U4}-Dnha?CJ581s$f!&NB^O9ajk2d>lXzAs0oLYXXgbh`g z66O>rcUP-Fd@r}6bo~S$h#L-gBG^H03Vze(kw<4n^OO*2Nl3{zl+YveM!&$sFv002 z!Dxiw@f9Y~zBJY}^T`pL2|yC&QUq-v@l&B+7DT?hW>~XnWMNE*lvJ66)r6fw8> zoO=dtP8^b2-8X5Hzcn{cobc(?^k^owjOMZM-n~nwxU0xcZLD>>7dIY1y`0KJu$|sw z)7X4G2VOgoGfUWgHm8+1Eg9L8jcSQosM;oM_B=`3kO$_0vYo zsf8W0*E+;ciD1bVF!Q^)QE%=y@u;jzr-@5&qT|&!&fzs{y+CAvJSR;fzeVazqv}iI zW)K-YXqGa<(!FM+h0`*e%`z$LyUTIX2`9W`C%!I_@C7{%`bX2+b#=nME3rsS4r%|e zxK^g!hs{tve=WN*J1x^SV8QM5l(votT41(_5nczl07`GW%KNUkDS99AlzJy9AnJ98 zMJFw(61+dWvev-Z=)4O51aCJhyo4#c2@_4{o4u6p8J)D2^XR@1M7R|{kdIRl6Eq&xkgj8pZg3OcEk6;-a1VXyf|`iD?c zYEC&qRW4(pQf)FrtLJ-q!+0IG6iZ8Mlj_g%<%tEM0RewkH|Chk7N~OQqS_!08!sDX zxAs4h1nJ|3Z(Ap;p3psdet`Gs$u^lIj5v#Ks_T()>&md9#M&#-_Y2$izk<%UX~P0| zDG^Gop?s@o16l;CCE56mTN=UAS)=8@XEV0(#H@J`?el9r$Nd3gTag>+pGjX|p6G7E z>W5Z0R=UqUexzQ#EDFY`=4z3a=0COGqG^^3LSgEY2Bzq-3^XokPx|sp?10>{$41oaO;XLgQJ{F8UYIv0K>5VpkplNycZv8#g?x0VAZPj zzY5>_ra3Z9dtke??w$k~T=vm-ct}s&Ro4dW3M<(eb!j)APxB!#W%JiTe^Ob_72}$K zbzTP$?fBQ^OeKndYU_QES2QDCtm0{4R!u*9bu)LmQYkIVO~$f8^W+gFaRfj)dMTq( zQ{(Zd7%)a9QF(vmnEaRI0}@Lgj?XMU>CMHEaIvYK6=6N;b^H1&^dlnklj4crT3kC@ z23aPW_+y*fZW0dg&PtzUWIA}i zOgCVh0uW~9&F*~>UJkw?H$aQ>aA)mN%0pVg9)Oj~4s@AetC-@(K+{}WbG&#j$jM8l z`JfO#(DHc=x76Ej7>D$y3WhB)S(Cn{aAQH#-x}W;&9e1JrkY(O?i2av^ zv%gr}8%~vE$UPB0IQY7gfS5)Y%xi2U?|)qUKIXPVPAj)ar#_v%+O-Hf3ZYRSWpeR^*jw^sq!f^JMCk^+pvy;SGQG2q?b>W zui9RCdFc6%yH;lJgWG6KDcmLP=@TIpEdpEw@&*4@Lm(ir=*di!S9?v)8~xUTr3+giTY3KzSF01Wdv6vwV}vf4#T+;%jj_Bf~WdIJm6GBcrY zwYwglUL=Y@(IUDwjg$kDbU=_TuF$$Mw70}uNF};@f)m6g-DmlFZIEh5d!`dCYNbG1 z`+4%vEunk7 zH`XuSgRi@e(QYRQ&*)p+#3_xp9qqqy77zJTDgKKh(C!r~8m2@vTgCBWSEim7l=zf3Z}c5oYq#=&zY=yZ)OB{9n6w0Ry_O zh?SE&Ka}rJ3Pi4*71{N#c6S6^z!3r1zqkGEl8X7iTHRM_ zD%-H6E4%;Ik$>3FoZQ^r5&h2&;Lqbt_5$ZXz9#ZD{UH)SZ^_!Ut*c~h`rYf0joy!g zAp558?mCFZgkh2iKcusN_;`fF$GK3&Q z2r`5qLx|r2!~cB{8bJZ3*bd=Iy#s+JHzQLF z{!FfZqdsE0%)z@AA#@ zFY=qV9}oQFdVYEm`FbcQ$=5?k)}BDJ_K=Mmu&`v`!%Ox(RJ8vK&>-~Dp&Ng20sQ2l z|Jv984h+aw^}ljeqZs{b>t|6kA~^7W9f=br`hKZcbY1Ce7O;7`dh5IF`SCwR7f zCpiWp$3P&%Nk(q8WN1K!24rZkjg-mhQF3~e3=Ou?5jp2Zh6Vr~k)Z(@8jzs@85#hO zK+YPFvj*Qgg2>Q-3=PQ8;CtzX+*Cy_D3G%TWN7f+FOmxi=t1xuEd<2*}WY3=PQ8fD8@D z(BQi{BxeoCSpzaOAZHDJm_sr&AVY)ypF#uPHjdOkxB$phNMtIc|5ugMCpFSRWw(hW z38Jnc5y^A)8Jl69#unmw)yV?~PNG$UU%Y@legRXt{_;fnL6n2m%RD=+PaC5XHqpxI zY0VtO?|0$j;_x6G`@~WWV~W zi6ldapY`K!tOePx{wg$o9YB+v&EJU6&k{zqz+?;jt1^)-@Xz}3H!4K7z`qI&*#eXE zz&}U+f2~4fXR||Rlf|5V@qg4Y_}j9Ed^%SaN;C9u=4z#b0m8buTh{(2#&7+q-1z5* zd&cjRh)JQ7%fjY(TqPHP-CHQu&h|d~cw92DMkTea2P0eSb<{(9JV< z9hOC{m$F*5=@VHSJupPOhi27%CNqT8zqV69Z<&@?vjZ&lbKu)Dt}&K&>LLzIWdgWs#3#*Ti?|%wfY2c>uOVu9ms(^?-Q`P zTQ9Qi|9KShhY#9zSR~jj6ygjGm$;CmI+GzMJ3VxU)=pOV8y&NJyy~NopBDH+D=4TY z+RFW-F%Ka%TX(cKPyK$wPKtGpPRj3so@3oO`lm!_Hc-cL*R~ufnr}7KmngLHxbFt9 z-KF}cbp7ooUZL%>TT^#~>hV9n?x|_evM;NK#f-B+&(mPBs@>cCfJ9w9N9HyMxVs z-lJ8}DaO##n|Y$A81kdOu>2{NfA=Z5oQgJCK+rDZ=c7-g-8*Y4({Cd{V`!UCmGsjC z{!Y~DPim%=pL*~1lXA=Ru2P3eZ|1RTv7s3r_8`pHKi_-ffq_Dh!~VXgv9TuoJGbcL z<#}f)S^4!uj2$bcG?e>g64NSq-;OdjhUl=0 zhucKLE6Ni)jZ5yiUbizrxO5d)Mcffvk@Q9GyW`<*A*;2?M{l_jVDNk zv)$yuy`S5RFJyxz`0RcXtNA58I#Il8t}@qr;x`pRVPWg)S4I9gyXUKynL6_fwF6e{ zIy2(m-Y--y&3-Ui3iT~HeDNC}s^zznD$S2iBX1Za1<~?8JsfnONvcgX=KPST$Dq4- z%;`k04p?h&L?cg<1AfqxCqVDg+82e+8sAovnEdMa5Ea3SKDSw~O1a^>kl|b0-gj;f z2`E$_zC_xh$WV%OOn2%3D&T53Ib1N9J^taiam)s8CN>|5=Ic5}TAxT7uiHl&rRh+Q zy_l{l`xJh6#811xL~?mF5+YNUs^G14w)#!Ev!z;s6wT&wx5>74KYYK#<%B8~%j2Zhdtv1ueb4a1uaZE%Y;kw+vyJvqFrS)H?@^o!PnUQISB zRtJRV^?St&fIRpw~gd#CPUf4q9?HKpODYoGcmw72s17bLpUX`0H(G!^_7u0(9Hwryw?<+ds}3Y(`XvO>vwo^FEYwVK zt9j2?F7wv0?2X&EDETn9=4OPQc1?&!!NR>_j$o$5?kjwOD^C@sV}f?m#IT#iIJQVw zYPWfrQKU)0jXa{h)F$56e!`}}JIOH{p%rCD`{FEx)o%TfE#nM5-;`j+0^d!&uq&)< z_x`kV;L}04{M5#b=Y`P=l0Qk2@^g6k3NHTAtQw6box zrlpx{_R%iPEH=*}iU+n*jEyR8t#se#3T;l1?se}3p0u97XufungF3$@iR7`UF458@ zK9SOja=`=`e^0) zr6T4Ep=84Hc)Zinee19mEW5d%opp2Em=$4bAkV1uQ=Y+Mjk#5{Dc}0xbx2p1W1NVc z1Czv;UGRD~9u@khT3PxDy(&eMv_@ZiEL(70l!|JZG`lkfn3<)J!*zds389++!6jxIrV>-rTP=V zOkcPxeE6p`bTO3gx7jCI^li8Qi(ve{6j9e$KBo!j_~+R1dklLvmd*2xL{sGpRcSm$ zplCPYBsKw~J2HXzz}@zogr^Qokir^A>2<|jK?j&M+w29Y+NR4h0?SpS5@mg3Tw7%u z&uF8CTUA9BLd-bJrZ(q!#;6a7pGR#ig&h`~m0I3f7J8p=%t0eVT)Pv!UIyFr0GooV zjNUF$l{}IBrJsi92-LoJXt=rC2}Q8x_MIIbUu@)w^bKDgi#D&^SRL|31<1A+44%#K zU3C<+#L1DopB|R>crw)w*PrA?TSh{ssF#N(%Vcfam|C2O^I+_>ZQsH|bDVuw)`&Hs1KXaZb-efe>#Jd(m&W)9Jf)cB zlh>#ZB67ZT|0ZZ!>4rCNOw3-N?8;6h`P{O~l$lCnVX*3BQdfvYvdZL^G>c(kIyL5* zkC;qXt)d}9>@vB*`Npe7<$CGd_o>f`1^Lc%>7Mb@i^XF~rJMKi_$v*3={FEwt=lIT z)1KNG0|fg5u(-21v(?Kjc^2nXB|j<9OZJj;f~#xj@TDbT%RX@rz%xNrvJ z8UsrM#;PW8?FJF$PuQqfY`Ph8@wQWGx1Qs()nU|^6pCK>1L>QFWhZ5tRJkdrT&{n~ zh*_mK;f?=-E``|0Je^*s6Q|Cx z+gKiN-q*5c5P(QZO5pH>6Qn%_gU+%irrlG$Xjn_~@8lou9&eQ+9T8t1^c)rt4%k`@ ziC>8mg_w96P8!tu#r_|z-aH)YHf$faG!&sHTL|@(eJ7M{s8HFnWmk-S$uf2$R4QAG zecyLu-wjEjv9E)%Ci|XcFvk3D?{U2E)9?FNnsj77bKTc+u;q|rA;sxUg znSg&kMtudP=s>G*l#YB4#*+U;7G9Mq1%8V-ovAnpW=c;4=-xC>cQ)j45uUU3@BqRA z<_(32@xF8Bc7Rew2{pqs5129GIk%})>T*pRLR_$Af&mm&Hjcj1E>j5};i>4x-i9}p zZ$TA&zu+liuU3vdT=)yN1pm5HpnaYGIqQE95lp`(GJ?Obmi^McP0h^*5k{5PdxNMP z%RHiQNA*4Xz2`qqu44lt3m0LT1c$+~pGD$wSzlA`d1zp3dGJ>3UgNF*My1yKiRyN# zat1opPF03XfCG5y^ijy9_Kp^mp#F>E-^-=C%a(@zVH$+Q=)@R|pMcGx{W7e}w< zw25jtjr)}v{B@+!Ytt!aP*b_gjn2lAS}%OWcOg1U&BGu*|tEDkQU{a%VADckQoe%%bC`H7@oTR|RXzYmbolMCqPiDw}yL<*}p=e+ug1!UZP5XLerL(hr5^s7B7_$y_xa5uZPU zR}<*1G-XRs$y@YVaxfV$x#>Wyngwvc?~qfPUvb#y(@onUTS~jAUw6mA?{H!{;!NjC zSFPe~%W^%*F%6qkLgs@oSit9Om1)QQ@~B>)*(O}#V{$vjM?uGnhBg7_c2|Oj{>|`M zo3KqcF=ont7QfIZyUjngs+@XlU8?BX!T*EI-8C}iP!}7dYus$N1(+A*F-%g<0ngyrQYOaR_B3?mUYei2W^gi(-r6s zi~>DDMErXl?tfucx)W}l>>4OPIAP0^NKLWOmx?!N>=jcWyO_hb({+m;MN&(H5TJT7 zx|>n2maoY^eLG(>bq$t()*F~lPI}=E2;{TG4;Lr3oUe*5INc?YPfq};V@yVf4@5_;dA0jQH<~Lyb%3RdWo>ih&7ebY2 zWmXicroFIlS%jXa=4m9?&$nfa)y?o<9CIEkNi6>2p!(wjWAFLdQ=tHI5jsX#h$8d&vKNrML>tUhRH~THJ;I_*(D)S>#%&blCNTNdZ^G{41C7 zi}9JZrP|7s15CfVx|m^lRf*5L<3(IqCHZ|A-HYhKynQLX)|2SkvEeeZauEX^jRIgT zL8x~88)xA0AI7C_J?RoX+gH251e*8t^(Ff0;=WieW2Mp``i-tr*ZtxZ*x^M?ynj#{QU+M_JGCNM5oZ6P!%v-Hw0k6Se844bE4ym0y{`fgTcqS(UX21jrrwvabAeJKsel1U}d32`|4=y zgHq$^bT@hpC<#Y;1mag)KIHEnr**5X4--1%WAi%Zdc!_Oq zNKN8}4#OJrSnj|ht{r8g8?l8t69tUFXG%?&J$fbED;0PqIiloibCaXUe5>?n<@c`y z%@!GyCQSt5rhA}gyL8zkExBr~5^8aRyW-D+OhS>qW;31mavcqB-E$JqSfv zRjTR?RS#^~Y7KJEUNtOjY$^l{JjjKx)wF%OsfC>h<3wEBOQFvrSi@=WX4Dp%;6%5Z z8^R}G@lVdgo-HHwi=|4#>7b|4zS}6=7s)T5=GVtcJvKMW+i8)qChU`aV@NYcuPHZG z;&`4%W#C1=u{)dh@VHrN?hUQ*$s;sUsRI!M&a5v*%G zEJ?&{eU&xa?_li={KniB^VS^!oj2BNfk zXZxj`#w|TljB1?{TTT5)gp+gYqa+UH{@L~$qOI#L3PdxddWX~2wO=)(pOjICvPrvG zA7WiCw#N;A66+4eOz?ONI=1-K@y9)nrJR(-Ne=2?LbfCLU~8<+AT0dA%u6F#>Yy(_ zmf-A^pXw#v=shf^(S15b|5D>$oIsr!nfQi2Fth8% zTFL!|j{oT0NZqL7s^~)BmtA44M8Jj+TT^wWB&C(gdAi2cc3UbUtcuwrPa%vW2V|~# zQF4DCN%;P;LLx?J3B0!9;1`qq2hZ?_n-OF>`wKpme-1EIE&)FyIEjyPIPv>d$K4{W zE0hx}ov8+;#!ZjyIr?PFS~*|+@}rOe=uaALt9sXnii1R?wXiWw)P!SZMb<@vo?GtMWi6T2-@RmP)$(b+Hd-D#ZNv!dTlNgaNuKlo^py83d99&}g8$)$ z3&1$-bRRWG<|Hwun-Hm1d!XOk@A=xTCW88&;-*5``ku|Tc>>VPR(eUpU+o-$o}W1t zi&^e%)m!zJ*3B^46CcA!8$DNF)K1v21?fSU8RaQ*hiqP6C-@WxmVk;f|GE*?rXk-J_Yc#Ddr2v; zYZnBSh(P_dmRH(B3w6`?4s#PLigKp3NXY|F_N6*GXVG+Ik4FZI^q~m=$>Q+^AwMPb zJvT;oQ2^Bmce^*&GG53Hd)^V9{?Y47W?tspTaW(D_0&2OAJT=U&g7EyvV}sjGEX@T z2Fo>-M-^6sS+3IwRNR9BHhvZ!^hZtE@O65#GV9?au?5JvDkXB!wbXv_7q7H=46U>O zWPB9#%qQshb7Zm8X<751ByR*~yjys!GuCHsXgbw2Uof-c{kZy#nliDS&h?5%b6;v?>$J!Y z$J-B2t6g!c!`*l6t~54z{)Y*ySv}7hng6vvB2xZBy8f@jF*jdft^DyT|!$?Cd0;9I9MI!tto7>R(>MA?*KDvm#6OgZF|huXCNc^ zOcXWEZJ?vL4Su{ItTBTK+_ZGjfSWNcrm;@lzh?x} z^;ZI~$pzEmaAtNlWMQ6S7nS9@7kOa6JxP5vi3hZ?bSbnm2Rd{9t2 z2Wf}*qiK`ciaVfn{3h1ts5|}qF!^a7j-lBLY35coUS{NHIK9SdinJcSEDI)N2vp-j zKBMF5+|FDx?_J|=cqe;Z7*(1+7EN+4lqO=#{U`AMlo^%$R9?#`=>-4E=;doK&4=cU zBugTysqU~#yOcEi{@fe-IaC<^iy?2NvyYZtlbX?!F%QKHk9o7V*WbFMs-x{_tIPmv zNbz$pk$&SDvS)TH$eZ`txfZd5_=p(e-MOv4Q=+2ZAr4`8nAIck*|-! z6#YeJusay9ERVM#%fmu6Y#dv4xs=TNAH(J8ZaWw**8zUk2BlqV&L=_Yg_F7GY54bf zu8oN4?UdwYFRa?<*Wk!b(>#NTg__VoAF4hA0XJ*L$i7`^#-MFO>%dV<6hPMZP%j}Qb2mkOHYzdKY*XAC zaXXmr_mzyiICKdkGX6*NVa*vm_y>^wNm$cdNbtP2 zKa;TAItuL@9x@{9#yU#%&qHh_2>^6;Ld&#LPhwgl!%}(tr)Y(BWpLze&JyFPc8F>% zg@X}>?9Du{O~QjzHP5MgO9|PiO^=9%(?4qTk`{K)D&Zyt?r&SG9leVh7UPmlcS<;3 z=zTQH%CedQiZo&O8z@qt(r!S*j&X65Q8A27IUhI#eKuX6=M>Y z-Z1AS3Y0bf`=`XPK)bwua_f9^;ON>oD09(e{S%v(#|7s)dY&i|&lJS(PwyXx+QJ3< z-n25>?dmqv8B#b;W1)x7s{Q>nM0~DaLN@)X&!^Qi*}IxMzFxw+p#4|wEV!Hu;w}HY zGlS!A9{juX>pyTz@&npazU?LAsd;zL*PDZ(bbBsJ;r4GCU;P2%#W6I`;WN+*AM;6+ zAWDjK^P`d-VXXqjF%^2GZ}?A?xJR#EZqd*CX+2SQr?hFiW!S07d7dN&H%t85jNkG< zE53X1L=#2Tpc2W7c=ZUh5CZ3nQ=A0kLSf{mTdKa$uktBFB^EE+GVV`Q?)%My<2KD3 zo@U>PgsE&r&j>9Q;-%u)YUnGhAP0aJ(fY#=5mwN9LL4PH%kdoa4lPiRL0zu{br z53WYbc(g&7lR!CQ4*D@sfHN|j%$s&+I{)sKp53=FDZ+3H)T?vUIE?<$*bgluRA{gJ zAMKd*zWc}9FBlq~_g&Oyhw&`Bv+Wa*8<<5t{$Yd`>?gan>{?KkI6o=N7;9eX^mk5A zqJvH8Wjw%b$$xgiw%K23VpJ@+Y{?G>RNB4OoLW9u0#z+bjY%RA+5E>nsM>2&^HMC0 z@Y)?G!nw%a`u5qZA<}deb~A8{_Q|@gQUa*==+@E;Y(tJOV;9|ie*Q62{E``8+q7jo zA&b!4!_8Vn-Rq$Ka}oyqK=zLDbpdBB<>kB3MR*c5R)64z$#f`1s%s;B-MHX*7J=`D z8myVt`0TzQCX`~D))MjpAC)~VGpV~_l~NlBLD6yq)YPS!3ym0zi^$~5AI;f$yNvkw zmDcn*TLckmpmbC-Q(#edCa?*Y)6xDco>|13@f)nd#ARCS6rS>-k9>bH#xqk*jf$Dm zweV&))eMN0szk2kIgH9Tze>xSsjW>Z#$(BD)v@c*_C)W@TOGw6fdHRZv^mt@>PnArwjAA@7cjkghQU${r9bN33yX@0Yle+hh35 zamrGb$HiqW;wb<0)SVMUrJUt7|0rykWROh%nj8+SL5P9PX1^w4_qPARjb|5m)A=W) z)658iCo+P#>ogAMgAuDYbN&?0VGcL7gzglLMMp(j1nf3Ii82bSQyG-78kZXR6^@6> zbc^-@>{cf@sK}z@h{NdN&J3&gH#2fR`m=D6mfyCjWB1gC2lwIWhrQC_RK2d;tt*X$ zV9KpMOzh;SiQ!g@zx9w~sOhmu@Y20g6k+CU_wlk>Db&QX_0xNQ{IACRGz9{LXpZh{ zRXFINOx4wA5)SAL@`xhlb_F$Z=l&)0d=vuYrix3g=`Ypfcg9y=TjB1uh9?SYLdm6K zH4di^EymUGKj@K*TtE;BV7{Frs8?w1>NHhffmgC9yJFCho}~rsf%gL}7YH*oDS*WXPNm;bWc~N5D(zm>3Mb=|`Cn-uSNOi9BjmY1q8pm1RH{To|-Xt5;$>pNEs(+jmf9gt)Kj?|$Ldh_c^C zxs5UQhIiB$U1Bs94>;PKafJ52yN6^G>y%}v&+Uz=iKejiNOo72OtuW&$=H+KvR9}rnYYU?GE6^#}APsqcj0bOj z*`*W^$Pm(!XGCyTE_^>3sd%tHyv0+L?fh8jNrkx@QqkFDU&aK|%kP*U<;{QMh8W6u zzXbH5=<9MH1+cMZElzbm`yzGczVe`P#^o91ZU`!>x_mA6RN4;9THf2Q0i3V7K zk$f^n90$ ztCXR(jO7Iw&d$k0cuU=I>q3+)!OAF_W7>2lv=Vo=)9xUWy=JCtE4#U^rEnZWouN+> z9r9hc^%Px=6)L3gq{-WO-xiVJH=tSui-Ifg`ysH^Gkq@?1QK-DTMWxWD4o9vCs(qr znHD%}lfIS7>%^Whl)%FKe#D#mRmgfd1hFcdN{QUsTK$9+t5#5rWL=HQbRd4wI$MTN zXhbxKP(-&$PkUCSADb!#QHks8)J1hJr(tJ_9E(s0f-f71q+=L>y8o6>`|+Ju!^yyK z`2vikRte{^)UzAf3ygRV!cYVQ1S~W>t*n^Dw+5QHt88^5`<;dnoJy)U^h~LKUGwl#;wfX zXLR>1*wC?U+569WDIeyN-#2JP}c@<26Eio$NNC#;yB^yH5Z7)MLm40VcOr+}1 z!lifA`5N%&ul9O%mL_{&#OPjx!8fEfQ@gZiDS*kY4jGl0IY_A^CsC(M_Sk^aPfvbvDX z`EX;LB~$Naf>4oBRfyYE*G-v_L>JrswA7cE2?>Q6+>DS{rtr}#P@iuU_}i>TZPDl? zOn(0aVo7OK{|Z=Wn5`pjtKUJqe5SQs)6P$IV{34sr#k535S@vXj{%Exzs&k|D7jGy zX8_?6<(V#tUb2)kp~t?qF2v5Yf$N~hsW$cV$rJ$81Pn^R$DmC}dg|qu2B1V)Q9NWw zRfSNeApCelw3iivOlb@)Un8E;QD`x-m#uiCUdVtli7?-s1WY4L<@V`KlTAAlwpEz4 z!eY!JBF^|gS0xjuHJN=~urPKhSlh@uDpuldr{pJW*Y}HUJx*<3->O$TWA7f#h4!9r z---I`h^cxvFKu+X@ivtc6_N-P9p5&J=@%4NI+6y!XXuZg;6p4umo;rOq4Ih6)ZM=6 zgZQk@x;cC__DzUwtbWmhFo_5zRxY5`JDWBOMB9|GuYYFg4fNv+4nC3z@ZXox&jR&Nvff zB+oDKIriN_VFnd!qdGS>o=Y5E+_CA?uu};406ev64x^E{x3!B2ECGA;y#OH3`X^#F zc^RApydfxMzDZlBof5K%8hJi{$Ar!8+<2QK%r&%vT{u|?e3Ky;d}?OkeKUT=R#+_$ z;D3?RMI1)oq-v~Le0Pi0Pbu1Pyetz6N96`SY6}acFiY^-DG|3@4v zF2?2>;CJz)?9hEati1 z!R9@c;81|`HEw(RJN1qbUYW)Dqyy8+C;xJFqhfek1fv|AV*sQB$e@L9wwPlA^@A}D zdiw)PJFL2GE7Of!i17BW!Q`hmo;F=a7fcuGGDCS~dr&cl59CV*%VvFNOdgIM_pZ!j zdT&b*ECaDFwF>Yc$Eq?%*6mheus7XcAKlq#&7;aJN_QF0m1iqHMU)U1l;jC2W9b1- zkiRkh>3~DRdad=|HJA@rk)gtrIbMRkWMJVl&jkpWWF!C_N+-C(e1=IwT~uBF8~-)l z^|Zg;mey*(N#OKz=x;mcJ?@WXz_XX#d*88jFEQ;^rJ3`1d7JA)C0g|Nt2Gy@zO|g4 zth=eE-`mrWR!A= zG4%Rbe(vt^WkDQ@p`CIpr$nJW+zw6m-~2%^36AQBhLiDKz4zTg4T@X~o3+%|1V*rA zpoIP?O4}p!-CK6b##|Rj04@r|j6in&!?fkWY|ed)J$qF>?r{m!#?$8?4impC66U6|Rker*8xAEd)9uYAftzMc&t|Su zLBX;1y`#Ax6x9h-jQ0+2{qeTh2cem5R2NtLTB9fVR^Y)xv8xpmzPy9Svk zv_qMB>eRy-oeY&!<^9uEmz3ztdAs2WStRvJp%jfpGI5@plhZJWC;5F(-go#AYT?6v z`648VBCJcp06d55%r9$z9nsauPkE-Snv;LU9V~BM+zBVC>x~iy1 zg=j6W!~^krrB1cE3sI<+K{ws9u%MO9icdUz{t(~3Wa-(+;s~Ojv-fz`oH!)3)c7D2 zSFULo|3+ftC@HL4xapf5Zt9No2eOpOI@jeEp0$Bmppi%t_^CwM#eNBkgfB(DS9yO= zeOV7OO~J_^yBJgZCWO~2>RC>{Jojae0C*;4+Xp>rLXBE{-v(|7_MV`r0nkW7Hk!OP|GBqU)PW%vkoVgcM-RDlzak|>ay6;(j6@_Y=gleq9%!@O+Dpw^9Tt{SKZ4H45nJDg{l6D=0Ww`*pMT??7y zr*>Adzf7;7R~UPkmMIukwMkMqhO~7In$CIl(;F4e2Bf#!Few7O&=a-Za_xC>f(G|Ta_b7yUe=g|9FiLLxfsQ32F zC{6m^T^(ZV9#WNxoocBT9GdF&1o|3YZB3R!37ri$mF~E{;=)+vr=9#JA*G7Zy4qy-}apb=U0Dzc#c!AoyK=HWD)+`PuF3EGF2vA`YeV`PQT z3Ft*iwE)?0oAhVZ6d^`josPx5h60vr>h=RB`~byq_vskk^MiOi6rfe)dk*Z80drLH7h?!pQajA z@NFQhh@EF*xt%Urf)nxV%H2;uDV#sa-2J3V6+%lVzdw-jlb_KML4Tk-cQ{_La8>`3 zu>#zfS!?@7m(NYp&h~jPj zhDI~4q-DLg2OAUZ5J~$}U|AQ6wUJ_5=GvD0(-y{|3Ak9+8HKmh1hCb&!c>CXD87%Ez*d` zNh>w~{8KcPkL}rW`F(-i@2+a13iRyA%1{lT7!s@+)!f~!039{SH~j4scVIa-Pdr`D zt`0pE`Zkb>nbfSpy698E96ZT?dCDFC*3A?@`oS{2UFz{%^j4<$C!X#epPyWivJ{JI zyH6|%0S~htzvjquyvwFnW{C!6^M=EaQMdO#hwHz7kO1yD4JEW!L(KbDXROpN_bRSG zc0v7HV$Zj)#x)KN2FxPnro7ojY*#X^dJ@8>y@}A{|e;qS~p>0P$%BZkLbV(~WR?DQx4xu1kGK zATYyE;XGwx_?#xImkHeaYX<>BRDTQ<6F!8Pg-)amndMn#4CFliGVI*9BDpM;TpO}j z*0gm}jjg8PRa^k)rOtvtLJKpFFhrxhMvF!(qUOMQ?~$x!zvL49e7`(x2zhdwda5cm z)=V_DB)OJ7kiRNf2uSV~ppK)VEjPXzlrbBUSmk{Pp$r0?ru807COn?T&}bgcp{=8B z&Q0bs8?dL*Do@BKK|3*)R`sPe9S7?vSIMqr#sekqpi+}o+7%^Tbd$1c{yk5cXHB%s8ZRcb#0rE#>?uu|Qaix@o?$a~$XovI z)#k0cO9@t2Yrjx;Ccc(P$PM=2&>5|1c3k>YF zCLm-|!vE<6vfbpgsz`^M6vO4{bF(DFqYa{o@iI?|g z!2)oT%pc5`;@83Q0KIr>v>g2kN6Jn|&C$i8mzV&~c-tQJr6A4xN7DO<$6l;b^~$r^ zCG@h0$3aMdN-xnjvwJCove0iHvOAhWct(&YKJvJ?(bwE;OC0!cO@M6(w;Q1&e}8@V zg$KH{^zXI(HNU)p!InT-krgMNpdJul=;K|mYg|mQq9UWO?&m*J_@W$~h<0%7zQl9g zRhBw1E_U-tcf&cdfc5X6Wh-*QZdWaK-HNVGy#zfl-dB%>P&3u%0rybnYo%sTs~+$J z{xx+bNDPIf_0s{R(w>tsY1!qvkgjOPdl@+#h;%E4ppf zMrOsW{VmN5x%hDCmq*32*KVh7%p(EX&Z#Nqi#i?FO6IsRu=1Y6{Qb~rPojhw9I_h5 zm)OGj=#B<{;Pu+|mtXVzYaSkap&3S$+w>Z@CRJ`R;o2$vsDD17i#+7;Ec)FaYOWgu z7Fo&p>1jz$V}yA>^7}hUXP^nuNSeny!OcP^_4_?L;INsR<=?YG#OVvswk}!ro-3^I ziONL;wTW|${>tS>u+P!x;EYs{Y3RGR2!HA*ZnMBl0z7=>dPE z1Od=gm(WR;3jbTNph~+!zRnYkU1{&_TdSkbF%HxLJ6bHnrP2j=LCLR8AJ`}La$C%t|OZ!`*PCT zZWQIjKG5@-f71hjIJ&nvg@Z+o$Gdx7rTk^6Lq8SUM`gI0MNZ;T*yhxRu96+PAivUc zbtr;T!QR4`NWe)ayR;l=XAIzGgSPu?L(D^=0r`y}M>NwGDFb_=WT1qRcoSu5sUtdU zOr`OIeKAsc=4JaYn4+KnR$r7pmt*dtLdM+3p^f_EC6nH+PuZtIZR+d0N&2E*+@Xh_ zPWl<)La_p!h@Jb1vzrfC95KjVJ8pAXXGrJxRS`C1)ID^FjaoPpLw59_txM`bXH7~Z{)-dMUEW+faW{pvcm4?NHkF)P$EXK*UL!kyb zdHK`N%6SSNhpGZfeC{y&WgD%0c3GDlrQj#A{F5`uflFvNn<^H8w;XTE*1h&CpN9p# z5}DcHdp65~{iZj9(fp}#Z!&-ZfEdMLIbhHRyj(E<)*_ei8-$d<5VV$fr@7_doYz{=8nTaLH z8@i&)hu=?XW}UP-j#y8WILjWU%^>>6^2uu9F0=}s;(;f7c^0jtd>Z1IGlP$-doD$| z!^9R^zJQI$Ag$D)C)T(BuWN$-$O`~1lbb#3e@!#^Gt=ExT;=DqHzn%ng4KyufqT6Z z$O;gRYuI|o?zh+=gig6ydtsd-RP|~kXG;FuQANjK^anq9#Tl$}ToC1;Yqaq#ZZ3NK zdFNxjZQzWy$ZGo(29X%p0=C9aog%CMh@;X%gNNSBfdIxDll&K!muA`Ks(C?Omut;Z zrnTgBc4SU~(?iX12)$O*ui%e&=4}VDANe=~e^w*sNlbyj+-|I)`QxVEXEYZqYEXdS zYk>YHRcv5TTfEdu9U@UxL*%uZNf4tuCWf?KNX{fq->Tp4ET*q%4RLoaG`)8i%G{ty6awJ|Z*|Dkf8KS9_4)IFW)Hb}~#AH^y8D;T_Tabwol1G95qoYCAmNm6#`Jmbe( zZrsK%g9CvNi#Ilp=?+JV4Ke4GV`dk}=y7&T9wE+blYPg*^Yvh(_C&o~wlDZj!j?MG z78hJT5i1cGx!WrZq2tsqxkkL13Sw(}%x3G>lhyW#Hal4AG~M-4>>ZRfJwTKCmHeOH zt_x8m3bq|GR5O?T9&+QJk+Ugo<%qaQF_7+S6CI(B1{FskVRM4GF?b)Wb7Wo04@=cA z(5%Z9!Du}c;PhHm3lS1B3BV>dvoc;%`QiuFaFwkqeNXdso2$La(%z#seF4L8+eWLc zsRrcFThUJQjl-K4&Dr`AKBYR2SYBDq1Vh^)E_|UG>9O;GPJSglc~e~@<*1~qYy*+u7Q4QqwH0#WotE+))`Z-d2 zroc21Va}LXGE!zSs}Ihhp_zAOlqJc71gAQ`>7w4FqE`*~Jg5*U>QbfZw6paUH@;Yo zdxe&1)5vO8`X%;_Ts!^LYvcVyimu^~DKyWvGT_8s$)M6XpGsJWk+Uyu8Ye!K=PYtm z7$}_}R1Qp%ZEXl|qY32Uc=p`&FQo)qiK*N2PIGqK(OlS87b8Ag=_KO5u~?p7~#E`(ZA%zv(}8jnb~kQQgiJ6f;C{I zY{-8zyi6`tY`1*nm*rHiB!L=|`NB1f5u~!DPNQ7dENk#g`I%!oUYq9c(pWs1rR?D` ztRZdvo0Jq|_c_XGitcvO@1x!5`gP$=6YpusZ~pHx=GtN(E-azTfg#aR7`1;j{+&~w4^#ZLqe)}{$(%1q)o=cCzR_Na8QZ9eOAxF!_?OUcxzxa|K~>q^;cz_gfX
Wt%w_8OnUWtsS!2$Lmss)uF)lgOvh=wXm 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 Nwd2Xc*ZcywZumeNPcLU(}I9ti{ej+ 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 )g%u^ESFOv+nmNp2|0JQMo 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 p|96u9?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 \ No newline at end of file diff --git a/img/codex-ap2-overview.png b/img/codex-ap2-overview.png deleted file mode 100644 index 3d96f5fe306956b173ab675284b545dd522e2b07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103244 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 diff --git a/img/codex-ap2-query-translation.drawio b/img/codex-ap2-query-translation.drawio deleted file mode 100644 index d659c5c..0000000 --- a/img/codex-ap2-query-translation.drawio +++ /dev/null @@ -1 +0,0 @@ -7VrJcts4EP0aHaXiIm7HSHaWKU+VMkoy8WkKJmESY5JQgdDmr09DBMUFosJYopVFvphobM1+rxeAGpjTZPOOoUX0Nw1wPDC0YDMwbwaGYWi2Df+EZCslhmXmkpCRIJfppWBOnrEUalK6JAHOagM5pTEni7rQp2mKfV6TIcbouj7skcb1XRcoxIpg7qNYlf5LAh7lUtfSSvl7TMKo2FnXZE+CisFSkEUooOuKyLwdmFNGKc+fks0Ux8J6hV3yeW9beveKMZzyLhOeZtpf2Yw/fQm8lf0c/TMNJl+GjkRjheKlfGOpLd8WJsABWEQ2KeMRDWmK4ttSOmF0mQZY7KNBqxxzR+kChDoI/8ecbyW8aMkpiCKexLIXXoFtv8r5u8a9aIysonmzqXbebGUr11Uo2GoUKcrokvn4iCVsCRNHLMT82MDxHjygPaYJBo1gIsMx4mRV1wRJ+oX7cSVC8CBB+gHACjUrgM05W/p8yXDwcYnlFlX8VphxAoy+Qw84ntGMcEJT6HqgnNOkDkQx9k1MQjGGCwAnSLZ8sCpmIMg4o094SmMKrZuUpoIFQPCF2DLZhCIYjNAz6DTyISb890h2PFlQIha4XcE6mdwRuuJioYFhavBnT/bQCn3w5ji4KhRF+LEkmWXwGbqOlQvWpSuPnZEURhU/Lvz7/PgZV/y64me5dh0/b6xdHD81YE4/3l0xa8XMtS7vc94vneR2rRlmBKwhmHD2zDfumvmMi2a+sYLiBPlPOA0UMOtQrSPC8XyBdkZYg5vUYYkoI8805ajNHxMSBDsGnME9TFdvhDRdDWm6ZqveoRu9uYf7+7kH3hD+tVgYnitLQatcSTT6KCY7u5R5UZfSFeRlCaJ9YijNhA6Qtk5yrz6cxjVVp/EO+My4N5exFMO9jQgDyRwj5kcD4azw6nYMmkweoMMOxdOUJg8klVbV7mhI/Gvp0Fo6OEVkulzp4KjHrV8+NnaPc98PX9aJ4UtOnQmmlUwYK0Wk2QA4j8ByWvXSo7GS5TVX0q36Svk7Kivt2LJ/oxMIpJ73LkGgM+Y2pzM5tBPJcZrnqrnt3ecPPZeKefw9QyzcV3t73trqMaoITtVI2HSU89lTLb9FrtgMHyHxDRO0WJA0vCazfQizrZFh1TG0vYtfXzhq4ZKjCKwGQ4TbIWcYX2Hcl57jnxNGp0NWSYM34gOIMHqMsgxKzZaaoiwj7qt9bTWFPFqVx6n7Ss/ho5Vo9HiDUbD6+ympBe0KktaBoFrITixrPKdRjFjaC8saXTOaSzW51ndd0+XS4A9iYOcD/0UZaDpeI5a5L2Tg2Gys5DRX6pmArlqPqAR8zZOZyBPVw1lXEv/ADVXfJPY6kthtIfGp7PSskdNItp77yuc19VvBklyro5Yi1/BGDbx07cCF9itXR6569PuEWULSHYbqrdwcsxXxVVwvfs956OOAdyA79HbP6f4ctxdthcLLYqzxap8B3K5XJU5PAVVT/NNtfkbqmvBNr3kJ32RdS2SGEhBtK8N2MSo7orRy2+9pRzXTreY71ifAQ65Dx0QBzfJXWfnw8sdt5u03 \ No newline at end of file diff --git a/img/codex-ap2-query-translation.png b/img/codex-ap2-query-translation.png deleted file mode 100644 index 45151c8d2216f4b62fae65afeb1143387a65e094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33974 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 \ No newline at end of file diff --git a/img/codex-feasibility-deploy-overview.png b/img/codex-feasibility-deploy-overview.png deleted file mode 100644 index fea7424850b7fbb0ef5519ab50835db943b36e59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369154 zcmbSy2UHZ-7q=QUiZL3+7-MX)VZ-f3gSxXjv%U9K(Cu}$&Q?^^SW%-!(b$6tHpC7@ zEEsz?u^@^{61#vTDp*kb-XxIxzwi9ZIo~i5)-&3*1#i}y`s``Z;`0&=)?sMO=JZ%w3?#GvdKyR~ID8>&Ael3eL^AsQ zsTQZv9yFq%RIe2SufX@H&*HQ>t(L#WkO(B=2m);ciK!wI29jA6GWZ~pQfUN+;ji&V zyVcvYAT^Z$7Dy2r%}y`o3poaoA@Dcfi&;J3H+T&`rAqLj1OJGGiA3r|`VjEQ^7}nj zt<@xS0vZr1nVw3ff!8TQo=PklNMeI$kJD`hzqnSj+lNnKJAytGyg``6R6;6+LMNpX zi4^dK(r7aVo&T~7ekLnswEuM;myTnLvIMLVM!HQT5@#^QeKUvDkeh|>%&R0qruj-fc8VBpBvK$r`FvYS+V7t~hF> zh6p4L6O0f@LUAmjgdnqvi%G&f$R}4Yy*NW?gs3fnfCsArqsA=`t5mIHqe81xCk8Lc zag{_&h?zuD9$gei17K&L-%rC-Yzg?*DeeX0IH80_Qp&}FAb6%Rg+{)XY}Z@mT(AsygSl-2x`aX0aMet? zE#d~M2U(~pCPuJ>CoVbc@N<3Ipu$F_8>oKp%4?&GWPU2$A_NOC@E0!BWft4~N*$Bt zj@lGluHJxuhl-+NH7tdcA+F9AX40cZ9nS`9d~Uvnp$FgFB4M(KYTzhLF(MCTphTu6 z5+VASa5Mn~3z-aTqLD9iTWA==9du|oG#B3$^7#{fB*8>&KEBn1(fBr*j{`?FRy3|l zutZE1!yKYG%|b8BFW`n$e7-#a37Jf>CZ5TbJ==)Sn0 zAyzw`#5jX0!uVtz12sk5UYjmRQ_JWvhR6h%L03?@GG0`JSY$jzMW@SMHeQh6F;U1m zpO@h?gfR%FnoUlj0(FTfv@kUQb6jkbBr*~Klh3VFX?Se9!2meM zi-O59sV<1gRY(jR2w`|BN|8Wd;s)quMbx24kQ`ox3Q`+zvv-m?1Yy7~mLpOOQL_?y zlMw-42nw)-$`D`dhSX86foWz0{NOD@pg0t6DtNH7i5f5+3Igp!;2_Q9rh^A99mQ>v zi4kdRo7Wk!z!rv`iJ~N>+N?x_u+hqrsC6t`%u9DVq9G@oU~}0r%nFMW6fHku5j)Io zzQqdx4~9hjR+$IiDg;MW0zotpir7PX)GSsyi99XIrzdG`b|c@JP!dH%0_-HYY2Ij1 z$nYmZ=9tD|48)W!vqF_%Sc8s`&H~7?F~klDP<2xR_5f-jzgnQyDD7;6zz4QrCA@N< zNN?BaBngx+4+iCy2!_gIY@(F!vf6?!s-6kasRUiZ%!dskE8p&nl6(RkN_C0(3TIeC zV+k1;#=@B*kg;?^gc;#Tgfx@JY!Av2t|Llkk+cD!2_;D50aP5uH&qxN(XcLT_Oeln zB%rq@fIl|#(E%jDs(0=vKiI{2nsJ>>Lc1gpaM=$s)WKJiWf;}0BsVtMyIFHh+)1q$P76!KNOTG zq7-8!9tbPRaYh7kTJ0!I3K|{ZAUni}iHw-XV=?OkMsrMEhEOH8SY$ixxz!TAxEjg_!RR2C}38zie$4y#KJ5p7(4l<1?#^fW(33fW~*x0ZqW z8CDnK7DXH!vVtOwLShn41r~t(WU!o5XJV7AG7H=5P`)#fI=v5l`ui=|vEYtKlkH8c41X6FKgvMXBWjf`mvc$P0mo0Eun@=8tG} zX0d=O)=RXah|z42hETIYgmD~px0S|1U>H)1=^-84qP7ZYk${b%Mznf$EUe`beLAY% z!ZHR(eiH~Vkd%r9A~AYE6Luj)r8Owki%|_`aJbz{ECCcO2#M|VSimB(OX)JDo{c6z zTp`hI2<)@+2my|jZ3j}*t1LzpM@J-ufTANN9l@zkFhz=h6!&y8o?Ahah{;NkHAJ9V zBYH_J<_RGplgBJbaAORCjBAzYIa+&w6$k}FUUoPXLFFDVH_RqOREjddRKaeK7Jv|l z;>AsqCe{b=(5c|jyk1w#P2nVBLM_okP|-LM4M!ry{g=pKgWxD)amT1pf?P|X1?Bdj zG-R>UA(q)<@XIZZs5EMDxb%`J>citpj19@jSe$282_*!v)P~WSm_ruvA!bR!#THoj z2+4>j$yQD{68Do4D@4)?DOwX*=>~2SlCt7HJJ(0F1|ku}&GQ=^M5oHCupk;$f^M^m z0%3k!A!J9KWR_HvFvAiQGXiIY$RL+8fyl!VtHS|fR$WN!p*kp%AeW#@I53J_EmJBS z9@rvh(&7NlIn*vUEY@pPAsQbbAw&V(EgrRHZk^ca7JKM{xET({tU--ALJWk-e52c}3iA>YLO@BR<3WIoggg|D zN1`w&d@KrE;iN^3M%;@_6d{KQjZt8&UaSidtvVYYR#5d2fu&J8BpFrrQ%7C0>&A=#p4^CU5z z-X&COgi^K%Qwa$!9>PP28llnYbc;xSW>~~FPz7+590thTB4(4xI=`0;nZ3lhCWrbjl$BXzmdLa*oVtTQdrB;eV+#rYQiN@GWD7l zRRJpq>SS(!9z)s)OQ)pBiGUPO(2^jj%_2IN&QL2IE**>E(_wmw(i4>=_yn#bq7Nz< z0ER|W**83cYf@X#lI#g(}GaUkz0ZxRtM5ixC{7dB((V)_5B+A(YOUxb*k8$e`+MrZ;|jrQLk3a z#u5gj9(9sqP*CbI1z0L!%*r6)qlgLum%_z`%8O8N;306ZM5-tbp@3kNbeldL<7r`o zn+5N+KFkI<-Lx>a?0k4rkDcn3?jJ(BLE!qpk$s z!I8xwD&I|}#wiip34+)G(fm4Nz)kiTxEecwB#vtgHdcs8@&$-~MDC&Es9zW`g>+#| zpyrB#N|C}SQOUJ#lPY4A+JtOB1@(wc0iiEp(9msUkvtA&M8H3ai6#Iz1{a@_s+ZY$ z36~+@u)|6a@45notoXSqZ?wKC!o5lCu30fQ9?pQ zf|CXdLNuO1EDUm)s9i5nX>c#hF%#lcWk8{Y{*0$S#yS65!D(0j30LR49i}_nJ6td5p)FBbY%&@!OR=L}Cm;e49E-vxM0^GfhXP zlc+Y49i{NNS=pS$ZEv^m)LjfG8FS8mS53K~;Jq8#V-JR=-{X_{w!?V;I2j zkqFgb1t}jA_Icz2hzhcYsFo~1y`Xv!AUQ%&y-9=yqISE1q4tv_(V)ZT*MQ+7zDq(4 z$vh6K`%inoe3G~cr#z@s2y8)1favxK30y~jOrvv+thh(Z^;l(A2Ln-utjai7;Z{Yx za!AdkX;eJm93Toq7ISiAECH1P{&FFz1dl3&2_l_@%A_zHkkW~$!&aJrNALnq&sFo) zAp>fR##yLQ9*s)*217y!A!67>Wm?HpJYfSrkVXRO!!okSO#V|NOqet1poYmBy^QU! z(0vJkP^q_YV-}?!1Dg#Q&@5sveGK|2A}d0>sr?zY9kUI9hpX1MHhILt^8%phVxh(PAy zv*NZmqVcnQK!ZqHJq3?X6q=mrw8uSCwMUDI*kXbrtnm2}rOHp>(@`T&=)tH?6_*k6 zV^(nlauMxH1P+0TDyPiH(5}g4PaHC?7@M%>7qQM~2^867&P%a_M6%wNwHL#-5fC!hf$x0M!@W?0E z1j68NVkGX>2H^z7;+F)BY)h1`){2<{QY=bhx*@ZiML>cK*e4N*WtcL+Q&_x4xtkT! zYIwnLlulKL{1g&_Y&A+@K06kWY3*)BR0MG$J|uLAg&_w!Y>md1E;b>ob_?Bli6$5f z*~olELK7$$92U!{Q3?D}iGyYlDuSU17G!H(M6m*}fMw%~g{Vuz6q0EPDcNGu$Xuw} z79mA2Bb&?DarkPUgh+Au<+%3iZA7|F%+$pVjEI*WqvAZZLQFIoL&Y*YxTz8>HCe@T zhE)h)G9;$N$v(1yq89q75;KJuwjm@>(1iO5L`4d5aG0$VY5ZinPD+fLObk~53n|?W z3(?{V5Q8?0L8X*MO%Vr1*J&}C9u5KEW{!~kF&5A|NaRsV989?#!+lwt1he!^3B|`D z>vb-PgzDnNq7)};Rnka42{-O>nY~0z;N)_x9Ew1}@pwcolUjoT{3c>B%n8(Q1gnH$ zx{D@^F*R|3OM^%-K!Gf5U7W`7nDru4lq&QR@p_g5kI_s#nplk@6Nd_1E}}3)Y7fKW z5NW(JM-UXdw0elE8DR%#1pyI)+bbU5r^ z8a0Egfb9tnuFEQ)$p#s;dO^^`O!O( z6J%8Riy3nE)`-oyU2NMNsLbBPW(8j40UC=}~D$QY; zL}oN05Zgs^Vb+8+rm?V45-}wAnfX*Bu1-##SeS_L;xLKC#`p*d+j&t6DlwQK3E7KM zIiS-5G3*k6F%cQT;FFkTLQpb_Dk3pC8V^Q@0z1W}2V>X8F1sWpj;(E zAET%#8l9R>vr9E9euzslxm8vi*+ipG6+^G^@>n5fm_fILFbF2`fUY8%a6o2s;2tEX z#y`DUt0(5Q3tS+A(6}6?i|S*Dq!@!vrCP`e;0Hn02Zb%+Fsvp>BmAJ(%l1)}6rROt z2%88RzS;x9s6nH*N-QQvm`(9$lmrn|3sP&FJ511+$swX0qKQJ9NXS472q7*_7!0c@ zY&S8?)#jOe-$>>r@gEXa<%7#Gc z7zaY+kkv_2FmaAqU>*;sC*)Db+@4?{=nx|@FOOzO_$5Y)-L2uuc`(~Sj{~HnWF$m< z6G)wKLr2V95u!9>2+k&}O{Zb#92%Dgc2YTNmx--sM+7P@8-~Jmxl-)mM}-_zrsu;k zwTC2xLL3Gb6eOHFN;Dw_+6w87LAKrJ)A^mSCt`~T-6AHaiE_yaSPN^_1Oy>4eUyZa z1#k#t)=Pv+kJ=nZWr#wim(ci1otSIZ_+0`vB8V{)u)`N+CJ-JoOh6=26^|%K{c#$J zVB-cbgIO2S*-=-(gmOsEU_gfSn&a(Ja)9zQB(hII^`+MWfXaTzBW{_hv3lnthoLG!# zwHVz|y2^}55+I0#Q4~KkSK@WB{Q9uZ8e>6zmRcZIxb
    Hxc>vzoB?eVEKyx|kyGt4l z$7+;ZgN04e;fbvrrwt&HyXW=N7o}?7-f{%OQzt2to zW~!`+QR!%JRr=D!qTB<~NOr0cEo>KMTI|JG17WnXj>h8nVxj5P%B}VuzR??C%0QB^ z2%icpdR0bYhb5_W{WT@Icb!FQJ1&a+UbL*RJuA`{TBPtB9QC>K=3S+)w;!WW7fUsU zFgVK1-*w(k!kN?5@(wqN)VNlad&&Umqe@vHY{mwKLkH8J|3x%OZ_tn7F@6lK#W0XP zUnFObxcmPmaYj&Ih@i7~W;Nyd=G)xn8Z0*uL8(yajfT(7Pet>&ea_c{0-3Lt5$*0g z{29>qkGm}50C-GxEn>2AXPV)lKZDP-#b0XMwL(^UgPMyKQ6XJ$6H`)vorCYkI!r&_ zZIrq;y8=9>8Cd>+kS*&;#bEi4#6yq9zHdHAQ$gNqv^r%&g6j15GbGx7NX=AOty<35 zxzW^+FmgaD*xI07`1wq?3r$B9P3GqPs}4TL(ha@VH`sO-=~x8$=JvV;?7%-`y8qdJ zj6QvvoXc{MUDRiT_F6=}>m|YTYU$;Y=+H)gV5NkRtVM4!x!4&oC0e;!!b<%L>6Up5 zMsJL%M8MP0{eKwy&a?5XdIo_NO9_6`e5MBnz?kxS;Qca8A~CwNpG7G};B=KM?FoQ` zu0^=?9jc@xT|*9{pyTZJT|Ha8x+U|r*@+W0uQIa@zEL~MeeJZQ0*^6rcKV0AEkW1Op6=@&L*!PcCkz(YimXB?b3vV1ldiU4+f8eKt+`asi1}GSuX{d zlXw&FJ_Rn!llpo9_0KDcKiiFU_1b;C9}ofZK@>X0IE{XGQ|XWq*918_L^=f2(Ic)F>{ZnXpBohasR5$d1(=)zMvC&QAei){Y|$S zziGko${kWexX|`=vh^y9GLaa{u4`WBYt6Ynk>J5La7a$%<#hGn>GwCxXdnC=y)MWY zW?RUu<$Tbxn^cdNmm^nUs&^aYx+^=PFKJ$-?$1~sub9&`gGB?A364m>^2x=82o(BT zWpw5N_nsZ>|1{54O}ROc)5*0t-sp3Ly)hB$J+Zm8KI;RJ z8qp~O#s0@xvONtcjVyZSDbcyHPD(J@y6x5V8$$;B+_Ajpagi^7QnaBa%Vl9 z^fp#p)^+V-?aK_7bv;!|cOM@guJ)G|nS1>Z2iBU_o`3#}8fbcG20-)JAAhKiiE#Tf z$^Wb`-K3)g!o+XUdbAJGzu9(qWrfE#Fi`}8EGh~A#$1uDfgIdQ%btiRT7hhk(ON@n znAFcNY$@h1E>7K?Uk!$3A2&%Su$r2h%DkZ(u$PA7s!H)AzApZ&B)C|>W<;mG4Ro}; zZHQkTM0!hh=9u|o#`zt$sZi=bubW@zEwAUVuJE%BEr;A`ul>VHb{ap|5@3p}KpMB` zf=Boc8c)eJwrgg1uJ^zfq}m>dAA=$g2o_sz4Z-sJ3%RgB%V~e}`P`_QC9BX)L`^@p zr=$vW+0d+JOzS06_4$$4L)0&$Qiu%4?vls@{D*$DdwgitE6@$5l4TK zUMH7BWbt%0sx`0nE*?bf?rv0zyk{f+q!rEC0f5A&6IKmoBbgwOC1t_8V&wOW$;%#V z%>&&6@*#r-(^r4QVnQYL?kYv3E)x7jCMqRcO-4c?NQ1#s!fW?VfA_gj+2f{X3EL2C zN(z|Pdx0cXozx?&vWM^E`+gJhYG(3FYS`0szG)@ThykgD7F}E7-CS^kQ%Do$PfV{; zh`q(=*&)=)_u5!H(?=gNq}q1g{z|%d9!M~5(VGGn^GR@aqJOZ{9Mqh#_tb7y{rvR* z`;Ay;esSgW+g~GvIC1tPVyIuMepXM93X)A@<$O`_yF5487N~n2nTas*=b%uj>LsLd zMZ5mLz6NrSLRd;Vj$b)Q^8>R{kVxdJYL@@|2l3XG#nLQKs_?l&=GvM>{vC8%DPHMU zmN;xteZJ8~fw17XZIP-jm050Q?#+nq~U>K zP4%x1hI$O=tiZiUmOhBvrY!UW*scvsbKB*cobTW+?oBh58fM_*7p@l(a=TSS^4KP8J} z{WYq5x;YV#MsTB$MsOGkjN?yzJq9k!__tzJg?D%GP#jBv{S_iDNsSf999Gl+uwT@n zfVvRdYxPRx<@7dv8JWThciOp+@FnGeHt^X8o_zeoiv6_+RSoX64mRbUBj$8bjtU0nSp&$Dneb`_5sOb@Y~pI2(1pB`L?+zOI0Wc@V= zC)b!SM0G`HS}3AY`y?<-o?SYOm!pG|A!TA$s-qLRAj9nec)hzRK8hp0~xVx zt`hlU*d1IP+u;Y>`rg8jSCLiqq1LM@Pl8T^;OuKW(8sVST!8x2nKT#J@=~1l6h2@J zDoANCX*@~;ZnGn5Vl%UpV|Y{sragFbRZ>yU$KUMiuj6ug?>`_(#oG+0yf1vXvs2ny z_=Er}L(KVo4345~6paq*)Y<(jSkfUtS>Yilojp&Z~>$*5Y`Y0En2reK5$<2 z5*Enm$rA1@*=Tz$t@*LOjBqLz&BW@7?RpuWb){~k?0RpM6km7}Z`usdc41F+$A22a%h zLeGm+{+ptnfk3kDety|6RRjz?4DBRV_np}&AYqsdbJrLLe6SkCf@@>8M~$ zq6k}f{o9Njn&526jf((4NI{s;CFEuHue=ggJr)voI9ge^s`dDB)c|tDQoC;?Vi;An zEMH>Mkf&ew_ti4nrF0bj8~hok{@1#}xy=E6flHm=+-F3dJTLL{r9e>BpB(9>Hvu;i z%;vG}MoYMTt~jt|b&yZPLV{eJLT?aGrBadGd(mn&=F9tq~cJ3S) zx{_h(7CAQCX3zV5k^;CKR0@%k`Yj?QsT<5YWeAkN|e^)4!$oKR+Zr)zr zw>(@1QhwWN^$!%2@5k6p(Gp@WxPkJ`XG2j<@0C?L)PK^^ahq>%6`ZC~CO+;AEz#BM zydmD_F$}X|527$6^t=CeL(6w2dSm~Gp=HjmPQG;>CZn#x%SpulW@l;f|7B;%H-uak*+VCYrDyWp2ATo{sz%H3iG5Hd;-Pt_ATo!?DZ{~x#sBggkC>QPaXFDGc){v+XeRQZt1IPF zDu01X3%Cg!a%9rvBd%3o0Hv}MBbv(K$+Ph8st|GtU$g5uh`K1-X?vIHmy@>q%~CpD ze4P%{o}>pGJ=~AX?sB$Iwo#LNjIp;D{Ub~&feI$cG2p-eOyLq}j{t5@Ho;Yv(s0c? zx!6qDFL*Y~=j47MlZ5Zz;Fr@G9)#ikn&6=ZFhbhE@-4PjlC;W>v>bylV$$n356`o% zjh*GUk{VU{U*->c?3~iR+|l-{0Jb8RQPHkW|CiNF^#hjbd$hDM{l7Ax23i6esUJxN zl8lrkZ{M`wkpB^KmcEH^N6M_EeSSIj9DN4RvB;HrvypdR7_wsit_;ig7Q48zUwVu} z9?B{!0z0Ph;cC3wTUIwiAf<`C&2`-`*5PE>s$BjaUNQ8R%UN@}*_mQyil2nU?r<^c zuWLr2#dXVt{x4@Q#Ipp#{L^AvoSaLheHAVrm`Csek>R7r-D-2n)IHdVbe~Jk#$Qt7 zGx>G6>Q_w>Uz)T$6{EuyZfl>x=HJk%-R}4}nk0iltz_hM!chamP*h#@Vo@zkn8G!S zi7GFE-r>uQ!eo^qN!0ZT&g0Gj8l;y9{RVdq)eP|{kf1F=BD&Ly7i5eI5->!F1b^!s zfE0Fx>En*C{?dS#@~fsMF>swQA2F$hr?^f;en%k?rgsr84@2e6mNhB8^Xi6QQ=8BoWUx!budan%_0Tvz8Zb8+Dj;YJ^RKAK74Rx1D#Kr zj9UnGRSmO(reYyae5CbVPw$Dz0b5@Vk*DiJF<&pv%3MEyK#ksE>V{OKXS~Oa7p~Jc z3-?fGn6LU0EzbpPBc7Sd)2c-An9-%`!v|LS_z{CU!6uaoi*K}G@Ox6V^21!h3E^&U z7>u&+lb669em;l;xmfKb>q}hbZHC4zFGyXDgzKK)d$H0>T%gE{DI{3Y2r5#ujXF{o zl5-S~*}Rdu-5HrPI2%yYIx>Oo+RdU{NhcTWA`Obq@?Um$XPf*Yx53`f>3{4ErN{gi z5qVM?>|@X$-;xOrhj=;j=uVknRSi(9cAQUWVXd$l)R5r_)-gijTYp%#`}4W*_PuG8 z9F|q*V{j~|BS_qcw*Q;2GspX^3j?=+1tWJ2EQ}7eBrs63OVw%5HHlx;AMA$Tf8$IS ziTW3fnRofW$U;ZYiPgrkOKEj)dA~^IXUdfE{Yl71ogWTq=b(D|7}L_B+#^Uw+tu;e^X&RM_{FA`#sZrMdo zQwjQtR<3rjT@ZA6uJtk0Y))vI0%bGoHm>_^`SkO|wUrPU_IqTkU zwFBxwwkNi-|81lBH2Oh)TS)ee(ut6#d0m_NVPTv4C69&s7|W~OLnu?__rEQ;5I_55 zJ%RQN2p0lK5`4X zOGa3}NLEkpki#{=7P|A9>RCSm&et4p6%Cyvertb$8pG7~8`}#83Vl#Yh7vPy7X9dm zrjGp1c^bs;{qK1X0lZHnU48 zzm�?t|i>2&1L92C_{&fH5;N?+Mvc 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

    My^=#P=kEXB_BvpZKhx)V(cWqNeHd=n`Xk zY(vs;v+}a1?{ys(E-sxX&Dyz3XPRG6t8}$tsgCp3-W^XnNJc!@mk<#TqU3Ci#I8bZ zag15-z5P#-EqVl76lior@{jN6nf|Houb`b z8ph7Iu+Q^awA;AbBw?W=eZi4(bHh(+y|5rg8sbgDL(^v1SSUSSKdzl_sf4nu#X!5} zu+vJiYcy<6Xg@vJJ^%1N^W(@Bj{we}_M})6d16NWEL+VDez7yfb2}=nH)2+NDd_~K z4pSQx5MMsMq^^5?iQ*c%)GS~^J@MqN$kT_~U~#!bu> zQ5$Rl!v(QVzgOU7LtElVnY^lrEK6v|RjJ^t>yFDi7DnATyzi$&w!$jYTYjsqW?wYq zGCZ0L&3|wA5GvQ?ppoh2a5#~s7PZLxFO8rJ;HUh8gx=7HyHJI_*}RxUmo?74`{{uX zb6Mvcnv`4CDU5zIU)5Bv5m#0@iRbEOyH$Nu@}rzGyv?Ej_1q7kD z&3lVOX|2CKO>-S@?oy75exb>b&s}w@uM7EZd7{c&;)Zp0;8xuW+A06wCt$yx?9n6S zD!05*z?c(MgJ&AGustXAySfJG?}*InxF@nbzoIIo`Ox<|I{qX!?ZcvdnI|1~2@3|x zpL_1q@{Vhlb)Pjo5(|TK8spLUr#(6?l5l+>6Q%d(bK2+8@pS=1tWc6zrWI_fj~*E? z-s^R|hjO@h%6?#wmJt3_fvvYd@q=vP?T7g;T{ISTnbf$We3~tfrgJBc2^=N+AL#cu zBu7d+w@&5P!?;hsyXm-ETpF64>Ue16$UwsE45eb}1|>e3v;HOP^O_^CCmgOb)Og|; z-7@LleIGgFKja>{=q+37vl*iq>LYRLvme~O&_~}ze%ew8q|=hz7@y%*GwWa0YJv55 z7&6ILr5%BPu%!P?TGbUrd@P$MRp?QV9`0GKs7bqiK-FQQ!b~6WE8E-6L5!v7xT@YY zW^#O|M-L>1#|TvYTQBl|x8+iMj)pa{*DVK@Jb4$>7eCWo+oP2y<$R@3^20f;i2Hp< z<7_XA%X&o2%+4-OqP!e6HxuHU7^@D8Myd86dvsq2KG3S1_)k4~iYhp_0;}pjnr<<$ z60_Xygr{xwfL>}@<>X&)zQW_O#{1symppe{MX$vE(xB4SHOj+R8B4wLT3G8O z6n4);)71D4UxTfQ4;JLW><~XQVgBg5#fq_Pi$75u3r3*J`$~j#gu%oEWQ8#;5ar8nuE#KdkYY`Fz%ku^B zIpPXo2HLlH= z_(P&f7SXOAoOyiuhsn&4mL`YrOa`8MfAg0PLBBLSGANQiTYkueO{G z-doqZ5h;Gpkd0e^@#65HON!W@GqnnL;wQ627(TgazE4fplle}RvAqbQ_go0hzk2<1 zhxQ{sn*Q_Suh2na2WHVdykR0>uh(s!4+=e3wuyx1vlx;FOi^9g{vHgf8s+1PTbAVSg~8;{GKb7S`2Lk(h_mqXNvmT zwD(Y(xn8?^^*x~Pw!|5o1Kf*vwi=a&f!@wbKJTIRI2xoQ=KtuWEntopmHEFYNltLc zqrZhpr>lOV6Va%zXdD=vjB6QUo9xaMpXn!}Zd6BWk6-dPS2Au%r{mj*D+txyX99@- z%apx8_xRo5q5nUJ`GH)plOC0e%^Ab-vpIdb-R$oc^D$9M-{qd=p@&ry>pyGW*YVX3+J+6tYYS&hX^1m)}_Zu?EKe4sX_^(MkW^r3v zuuD*$a#gAc(4-b!OEQ}i>Ikm+t0^MvFmLlzp!uC>vJVYZM_&_*zrC70a5Dodcka~v z;#2S>^8au3&t2rlzw^<*w=R7bJiIe^>KEAuAlREAgTmlB6_s3HX#}%T8_Do~kn^~E zhWh9gEr>z(cLsVM6oVyAZ<(c&764mWdj3Tje9$6Z>`RMiLh8M|2dAajFTfML`+@q7 zjP1w?j>mtINl{oRQJItfzwZ$81k6q%W+3R(p)E6T7cT7a>lNa^U*SKNYTr8qW2YM$ z{zDtie||%s9g8NuIk1HR2s~Z= KT-G@yGywqKBzRl^ diff --git a/img/feasibility-gui-example.png b/img/feasibility-gui-example.png deleted file mode 100644 index df07e1b9d09735e62cf69c5712967b77f5fa27ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209323 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±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

    CKhIjP3Z+&EMnb{7! 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

    - -
    Figure 1 - Example feasibility query
    -
    - - -An overview of the platform is depicted in Figure 2 below and shows the architecture of the complete system neccessary for distributed dezentralized feasibility queries accross multiple independent institutions. - -
    - -
    Figure 2 - Overview Codex AP2 - Feasibility Queries
    -
    - - -the System includes one central platform (ZARS) and multiple Num-Nodes the central platform connects to. -The central part is responsible for providing the user interface and translating the user input into and generating three types of queries (Structured Query, CQL, FHIR Search) to be send to the Num-Nodes. - -The query translation is described in more detail here: -[Query Translation](../Feasibility-Query.md) - -The other components, which are part of the central platform are: -- [Feasibility GUI](https://github.com/num-codex/codex-feasibility-gui) -- [Feasibility Backend](https://github.com/num-codex/codex-feasibility-backend) -- [Flare Query Translation](https://github.com/num-codex/codex-flare) -- [CQL Query Translation](https://github.com/num-codex/codex-sq2cql) -- [Keycloak](https://github.com/num-codex/codex-keycloak) (This keycloak is for development purposes only, for deployment a new keycloak should be configured) -- [Aktin Broker - Middleware - Option 1](https://github.com/aktin/broker) -- [DSF Broker - Middleware - Option 2](https://github.com/num-codex/codex-processes-ap2) - -For further details on each component please refer to the respective repositories. From fef77a7f6f4fa4f076cb32edeb233680206ac089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 13 Apr 2022 19:25:48 +0200 Subject: [PATCH 011/118] add readme for local feasibility portal installation --- feasibility-portal/README.md | 144 ++++++++++++++++++ feasibility-portal/aktin-broker/.env | 2 +- .../aktin-broker/docker-compose.yml | 2 +- feasibility-portal/backend/.env | 3 +- feasibility-portal/backend/docker-compose.yml | 3 +- .../start-feasibility-portal-local.sh | 5 - feasibility-triangle/flare/.env | 2 +- 7 files changed, 151 insertions(+), 10 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 739f1e6..defad5f 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -4,3 +4,147 @@ The feasibility portal provides a feasibility query user interface with an appro the central part of two Middleware for the transfer of the queries from the feasibility portal to the feasibility triangles located at participating sites (hospitals). +## Setting up the Feasibility Portal - Local Installation + +### Step 1 - Installation Docker + +The installation of the Feasibility Triangle requires Docker (https://docs.docker.com/engine/install/ubuntu/) and docker-compose (https://docs.docker.com/compose/install/). +If not already installed on your VM, install using the links provided above. + +### Step 2 - clone this Repository to your virtual machine + +ssh to your virtual machine and switch to sudo `sudo -s`. +Designate a folder for your setup in which to clone the deploy repository, we suggest /opt (`cd /opt`) +Navigate to the directory and clone this repository: `git clone https://github.com/medizininformatik-initiative/feasibility-deploy.git` +Navigate to the feasibility-triangle folder of the repository: `cd /opt/feasibility-deploy/feasibility-portal` +Checkout the version (git tag) of the feasibility triangle you would like to install: `git checkout tags/` + +### Step 3 - Set Up ssl certificates + +Running this setup safely at your site, requires a valid certificate and domain. Please contact the responsible body of your institution to recieve both a domain and certificate. +You will require two .pem files: a cert.pem (certificate) and key.pem (private key). + +Once you have the appropriate certificates you should save them under `/opt/feasibility-deploy/feasibility-portal/auth`. +Set the rights for all files of the auth folder to 655 `chmod 655 /opt/feasibility-deploy/feasibility-portal/auth/*`. + +- Not providing the certificate files is not an option. + +### Step 4 - Load the ontology mapping files + +If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. +Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie + +Upload the ontology .zip files to your server, unpack them and copy the ontology files to your feasibility portal ontology folder + +```bash +sudo -s +mkdir ///// +cd ///// +unzip mapping_*.zip +unzip ui_profiles_*.zip +cd mapping +cp * /opt/feasibility-deploy/feasibility-portal/ontology +cd ../ui_profiles +cp * /opt/feasibility-deploy/feasibility-portal/ontology/ui_profiles +``` + +### Step 6 - Configure your feasibility triangle + +If you use the default local feasibility portal setup you will only have to change the following environment variables: + +| file | environment variable | value for local setup | +|--|--|--| +|keycloak/.env|FEASIBILITY_KEYCLOAK_BASE_URL| base-url-of-your-local-feasibility-portal/auth | +|keycloak/.env|FEASIBILITY_KEYCLOAK_ADMIN_PW| choose a secure password here e.g. Ykc2PINWatNqL5Wq,OIxFz1Sv3dzmQ2| +|backend/.env|FEASIBILITY_BACKEND_AKTIN_ENABLED|false| +|backend/.env|FEASIBILITY_BACKEND_DIRECT_ENABLED|true| +|backend/.env|FEASIBILITY_BACKEND_API_BASE_URL|base-url-of-your-local-feasibility-portal/api| +|backend/.env|FLARE_WEBSERVICE_BASE_URL|http://flare:8080| + +For more details on the environment variables see the paragraph **Configurable environment variables** of this README. + +### Step 7 - Start the feasibility portal + +To start the portal navigate to `/opt/feasibility-deploy/feasibility-portal/start-feasibility-portal-local.sh` and +execute `bash start-feasibility-portal-local.sh`. + +This starts the following default local feasibility portal, with the following components: + +|Component|url|description| +|--|--|--| +|GUI|https://my-fesibility-domain|| +|Keycloak|https://my-feasibility-domain/auth|| + + +### Step 8 - Configure keycloak and add a user for the user interface + +Navigate with your browser to https://my-fesibility-domain/auth +and log in to keyloak using the admin password set in step 6 (FEASIBILITY_KEYCLOAK_ADMIN_PW). +User: admin +Pw: my password set in step 6 + +1. Set the your domain for your client: +Click on `Clients > feasibility-gui` and change the fields: Root URL, Base URL and Web Origins +from: https://feasibility.forschen-fuer-gesundheit.de +to: https://your-feasibility-domain + +and **Valid Redirect URIs** +from +from: https://feasibility.forschen-fuer-gesundheit.de +to: https://your-feasibility-domain/* + +2. Add a user for to your feasibility user interface: +Click on `Users > Add User` and fill in the field **Username** with a username of your choice and add the user under **Groups** to the group **/codex-develop**. +Click on **Credentials** and type a password of your choice and confirm it. + +### Step 9 - Access the user interface and send first query + +Access your user interface under and log in with the user set in step 8. + +Click on **New query**, create a query and send it using the **send** button. +After a few moments you should see the results to your query in the **Number of patients** window. + + +## Configurable environment variables + + +|Env Var|Description|Default|Possible values|Component| +|--|--|--|--|--| +|AKTIN_BROKER_LOG_LEVEL|Log level of the Aktin broker|INFO||AKTIN| +|AKTIN_ADMIN_PW|password for the web admin of the AKTIN broker Admin is accessible via: http://localhost:AKTIN_BROKER_HOST_AND_PORT/admin/html/index.html|changeme||AKTIN| +|AKTIN_BROKER_HOST_AND_PORT|Aktin broker Docker port |127.0.0.1:8080||AKTIN| +|FEASIBILITY_BACKEND_DATASOURCE_HOST|backend database host|feasibility-gui-backend-db||BACKEND| +|FEASIBILITY_BACKEND_DATASOURCE_PORT|backend database port|5432||BACKEND| +|FEASIBILITY_BACKEND_DATASOURCE_USERNAME|backend database username|guidbuser||BACKEND| +|FEASIBILITY_BACKEND_DATASOURCE_PASSWORD|backend database password|guidbpw||BACKEND| +|FEASIBILITY_BACKEND_KEYCLOAK_ENABLED|whether or not keycloak is enabled for the backend|true||BACKEND| +|KEYCLOAK_ALLOWED_ROLE|The keycloak role required to access the backend|FEASIBILITY_USER||BACKEND| +|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL|the url the backend uses to access keycloak|http://keycloak:8080||BACKEND| +|FEASIBILITY_BACKEND_KEYCLOAK_REALM|the realm the backend uses within keyloak|codex-develop||BACKEND| +|FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID|the id of the keyloak client for the backend|feasibility-gui||BACKEND| +|FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED|enables CQL translation|true||BACKEND| +|FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED|enables FHIR Search translation. This is only required if a site has their own FLARE component it wishes to use|false||BACKEND| +|FEASIBILITY_BACKEND_API_BASE_URL|the api url of the backend. If using an nginx this url should be the url of the nginx, which forwards to the backend|https://localhost/api/||BACKEND| +|FEASIBILITY_BACKEND_DIRECT_ENABLED|enables the direct broker. This connects the backend directly to flare and is only meant to be used for a local installation|false||BACKEND| +|FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL|the url of the flare component the backend should connect to when using the direct broker|http://flare:8080||BACKEND| +|FEASIBILITY_BACKEND_AKTIN_ENABLED|enables the aktin broker|false||BACKEND| +|FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL|aktin broker base url|http://aktin-broker:8080/broker/||BACKEND| +|FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY|aktin broker admin api key. The backend needs admin access as it requires permission to post new queries to the broker|xxxApiKeyAdmin123||BACKEND| +|FEASIBILITY_BACKEND_DSF_ENABLED|enables the dsf|false||BACKEND| +|FEASIBILITY_BACKEND_DSF_CACERT||/opt/codex-feasibility-security/ca.pem||BACKEND| +|FEASIBILITY_BACKEND_DSF_DSF_SECURITY_KEYSTORE_P12FILE||/opt/codex-feasibility-security/test-user.p12||BACKEND| +|FEASIBILITY_BACKEND_DSF_SECURITY_KEYSTORE_PASSWORD||password||BACKEND| +|FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL||https://dsf-zars-fhir-proxy/fhir||BACKEND| +|FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL||wss://dsf-zars-fhir-proxy:443/fhir/ws||BACKEND| +|FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID||Test_ZARS||BACKEND| +|FEASIBILITY_BACKEND_UI_PROFILES_PATH|path on host where the backend searches for the ui profiles|../ontology/ui_profiles||BACKEND| +|FEASIBILITY_BACKEND_CONCEPT_TREE_PATH|path on host where the backend looks for the code tree file|../ontology/codex-code-tree.json||BACKEND| +|FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH|path on host where the backend looks for the mapping file|../ontology/codex-term-code-mapping.json||BACKEND| +|FEASIBILITY_BACKEND_CERTS_PATH||../dsf-broker/certs||BACKEND| +|FEASIBILITY_KEYCLOAK_DB|keycloak database host|keycloakdb||KEYCLOAK| +|FEASIBILITY_KEYCLOAK_DB_USER|keycloak database username|keycloakdbuser||KEYCLOAK| +|FEASIBILITY_KEYCLOAK_DB_PW|keycloak database password|keycloakdbpw||KEYCLOAK| +|FEASIBILITY_KEYCLOAK_ADMIN_USER|keycloak admin username|admin||KEYCLOAK| +|FEASIBILITY_KEYCLOAK_ADMIN_PW|keycloak admin password|adminpw||KEYCLOAK| +|FEASIBILITY_KEYCLOAK_PROXY_ADDR_FORWARDING|enables proxy forwarding in keyloak, which is required if a proxy like nginx is used|true||KEYCLOAK| +|FEASIBILITY_KEYCLOAK_BASE_URL|the base url used by keyloak. This has to be configured to the nginx url which forwards to keycloak if an nginx is used|https://localhost/auth||KEYCLOAK| \ No newline at end of file diff --git a/feasibility-portal/aktin-broker/.env b/feasibility-portal/aktin-broker/.env index 35d8eba..a4b8b9d 100644 --- a/feasibility-portal/aktin-broker/.env +++ b/feasibility-portal/aktin-broker/.env @@ -1,3 +1,3 @@ AKTIN_BROKER_LOG_LEVEL=INFO AKTIN_ADMIN_PW=changeme -AKTIN_BROKER_HOST_AND_PORT=0.0.0.0:8080 \ No newline at end of file +AKTIN_BROKER_HOST_AND_PORT=127.0.0.1:8080 \ No newline at end of file diff --git a/feasibility-portal/aktin-broker/docker-compose.yml b/feasibility-portal/aktin-broker/docker-compose.yml index b71da74..7c1c563 100644 --- a/feasibility-portal/aktin-broker/docker-compose.yml +++ b/feasibility-portal/aktin-broker/docker-compose.yml @@ -5,7 +5,7 @@ services: environment: LOG_LEVEL: ${AKTIN_BROKER_LOG_LEVEL:-INFO} PASSWORD: ${AKTIN_ADMIN_PW:-changeme} - HOST_AND_PORT: ${AKTIN_BROKER_HOST_AND_PORT:-0.0.0.0:8080} + HOST_AND_PORT: ${AKTIN_BROKER_HOST_AND_PORT:-127.0.0.0:8080} volumes: - ./api-keys.properties:/opt/aktin/api-keys.properties ports: diff --git a/feasibility-portal/backend/.env b/feasibility-portal/backend/.env index 3dca579..cf067b4 100644 --- a/feasibility-portal/backend/.env +++ b/feasibility-portal/backend/.env @@ -3,7 +3,7 @@ FEASIBILITY_BACKEND_DATASOURCE_PORT=5432 FEASIBILITY_BACKEND_DATASOURCE_USERNAME=guidbuser FEASIBILITY_BACKEND_DATASOURCE_PASSWORD=guidbpw FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=false -KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER +FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://keycloak:8080 FEASIBILITY_BACKEND_KEYCLOAK_REALM=codex-develop FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID=feasibility-gui @@ -11,6 +11,7 @@ FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=true FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED=false FEASIBILITY_BACKEND_API_BASE_URL=https://localhost/api/ FEASIBILITY_BACKEND_DIRECT_ENABLED=false +FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL=http://flare:8080 # ---- Aktin FEASIBILITY_BACKEND_AKTIN_ENABLED=true FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL=http://aktin-broker:8080/broker/ diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index e5e7984..3939403 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -14,13 +14,14 @@ services: BROKER_CLIENT_TYPE: ${FEASIBILITY_BACKEND_BROKER_CLIENT_TYPE:-AKTIN} KEYCLOAK_ENABLED: ${FEASIBILITY_BACKEND_KEYCLOAK_ENABLED:-true} KEYCLOAK_ALLOWED_ROLE: ${KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} - KEYCLOAK_BASE_URL: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} + KEYCLOAK_BASE_URL: ${FEASIBILITY_BACKEND_FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} KEYCLOAK_REALM: ${FEASIBILITY_BACKEND_KEYCLOAK_REALM:-codex-develop} KEYCLOAK_CLIENT_ID: ${FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID:-feasibility-gui} CQL_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED:-true} FHIR_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED:-false} API_BASE_URL: ${FEASIBILITY_BACKEND_API_BASE_URL:-https://localhost/api/} BROKER_CLIENT_DIRECT_ENABLED: ${FEASIBILITY_BACKEND_DIRECT_ENABLED:-false} + FLARE_WEBSERVICE_BASE_URL: ${FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL:-http://flare:8080} # ---- Aktin BROKER_CLIENT_AKTIN_ENABLED: ${FEASIBILITY_BACKEND_AKTIN_ENABLED:-false} AKTIN_BROKER_BASE_URL: ${FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL:-http://aktin-broker:8080/broker/} diff --git a/feasibility-portal/start-feasibility-portal-local.sh b/feasibility-portal/start-feasibility-portal-local.sh index a073df0..249c55f 100755 --- a/feasibility-portal/start-feasibility-portal-local.sh +++ b/feasibility-portal/start-feasibility-portal-local.sh @@ -1,11 +1,6 @@ #!/usr/bin/env sh COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} - -export CODEX_FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL=http://node-flare:8080 -export CODEX_FEASIBILITY_BACKEND_DIRECT_ENABLED=true -export CODEX_FEASIBILITY_BACKEND_API_BASE_URL=$FEASIBILITY_BASE_URL/api/ -export FEASIBILITY_KEYCLOAK_BASE_URL=$FEASIBILITY_BASE_URL/auth AKTIN_ENABLED=${AKTIN_ENABLED:-false} diff --git a/feasibility-triangle/flare/.env b/feasibility-triangle/flare/.env index 2f3b73d..d9d1fb7 100644 --- a/feasibility-triangle/flare/.env +++ b/feasibility-triangle/flare/.env @@ -6,4 +6,4 @@ FLARE_FHIR_PAGE_COUNT=500 FLARE_EXEC_CORE_POOL_SIZE=4 FLARE_EXEC_MAX_POOL_SIZE=16 FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS=10 -FLARE_LOG_LEVEL=debug \ No newline at end of file +FLARE_LOG_LEVEL=info \ No newline at end of file From 52060c4dc48642e2ab68054ee720ade13af25494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 25 Apr 2022 13:34:36 +0200 Subject: [PATCH 012/118] update backend .env --- feasibility-portal/backend/.env | 7 ++++--- feasibility-portal/backend/docker-compose.yml | 3 ++- feasibility-portal/gui/deploy-config.json | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/feasibility-portal/backend/.env b/feasibility-portal/backend/.env index cf067b4..06374ef 100644 --- a/feasibility-portal/backend/.env +++ b/feasibility-portal/backend/.env @@ -1,3 +1,4 @@ +FEASIBILITY_BACKEND_LOG_LEVEL=debug FEASIBILITY_BACKEND_DATASOURCE_HOST=feasibility-gui-backend-db FEASIBILITY_BACKEND_DATASOURCE_PORT=5432 FEASIBILITY_BACKEND_DATASOURCE_USERNAME=guidbuser @@ -7,13 +8,13 @@ FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://keycloak:8080 FEASIBILITY_BACKEND_KEYCLOAK_REALM=codex-develop FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID=feasibility-gui -FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=true +FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=false FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED=false FEASIBILITY_BACKEND_API_BASE_URL=https://localhost/api/ -FEASIBILITY_BACKEND_DIRECT_ENABLED=false +FEASIBILITY_BACKEND_DIRECT_ENABLED=true FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL=http://flare:8080 # ---- Aktin -FEASIBILITY_BACKEND_AKTIN_ENABLED=true +FEASIBILITY_BACKEND_AKTIN_ENABLED=false FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL=http://aktin-broker:8080/broker/ FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY=xxxApiKeyAdmin123 # ---- DSF diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 3939403..6e71c87 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,12 +1,13 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:1.0.4 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:1.0.5-rc2 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: - feasibility-gui-backend-db environment: + LOG_LEVEL: ${FEASIBILITY_BACKEND_LOG_LEVEL:-warn} FEASIBILITY_DATABASE_HOST: ${FEASIBILITY_BACKEND_DATASOURCE_HOST:-feasibility-gui-backend-db} FEASIBILITY_DATABASE_PORT: ${FEASIBILITY_BACKEND_DATASOURCE_PORT:-5432} FEASIBILITY_DATABASE_USER: ${FEASIBILITY_BACKEND_DATASOURCE_USERNAME:-guidbuser} diff --git a/feasibility-portal/gui/deploy-config.json b/feasibility-portal/gui/deploy-config.json index d40ae8c..85f8f18 100644 --- a/feasibility-portal/gui/deploy-config.json +++ b/feasibility-portal/gui/deploy-config.json @@ -32,7 +32,8 @@ "options": { "pollingtimeinseconds": 10, "pollingintervallinseconds": 1, - "lowerboundarypatientresult": 0 + "lowerboundarypatientresult": 0, + "lowerboundarylocationresult": 0 }, "mock": { "terminology": false, From 73db7abbbc244f9cd084eddd1f8f6fb1195761b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 25 Apr 2022 13:40:17 +0200 Subject: [PATCH 013/118] remove .env and add .env.default for each component --- .gitignore | 2 +- feasibility-portal/aktin-broker/{.env => .env.default} | 0 feasibility-portal/backend/{.env => .env.default} | 0 feasibility-portal/dsf-broker/{.env => .env.default} | 0 .../gui/{deploy-config.json => deploy-config.default.json} | 0 feasibility-portal/keycloak/{.env => .env.default} | 0 feasibility-triangle/aktin-client/{.env => .env.default} | 0 feasibility-triangle/dsf-client/{.env => .env.default} | 0 .../fhir-server/blaze-server/{.env => .env.default} | 0 feasibility-triangle/flare/{.env => .env.default} | 0 feasibility-triangle/rev-proxy/{.env => .env.default} | 0 11 files changed, 1 insertion(+), 1 deletion(-) rename feasibility-portal/aktin-broker/{.env => .env.default} (100%) rename feasibility-portal/backend/{.env => .env.default} (100%) rename feasibility-portal/dsf-broker/{.env => .env.default} (100%) rename feasibility-portal/gui/{deploy-config.json => deploy-config.default.json} (100%) rename feasibility-portal/keycloak/{.env => .env.default} (100%) rename feasibility-triangle/aktin-client/{.env => .env.default} (100%) rename feasibility-triangle/dsf-client/{.env => .env.default} (100%) rename feasibility-triangle/fhir-server/blaze-server/{.env => .env.default} (100%) rename feasibility-triangle/flare/{.env => .env.default} (100%) rename feasibility-triangle/rev-proxy/{.env => .env.default} (100%) diff --git a/.gitignore b/.gitignore index abd02b3..45b203d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ zars/dsf-broker/bpe/app/last_event/time.file test/testdata num-node/testdata !num-node/testdata/test-patient-all.json -start-zars-and-num-node-all.sh +start-zars-and-num-node-all.sh \ No newline at end of file diff --git a/feasibility-portal/aktin-broker/.env b/feasibility-portal/aktin-broker/.env.default similarity index 100% rename from feasibility-portal/aktin-broker/.env rename to feasibility-portal/aktin-broker/.env.default diff --git a/feasibility-portal/backend/.env b/feasibility-portal/backend/.env.default similarity index 100% rename from feasibility-portal/backend/.env rename to feasibility-portal/backend/.env.default diff --git a/feasibility-portal/dsf-broker/.env b/feasibility-portal/dsf-broker/.env.default similarity index 100% rename from feasibility-portal/dsf-broker/.env rename to feasibility-portal/dsf-broker/.env.default diff --git a/feasibility-portal/gui/deploy-config.json b/feasibility-portal/gui/deploy-config.default.json similarity index 100% rename from feasibility-portal/gui/deploy-config.json rename to feasibility-portal/gui/deploy-config.default.json diff --git a/feasibility-portal/keycloak/.env b/feasibility-portal/keycloak/.env.default similarity index 100% rename from feasibility-portal/keycloak/.env rename to feasibility-portal/keycloak/.env.default diff --git a/feasibility-triangle/aktin-client/.env b/feasibility-triangle/aktin-client/.env.default similarity index 100% rename from feasibility-triangle/aktin-client/.env rename to feasibility-triangle/aktin-client/.env.default diff --git a/feasibility-triangle/dsf-client/.env b/feasibility-triangle/dsf-client/.env.default similarity index 100% rename from feasibility-triangle/dsf-client/.env rename to feasibility-triangle/dsf-client/.env.default diff --git a/feasibility-triangle/fhir-server/blaze-server/.env b/feasibility-triangle/fhir-server/blaze-server/.env.default similarity index 100% rename from feasibility-triangle/fhir-server/blaze-server/.env rename to feasibility-triangle/fhir-server/blaze-server/.env.default diff --git a/feasibility-triangle/flare/.env b/feasibility-triangle/flare/.env.default similarity index 100% rename from feasibility-triangle/flare/.env rename to feasibility-triangle/flare/.env.default diff --git a/feasibility-triangle/rev-proxy/.env b/feasibility-triangle/rev-proxy/.env.default similarity index 100% rename from feasibility-triangle/rev-proxy/.env rename to feasibility-triangle/rev-proxy/.env.default From 4c3d8fe9b4e2fa1fae09fce201d07bc4a7d39a59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 25 Apr 2022 14:54:21 +0200 Subject: [PATCH 014/118] add env file initialisation script --- .gitignore | 4 +++- initialise-env-files.sh | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 initialise-env-files.sh diff --git a/.gitignore b/.gitignore index 45b203d..066bd2f 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ zars/dsf-broker/bpe/app/last_event/time.file test/testdata num-node/testdata !num-node/testdata/test-patient-all.json -start-zars-and-num-node-all.sh \ No newline at end of file +start-zars-and-num-node-all.sh +.env +deploy-config.json \ No newline at end of file diff --git a/initialise-env-files.sh b/initialise-env-files.sh new file mode 100644 index 0000000..32fa1a9 --- /dev/null +++ b/initialise-env-files.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +cp feasibility-portal/gui/deploy-config.default.json feasibility-portal/dsf-broker/deploy-config.json +cp feasibility-portal/backend/.env.default feasibility-portal/backend/.env +cp feasibility-portal/dsf-broker/.env.default feasibility-portal/dsf-broker/.env +cp feasibility-portal/keycloak/.env.default feasibility-portal/keycloak/.env +cp feasibility-portal/aktin-broker/.env.default feasibility-portal/aktin-broker/.env + +cp feasibility-triangle/aktin-client/.env.default feasibility-triangle/aktin-client/.env +cp feasibility-triangle/dsf-client/.env.default feasibility-triangle/dsf-client/.env +cp feasibility-triangle/fhir-server/blaze-server/.env.default feasibility-triangle/fhir-server/blaze-server/.env +cp feasibility-triangle/flare/.env.default feasibility-triangle/flare/.env +cp feasibility-triangle/rev-proxy/.env.default feasibility-triangle/rev-proxy/.env + + From 9e6f5571f7fbd365655803a24d3c77b39433c359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 10:12:34 +0200 Subject: [PATCH 015/118] fix aktin default host and port and initialisation of deploy-config.json of the gui --- feasibility-portal/aktin-broker/docker-compose.yml | 2 +- initialise-env-files.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/feasibility-portal/aktin-broker/docker-compose.yml b/feasibility-portal/aktin-broker/docker-compose.yml index 7c1c563..b71da74 100644 --- a/feasibility-portal/aktin-broker/docker-compose.yml +++ b/feasibility-portal/aktin-broker/docker-compose.yml @@ -5,7 +5,7 @@ services: environment: LOG_LEVEL: ${AKTIN_BROKER_LOG_LEVEL:-INFO} PASSWORD: ${AKTIN_ADMIN_PW:-changeme} - HOST_AND_PORT: ${AKTIN_BROKER_HOST_AND_PORT:-127.0.0.0:8080} + HOST_AND_PORT: ${AKTIN_BROKER_HOST_AND_PORT:-0.0.0.0:8080} volumes: - ./api-keys.properties:/opt/aktin/api-keys.properties ports: diff --git a/initialise-env-files.sh b/initialise-env-files.sh index 32fa1a9..9b627cd 100644 --- a/initialise-env-files.sh +++ b/initialise-env-files.sh @@ -1,6 +1,6 @@ #!/bin/sh -cp feasibility-portal/gui/deploy-config.default.json feasibility-portal/dsf-broker/deploy-config.json +cp feasibility-portal/gui/deploy-config.default.json feasibility-portal/gui/deploy-config.json cp feasibility-portal/backend/.env.default feasibility-portal/backend/.env cp feasibility-portal/dsf-broker/.env.default feasibility-portal/dsf-broker/.env cp feasibility-portal/keycloak/.env.default feasibility-portal/keycloak/.env From e316b82b9bde40fd3a6f4e0ebd181b530b254872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 10:50:08 +0200 Subject: [PATCH 016/118] update .env file initialisation scripts and add info about .env to both readme files --- feasibility-portal/README.md | 12 +++++++--- feasibility-portal/aktin-broker/.env.default | 3 +-- ...efault.json => deploy-config.json.default} | 0 .../initialise-portal-env-files.sh | 13 +++++++++++ feasibility-triangle/README.md | 22 ++++++++++++------- .../initialise-triangle-env-files.sh | 13 +++++++++++ initialise-env-files.sh | 15 ------------- 7 files changed, 50 insertions(+), 28 deletions(-) rename feasibility-portal/gui/{deploy-config.default.json => deploy-config.json.default} (100%) create mode 100644 feasibility-portal/initialise-portal-env-files.sh create mode 100644 feasibility-triangle/initialise-triangle-env-files.sh delete mode 100644 initialise-env-files.sh diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index defad5f..2369f5c 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -19,7 +19,13 @@ Navigate to the directory and clone this repository: `git clone https://github.c Navigate to the feasibility-triangle folder of the repository: `cd /opt/feasibility-deploy/feasibility-portal` Checkout the version (git tag) of the feasibility triangle you would like to install: `git checkout tags/` -### Step 3 - Set Up ssl certificates +### Step 3 - Initialise .env files + +The feasibility portal requires .env files for the docker-compose setup. If you are setting up the project new and have not done so yet execute the `initialise-portal-env-files.sh`. + +If you have set up the portal before compare the .env to the .env.default env files of each component and copy the additional params as appropriate + +### Step 4 - Set Up ssl certificates Running this setup safely at your site, requires a valid certificate and domain. Please contact the responsible body of your institution to recieve both a domain and certificate. You will require two .pem files: a cert.pem (certificate) and key.pem (private key). @@ -29,7 +35,7 @@ Set the rights for all files of the auth folder to 655 `chmod 655 /opt/feasibili - Not providing the certificate files is not an option. -### Step 4 - Load the ontology mapping files +### Step 5 - Load the ontology mapping files If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie @@ -48,7 +54,7 @@ cd ../ui_profiles cp * /opt/feasibility-deploy/feasibility-portal/ontology/ui_profiles ``` -### Step 6 - Configure your feasibility triangle +### Step 6 - Configure your feasibility portal If you use the default local feasibility portal setup you will only have to change the following environment variables: diff --git a/feasibility-portal/aktin-broker/.env.default b/feasibility-portal/aktin-broker/.env.default index a4b8b9d..867e9ac 100644 --- a/feasibility-portal/aktin-broker/.env.default +++ b/feasibility-portal/aktin-broker/.env.default @@ -1,3 +1,2 @@ AKTIN_BROKER_LOG_LEVEL=INFO -AKTIN_ADMIN_PW=changeme -AKTIN_BROKER_HOST_AND_PORT=127.0.0.1:8080 \ No newline at end of file +AKTIN_ADMIN_PW=changeme \ No newline at end of file diff --git a/feasibility-portal/gui/deploy-config.default.json b/feasibility-portal/gui/deploy-config.json.default similarity index 100% rename from feasibility-portal/gui/deploy-config.default.json rename to feasibility-portal/gui/deploy-config.json.default diff --git a/feasibility-portal/initialise-portal-env-files.sh b/feasibility-portal/initialise-portal-env-files.sh new file mode 100644 index 0000000..7ea720b --- /dev/null +++ b/feasibility-portal/initialise-portal-env-files.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +envfiles=( "gui/deploy-config.json" "backend/.env" "dsf-broker/.env" "keycloak/.env" "aktin-broker/.env") + +for file in "${envfiles[@]}" +do + if [[ -f "$file" ]]; then + printf ".env file $file already exists - not copying default env \n" + printf "Please check if your current env file $file is missing any params from the $file.default file and copy them as appropriate\n" + else + cp "$file.default" $file + fi +done diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 437642a..b495d61 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -41,12 +41,18 @@ Navigate to the directory and clone this repository: `git clone https://github.c Navigate to the feasibility-triangle folder of the repository: `cd /opt/feasibility-deploy/feasibility-triangle` Checkout the version (git tag) of the feasibility triangle you would like to install: `git checkout tags/` -### Step 3 - Set Up basic auth +### Step 3 - Initialise .env files + +The feasibility portal requires .env files for the docker-compose setup. If you are setting up the project new and have not done so yet execute the `initialise-triangle-env-files.sh`. + +If you have set up the portal before compare the .env to the .env.default env files of each component and copy the additional params as appropriate + +### Step 4 - Set Up basic auth To set up basic auth you can execute the `setup-base-auth.sh ` to add a simple .htpasswd to protect your FHIR Server and FLARE component with basic authentication. This creates a .htpasswd file in the `auth` directory, which will be mounted to the nginx, which is part of this deployment repository. -### Step 4 - Set Up ssl certificates +### Step 5 - Set Up ssl certificates Running this setup safely at your site, requires a valid certificate and domain. Please contact the responsible body of your institution to recieve both a domain and certificate. You will require two .pem files: a cert.pem (certificate) and key.pem (private key). @@ -58,7 +64,7 @@ Set the rights for all files of the auth folder to 655 `chmod 655 /opt/feasibili - The rest of the feasibility triangle will still work, as it does create a connection to the outside without the need to make itself accessible. - However, if you would for example load data into the FHIR server from an ETL job on another VM you will need to expose the FHIR server via a reverse proxy, which will require the certificates above. -### Step 5 - Load the ontology mapping files +### Step 6 - Load the ontology mapping files If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie @@ -74,7 +80,7 @@ cd mapping cp * /opt/feasibility-deploy/feasibility-triangle/ontology ``` -### Step 6 - Configure your feasibility triangle +### Step 7 - Configure your feasibility triangle If you use the default triangle setup you only have to configure the AKTIN client to connect to the central feasibility portal as the rest of the setup will already be correctly configured for you. @@ -84,7 +90,7 @@ To configure the AKTIN client in the default setup, change the following environ - FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM - FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS -### Step 7 - Start the feasibility triangle +### Step 8 - Start the feasibility triangle To start the triangle navigate to `/opt/feasibility-deploy/feasibility-triangle` and execute `bash start-triangle.sh`. @@ -102,7 +108,7 @@ navigating to the respective components folder and executing: `docker-compose -p $FEASIBILITY_COMPOSE_PROJECT up -d` -### Step 8 - Access the Triangle +### Step 9 - Access the Triangle In the default coniguration and given that you have set up a ssl certifcate in step 4 the setup will expose the following services: @@ -124,7 +130,7 @@ Please be aware, that if you would like to access the services on localhost with For example for the FHIR Server: ssh -L 8081:127.0.0.1:8081 your-username@your-server-ip -### Step 9 - Init Testdata (Optional) +### Step 10 - Init Testdata (Optional) TODO - add description of testdata initialisation here. @@ -166,4 +172,4 @@ TODO - add description of testdata initialisation here. |FLARE_EXEC_MAX_POOL_SIZE|The max thread pool size|16|Integer|FLARE| |FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS|The time threads are kept alive|10|Integer|FLARE| |FLARE_LOG_LEVEL|log level of flare|debug|off, fatal, error, warn, info, debug, trace|FLARE| -|FEASIBILITY_TRIANGLE_REV_PROXY_PORT|The exposed docker port of the reverse proxy - set to 443 if you want to use standard https and you only have the feasibility triangle installed on your server|444|Integer (valid port)|REV Proxy| \ No newline at end of file +|FEASIBILITY_TRIANGLE_REV_PROXY_PORT|The exposed docker port of the reverse proxy - set to 443 if you want to use standard https and you only have the feasibility triangle installed on your server|444|Integer (valid port)|REV Proxy| diff --git a/feasibility-triangle/initialise-triangle-env-files.sh b/feasibility-triangle/initialise-triangle-env-files.sh new file mode 100644 index 0000000..352206a --- /dev/null +++ b/feasibility-triangle/initialise-triangle-env-files.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +envfiles=( "aktin-client/.env" "dsf-client/.env" "fhir-server/blaze-server/.env" "flare/.env" "rev-proxy/.env") + +for file in "${envfiles[@]}" +do + if [[ -f "$file" ]]; then + printf ".env file $file already exists - not copying default env \n" + printf "Please check if your current env file $file is missing any params from the $file.default file and copy them as appropriate\n" + else + cp "$file.default" $file + fi +done diff --git a/initialise-env-files.sh b/initialise-env-files.sh deleted file mode 100644 index 9b627cd..0000000 --- a/initialise-env-files.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -cp feasibility-portal/gui/deploy-config.default.json feasibility-portal/gui/deploy-config.json -cp feasibility-portal/backend/.env.default feasibility-portal/backend/.env -cp feasibility-portal/dsf-broker/.env.default feasibility-portal/dsf-broker/.env -cp feasibility-portal/keycloak/.env.default feasibility-portal/keycloak/.env -cp feasibility-portal/aktin-broker/.env.default feasibility-portal/aktin-broker/.env - -cp feasibility-triangle/aktin-client/.env.default feasibility-triangle/aktin-client/.env -cp feasibility-triangle/dsf-client/.env.default feasibility-triangle/dsf-client/.env -cp feasibility-triangle/fhir-server/blaze-server/.env.default feasibility-triangle/fhir-server/blaze-server/.env -cp feasibility-triangle/flare/.env.default feasibility-triangle/flare/.env -cp feasibility-triangle/rev-proxy/.env.default feasibility-triangle/rev-proxy/.env - - From 762ba62f5dc4d4abd673b46fdadf4e9d3055c2f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 15:07:53 +0200 Subject: [PATCH 017/118] update backend and gui and add allowed origins env to readme --- feasibility-portal/backend/.env.default | 1 + feasibility-portal/backend/docker-compose.yml | 3 ++- feasibility-portal/gui/docker-compose.yml | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index 06374ef..7e6b778 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -13,6 +13,7 @@ FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED=false FEASIBILITY_BACKEND_API_BASE_URL=https://localhost/api/ FEASIBILITY_BACKEND_DIRECT_ENABLED=true FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL=http://flare:8080 +FEASIBILITY_BACKEND_ALLOWED_ORIGINS=https://localhost # ---- Aktin FEASIBILITY_BACKEND_AKTIN_ENABLED=false FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL=http://aktin-broker:8080/broker/ diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 6e71c87..71aec36 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:1.0.5-rc2 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:1.0.5-rc4 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -23,6 +23,7 @@ services: API_BASE_URL: ${FEASIBILITY_BACKEND_API_BASE_URL:-https://localhost/api/} BROKER_CLIENT_DIRECT_ENABLED: ${FEASIBILITY_BACKEND_DIRECT_ENABLED:-false} FLARE_WEBSERVICE_BASE_URL: ${FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL:-http://flare:8080} + ALLOWED_ORIGINS: ${FEASIBILITY_BACKEND_ALLOWED_ORIGINS:-https://localhost} # ---- Aktin BROKER_CLIENT_AKTIN_ENABLED: ${FEASIBILITY_BACKEND_AKTIN_ENABLED:-false} AKTIN_BROKER_BASE_URL: ${FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL:-http://aktin-broker:8080/broker/} diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 038b7e5..67de75f 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.2.0_RC10 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.2.0_RC11 ports: - "443:8443" restart: unless-stopped From d32589f8d021b57facc75a37d4bc82a353605726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 15:31:47 +0200 Subject: [PATCH 018/118] remove develop auth files --- feasibility-triangle/auth/.htpasswd | 2 -- feasibility-triangle/auth/cert.pem | 29 ---------------- feasibility-triangle/auth/key.pem | 52 ----------------------------- 3 files changed, 83 deletions(-) delete mode 100644 feasibility-triangle/auth/.htpasswd delete mode 100644 feasibility-triangle/auth/cert.pem delete mode 100644 feasibility-triangle/auth/key.pem diff --git a/feasibility-triangle/auth/.htpasswd b/feasibility-triangle/auth/.htpasswd deleted file mode 100644 index 1892a9f..0000000 --- a/feasibility-triangle/auth/.htpasswd +++ /dev/null @@ -1,2 +0,0 @@ -test:$apr1$ZEdOKNC0$NrUNcaOicIaBp7RMH8QK50 - diff --git a/feasibility-triangle/auth/cert.pem b/feasibility-triangle/auth/cert.pem deleted file mode 100644 index 6de0775..0000000 --- a/feasibility-triangle/auth/cert.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFCzCCAvOgAwIBAgIUDLNue2iDe6A2flVGsUdUVAHyEYowDQYJKoZIhvcNAQEL -BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTIxMTIwOTE1NTkyMFoYDzIyOTUw -OTIzMTU1OTIwWjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDxxvb0q5qaOJdNc5AvZaEY0KWEtLzSwVRzSKkpbFPT -JnV67IT27XJqHdIbBG+T89TuAzXQqveQtHBQoDAVWuFk8n21vQpfaV0blM5p7wik -NywS/E1DGVvSCv6NVTHJCDQiKYuWv7g7bIM9S28ywNPuepCY22Xk4LtD0eXwyf00 -2iu8hoBMIHnZmQ0MUr8dCMwWLJ06/6iCZdWBJxCUQooVJ1wwDueN4XKSqxkZjWeZ -u7ucrpaAv8EmceqlEYzuAV2USZ70YkTQQkNezRz8Y4z0qzAfhNb1L1V6CmTf4/al -eua93aj2/vKN4sZpUmnYNTleTKRphmNlAZJKduM1at2l19NY6Cnfo8LG0SD0huLe -Lh8gbzhjE0fxkRaaYEQnjbfnTOVmbShr5k83uZdWmK3d5BlP4yeuO4d1ToHkdaBf -vbdDC8vvyASKt95A5TlQIc1U4Apxd7k6Jq1MOs050Ttkh6nhoCEah4e4N+Va2Dbf -FeHQsqj8yJ1n0/o0nmAfQXkEv/cZejIMcsr8A4mjme6gb+VOgGdUy/XrW/1gMrx6 -JlOvSq4AJnC8r5K4BkHSpM8Eu1YMgAj8yoxYBjnMmddNqcqb9zJUq771NSvpCtmQ -MoLsGLWKqynRfxKyYa8WKCmhByYGvnJOIsL6wpamLpPXyFLU9tsbn+SZonsppxNV -kQIDAQABo1MwUTAdBgNVHQ4EFgQUFtb7LDGg6gXd6Ugj93E6TlHX2zQwHwYDVR0j -BBgwFoAUFtb7LDGg6gXd6Ugj93E6TlHX2zQwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQsFAAOCAgEAFaSJpyAn/wSG6MJChpuykArnHQOzWB3QLpHesJ+Gv6FE -3Vwwy2UuaB7QEywA9Dwrysci2GRByzfOMDMjop2BfqUnOtsIOFHpAQGdUcge6nLA -3NtUFJ7etnO3xjrVBWHVZmvxur1zqrxHl5r4QVtAj07WU9BX5EEvv1JKuZmOn0ak -AQJ2skANXLZSZoAND5S/tUsoMrkMW4t0+/VEFVNu/FMa0IYHsWDpOLl+R6pSlXXr -T0Kb6NoHKbiRfhHtIK+tIU4h6FmpX0f0MsOKB+cM/5KAWTL2pMykpugr52Sc8UwW -qHgZRYok6XaEDU15Tky7zBcFELB2UOx6m+dp1zlhEeFP3vMbGvMepaRifO9y1IZ6 -KDrxwlRJUT+umRk07W91Cfsnqmox19rKZfsTM3Ornj7rqT8vzprtw9TV8IYeaaCo -9qizkr9cnmaEeKyRnG4lnqRfsHUQvpK/kI8Amzx48FVigagn40T+UsEWIfUwnev5 -0SSrV/rgTNNwTuyXlsHRVo1woVm7lrlyauHuzS4o1wzGESyI3u0JVA6s+J/v/mRh -TVU9QQiyfDqvb7yeqJ3xPlxZKtRDvAg0NURYTmf+bGW5zAMbbRmQcFWK1weYWfkR -ubwE05TcHnJ1zqSIAUaryOdIYubfzWVi8Re6IruyXGt/+5toIh9y9aLsSb07y1U= ------END CERTIFICATE----- diff --git a/feasibility-triangle/auth/key.pem b/feasibility-triangle/auth/key.pem deleted file mode 100644 index 09ed8ff..0000000 --- a/feasibility-triangle/auth/key.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -VD+9p7QIomqOkG7ply3JcpP8zPuoYQ== ------END PRIVATE KEY----- From e37be7934ba8c8773ccbe75d71c75378b18e50de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 15:34:05 +0200 Subject: [PATCH 019/118] add auth files to .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 066bd2f..5b92ec1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,6 @@ num-node/testdata !num-node/testdata/test-patient-all.json start-zars-and-num-node-all.sh .env -deploy-config.json \ No newline at end of file +deploy-config.json +*.pem +.htpasswd \ No newline at end of file From a4264bf54582be45b01ec3474976c76ae785d114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 17:38:57 +0200 Subject: [PATCH 020/118] add testdata download script --- feasibility-triangle/get-mii-testdata.sh | 12 + .../testdata/test-patient-all.json | 11164 ---------------- .../{init-testdata.sh => upload-testdata.sh} | 0 3 files changed, 12 insertions(+), 11164 deletions(-) create mode 100755 feasibility-triangle/get-mii-testdata.sh delete mode 100644 feasibility-triangle/testdata/test-patient-all.json rename feasibility-triangle/{init-testdata.sh => upload-testdata.sh} (100%) diff --git a/feasibility-triangle/get-mii-testdata.sh b/feasibility-triangle/get-mii-testdata.sh new file mode 100755 index 0000000..d92c265 --- /dev/null +++ b/feasibility-triangle/get-mii-testdata.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env sh + +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +MII_TESTDATA_BASE_URL=https://github.com/medizininformatik-initiative/kerndatensatz-testdaten/raw/master/Test_Data/Polar +MII_TESTDATA_FILES=(POLAR_Testdaten_Original_UKB-UKB-0001-UKB-0015.json.zip POLAR_Testdaten_Original_UKE-UKE-0001-UKE-0020.json.zip POLAR_Testdaten_Original_UKFAU-UKFAU-0001-UKFAU-0011.json.zip POLAR_Testdaten_Original_UKFR-UKFR-0001-UKFR-0010.json.zip POLAR_Testdaten_Original_UKSH-UKSH-0001-UKSH-0005.json.zip) + +for file in "${MII_TESTDATA_FILES[@]}" +do + wget "$MII_TESTDATA_BASE_URL/$file" + unzip -o $file -d testdata + rm $file +done \ No newline at end of file diff --git a/feasibility-triangle/testdata/test-patient-all.json b/feasibility-triangle/testdata/test-patient-all.json deleted file mode 100644 index e1d1722..0000000 --- a/feasibility-triangle/testdata/test-patient-all.json +++ /dev/null @@ -1,11164 +0,0 @@ -{ - "resourceType": "Bundle", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/gecco-bundle" ] - }, - "type": "transaction", - "entry": [ { - "fullUrl": "Patient/5f58baa651c0c48667912fc2b6580b4b", - "resource": { - "resourceType": "Patient", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/Patient" ] - }, - "extension": [ { - "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/age", - "extension": [ { - "url": "dateTimeOfDocumentation", - "_valueDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, { - "url": "age", - "valueAge": { - "value": 46.6, - "unit": "years", - "system": "http://unitsofmeasure.org", - "code": "a" - } - } ] - }, { - "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/ethnic-group", - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "14045001" - } - } ], - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "MR" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/patientId", - "value": "1", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "birthDate": "1973-08-10" - }, - "request": { - "method": "POST", - "url": "Patient", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/patientId|5f58baa651c0c48667912fc2b6580b4b" - } - }, { - "fullUrl": "Organization/7bf3ad593927360881a2fe7425317511", - "resource": { - "resourceType": "Organization", - "name": "Mein Krankenhaus" - }, - "request": { - "method": "POST", - "url": "Organization", - "ifNoneExist": "identifier=null|7bf3ad593927360881a2fe7425317511" - } - }, { - "fullUrl": "Encounter/68b157940b50eb031e94379dbbc96f0c", - "resource": { - "resourceType": "Encounter", - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/encounterId", - "value": "1-Event.1_fall_arm_1.1", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "unknown", - "class": { - "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", - "code": "IMP", - "display": "inpatient encounter" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - } - }, - "request": { - "method": "POST", - "url": "Encounter", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/encounterId|68b157940b50eb031e94379dbbc96f0c" - } - }, { - "fullUrl": "Condition/deb7dca65db909690eb02d1413d400bf", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diagnosis-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.krankheitsbeginn_aufnahme.1-krankheitsbeginn_aufnahme.erkrankungsphase_zum_zeitpunkt_der_diagnose_code.1-erkrankungsphase_zum_zeitpunkt_der_diagnose_code" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394807007", - "display": "Infectious diseases (specialty) (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "840539006", - "display": "Disease caused by Severe acute respiratory syndrome coronavirus 2 (disorder)" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "stage": [ { - "summary": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "399166001" - } ] - }, - "type": { - "coding": [ { - "system": "http://loinc.org", - "code": "88859-4" - } ] - } - } ] - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|deb7dca65db909690eb02d1413d400bf" - } - }, { - "fullUrl": "Condition/f4130055ca4942cd9ce4229f84b4c11a", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_asthma" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "418112009", - "display": "Pulmonary medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "J45.9" - }, { - "system": "http://snomed.info/sct", - "code": "195967001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f4130055ca4942cd9ce4229f84b4c11a" - } - }, { - "fullUrl": "Condition/1a56be7c1f8e03b1a7800c4364765b08", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_copd" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "418112009", - "display": "Pulmonary medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "J44.9" - }, { - "system": "http://snomed.info/sct", - "code": "13645005" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|1a56be7c1f8e03b1a7800c4364765b08" - } - }, { - "fullUrl": "Condition/2fbdd14ef1f0aa5a609fd70be38a3f3b", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_lungenfibrose" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "418112009", - "display": "Pulmonary medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "J84.1" - }, { - "system": "http://snomed.info/sct", - "code": "51615001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|2fbdd14ef1f0aa5a609fd70be38a3f3b" - } - }, { - "fullUrl": "Condition/1950c94e634111ef7ca237fe7a2f4986", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_lungenhochdruck_pulmonale_hypertonie" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "418112009", - "display": "Pulmonary medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I27.0" - }, { - "system": "http://snomed.info/sct", - "code": "70995007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|1950c94e634111ef7ca237fe7a2f4986" - } - }, { - "fullUrl": "Condition/6d51c78162822dac4a9ebfa14a5778f0", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] - }, - "modifierExtension": [ { - "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "261665006", - "display": "Unknown (qualifier value)" - } ], - "text": "Presence unknown." - } - } ], - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_ohs" - } ], - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "418112009", - "display": "Pulmonary medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "E66.29" - }, { - "system": "http://snomed.info/sct", - "code": "190966007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6d51c78162822dac4a9ebfa14a5778f0" - } - }, { - "fullUrl": "Condition/a1b32a8922bcb6633309d167e09b4f22", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_schlafapnoe" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "418112009", - "display": "Pulmonary medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "G47.3" - }, { - "system": "http://snomed.info/sct", - "code": "73430006" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|a1b32a8922bcb6633309d167e09b4f22" - } - }, { - "fullUrl": "Condition/8fa18ddc349b0348065db2219cd46578", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] - }, - "modifierExtension": [ { - "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "261665006", - "display": "Unknown (qualifier value)" - } ], - "text": "Presence unknown." - } - } ], - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_osas" - } ], - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "418112009", - "display": "Pulmonary medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "G47.31" - }, { - "system": "http://snomed.info/sct", - "code": "78275009" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|8fa18ddc349b0348065db2219cd46578" - } - }, { - "fullUrl": "Condition/e3e4d12e4a27d4b2b215c1536f78f0a0", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_cystische_fibrose" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "418112009", - "display": "Pulmonary medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "E84.9" - }, { - "system": "http://snomed.info/sct", - "code": "190905008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e3e4d12e4a27d4b2b215c1536f78f0a0" - } - }, { - "fullUrl": "Condition/89f08d1b12c26204e79987284d39210d", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_andere" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "418112009", - "display": "Pulmonary medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "106048009" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|89f08d1b12c26204e79987284d39210d" - } - }, { - "fullUrl": "Condition/bb2318953d8be6ca2007db9b6ae383c4", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_bluthochdruck" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "722414000", - "display": "Vascular medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I10.90" - }, { - "system": "http://snomed.info/sct", - "code": "38341003" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|bb2318953d8be6ca2007db9b6ae383c4" - } - }, { - "fullUrl": "Condition/8a12fba34dbd608c4c85b11c2a39b830", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_zustand_nach_herzinfarkt" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "722414000", - "display": "Vascular medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I25.29" - }, { - "system": "http://snomed.info/sct", - "code": "417662000:246090004=22298006" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|8a12fba34dbd608c4c85b11c2a39b830" - } - }, { - "fullUrl": "Condition/f4f18d096bbcb8e93773651cf4e37f43", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_herzrhythmusstoerungen" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "722414000", - "display": "Vascular medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I49.9" - }, { - "system": "http://snomed.info/sct", - "code": "698247007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f4f18d096bbcb8e93773651cf4e37f43" - } - }, { - "fullUrl": "Condition/f62d84e5c05a7d3ae75b8059440e0e5c", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_herzinsuffizienz" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "722414000", - "display": "Vascular medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I50.9" - }, { - "system": "http://snomed.info/sct", - "code": "84114007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f62d84e5c05a7d3ae75b8059440e0e5c" - } - }, { - "fullUrl": "Condition/2d1c27ebedaee8aa876a74facb7c3d8b", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_pavk" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "722414000", - "display": "Vascular medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I73.9" - }, { - "system": "http://snomed.info/sct", - "code": "399957001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|2d1c27ebedaee8aa876a74facb7c3d8b" - } - }, { - "fullUrl": "Condition/6461fc511fff2f8efb8d4a628dd6bc0a", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_zustand_nach_revaskularisation" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "722414000", - "display": "Vascular medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z95.5" - }, { - "system": "http://snomed.info/sct", - "code": "416940007:363589002=81266008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6461fc511fff2f8efb8d4a628dd6bc0a" - } - }, { - "fullUrl": "Condition/870a6d7248051c1040f4e42214a1ea0b", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_koronare_herzerkrankung_khk" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "722414000", - "display": "Vascular medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I25.1" - }, { - "system": "http://snomed.info/sct", - "code": "53741008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|870a6d7248051c1040f4e42214a1ea0b" - } - }, { - "fullUrl": "Condition/3963183f27403402d908961f58e39b48", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_carotisstenose" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "722414000", - "display": "Vascular medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I65.2" - }, { - "system": "http://snomed.info/sct", - "code": "64586002" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|3963183f27403402d908961f58e39b48" - } - }, { - "fullUrl": "Condition/aa3c0a763ab6517f629c6aaf23645f40", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_andere" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "722414000", - "display": "Vascular medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I51.6" - }, { - "system": "http://snomed.info/sct", - "code": "49601007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|aa3c0a763ab6517f629c6aaf23645f40" - } - }, { - "fullUrl": "Condition/0a2b13349475275bd4b640d95006d721", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_fettleber" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "408472002", - "display": "Hepatology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "K76.0" - }, { - "system": "http://snomed.info/sct", - "code": "197321007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|0a2b13349475275bd4b640d95006d721" - } - }, { - "fullUrl": "Condition/7e21f1bdac07d687fa9c234c66c0cfad", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_leberzirrhose" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "408472002", - "display": "Hepatology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "K74.6" - }, { - "system": "http://snomed.info/sct", - "code": "19943007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|7e21f1bdac07d687fa9c234c66c0cfad" - } - }, { - "fullUrl": "Condition/fdc6bf4f4f9d096e3c808dc7e2c26353", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_chronische_infektioese_hepatitis" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "408472002", - "display": "Hepatology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "B18.9" - }, { - "system": "http://snomed.info/sct", - "code": "10295004" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|fdc6bf4f4f9d096e3c808dc7e2c26353" - } - }, { - "fullUrl": "Condition/639b3e9d33cf4ce8aca8685209d12319", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_autoimmune_lebererkrankungen" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "408472002", - "display": "Hepatology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "235890007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|639b3e9d33cf4ce8aca8685209d12319" - } - }, { - "fullUrl": "Condition/3b6856251b6dae21abc6f647da730650", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_andere" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "408472002", - "display": "Hepatology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "K76.9" - }, { - "system": "http://snomed.info/sct", - "code": "328383001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|3b6856251b6dae21abc6f647da730650" - } - }, { - "fullUrl": "Condition/8a84f52755986a54a8110899a2d3998f", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394810000", - "display": "Rheumatology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "408480009", - "display": "Clinical immunology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "K52.9" - }, { - "system": "http://snomed.info/sct", - "code": "24526004" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|8a84f52755986a54a8110899a2d3998f" - } - }, { - "fullUrl": "Condition/f2e41dbf1def130cce1eb35bc31d091f", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_rheumatoide_arthritis" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394810000", - "display": "Rheumatology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "408480009", - "display": "Clinical immunology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "M06.99" - }, { - "system": "http://snomed.info/sct", - "code": "69896004" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f2e41dbf1def130cce1eb35bc31d091f" - } - }, { - "fullUrl": "Condition/722d6a8637a9edd7221a9454ee8403b0", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] - }, - "modifierExtension": [ { - "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "261665006", - "display": "Unknown (qualifier value)" - } ], - "text": "Presence unknown." - } - } ], - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_kollagenosen" - } ], - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394810000", - "display": "Rheumatology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "408480009", - "display": "Clinical immunology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "M35.9" - }, { - "system": "http://snomed.info/sct", - "code": "105969002" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|722d6a8637a9edd7221a9454ee8403b0" - } - }, { - "fullUrl": "Condition/c041e38061c353b9a995c3b9dd896ac4", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_vaskulitiden" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394810000", - "display": "Rheumatology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "408480009", - "display": "Clinical immunology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I77.6" - }, { - "system": "http://snomed.info/sct", - "code": "31996006" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|c041e38061c353b9a995c3b9dd896ac4" - } - }, { - "fullUrl": "Condition/6d9fc87d75df3c9ae0f003f2b086ed49", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_angeborene_immundefekte" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394810000", - "display": "Rheumatology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "408480009", - "display": "Clinical immunology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "D84.8" - }, { - "system": "http://snomed.info/sct", - "code": "36138009" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6d9fc87d75df3c9ae0f003f2b086ed49" - } - }, { - "fullUrl": "Condition/b0be96feb0d61c1f1584bb92859cc779", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_andere" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394810000", - "display": "Rheumatology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "408480009", - "display": "Clinical immunology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "D84.8" - }, { - "system": "http://snomed.info/sct", - "code": "396332003+414029004" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|b0be96feb0d61c1f1584bb92859cc779" - } - }, { - "fullUrl": "Condition/f213422e96bf2cb85dc5293f4cbc871d", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/human-immunodeficiency-virus-infection" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.bestehende_hivinfektion_code.1-bestehende_hivinfektion_code" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394807007", - "display": "Infectious diseases (specialty) (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "B24" - }, { - "system": "http://snomed.info/sct", - "code": "86406008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f213422e96bf2cb85dc5293f4cbc871d" - } - }, { - "fullUrl": "Condition/42183beb8e3e26c47b25209bd294f99f", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_herz" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.1" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "302509004" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|42183beb8e3e26c47b25209bd294f99f" - } - }, { - "fullUrl": "Condition/e16c715192b7b86478eb66f900ed8749", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_lunge" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.2" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "181216001" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e16c715192b7b86478eb66f900ed8749" - } - }, { - "fullUrl": "Condition/7dba243d9fd73d84f3e191a263a1c925", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_leber" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.4" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "181268008" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|7dba243d9fd73d84f3e191a263a1c925" - } - }, { - "fullUrl": "Condition/6e2598c957b36cc8247105214eac1a54", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_nieren" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.0" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "181414000" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6e2598c957b36cc8247105214eac1a54" - } - }, { - "fullUrl": "Condition/59376a4ccec5d0d20c4929c592fad6d5", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_darm" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.88" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "113276009" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|59376a4ccec5d0d20c4929c592fad6d5" - } - }, { - "fullUrl": "Condition/f964ab7a3022805779bbd8818c915fb4", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_haut" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.5" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "119181002" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f964ab7a3022805779bbd8818c915fb4" - } - }, { - "fullUrl": "Condition/60afecc625504a49682a40503d732637", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_hornhaut" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.7" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "181162001" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|60afecc625504a49682a40503d732637" - } - }, { - "fullUrl": "Condition/68f7e0534e3d3237169bd2847f1edeb9", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "modifierExtension": [ { - "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "261665006", - "display": "Unknown (qualifier value)" - } ], - "text": "Presence unknown." - } - } ], - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_gehoerknoechelchen" - } ], - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.9" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "41845008" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|68f7e0534e3d3237169bd2847f1edeb9" - } - }, { - "fullUrl": "Condition/be26017baf4e19d30c315abe18c00f10", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_herzklappen" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z95.88" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "181285005" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|be26017baf4e19d30c315abe18c00f10" - } - }, { - "fullUrl": "Condition/0e67db598207ad825740c6ee9c438378", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_blutgefaess" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z95.5" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "119206002" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|0e67db598207ad825740c6ee9c438378" - } - }, { - "fullUrl": "Condition/d76af43fffb02f2ca6375f381b6589f6", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_hirnhaut" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.9" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "8935007" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|d76af43fffb02f2ca6375f381b6589f6" - } - }, { - "fullUrl": "Condition/5001fd7746742a3e810486fc64170dde", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_knochengewebe" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.6" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "3138006" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|5001fd7746742a3e810486fc64170dde" - } - }, { - "fullUrl": "Condition/271eec26e070cd8bc9041a18dc3aa8e5", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_knorpelgewebe" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.9" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "309312004" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|271eec26e070cd8bc9041a18dc3aa8e5" - } - }, { - "fullUrl": "Condition/b9c3e22ba4030d78e112a6a4c7c5b57b", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_sehne" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "788415003", - "display": "Transplant medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z94.9" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "13024002" - } ] - } ], - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|b9c3e22ba4030d78e112a6a4c7c5b57b" - } - }, { - "fullUrl": "Condition/58147e642065fcdb25c59f04715134ce", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diabetes-mellitus" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.diabetes_code.1-diabetes_code" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "408475000", - "display": "Diabetic medicine (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "237599002" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|58147e642065fcdb25c59f04715134ce" - } - }, { - "fullUrl": "Condition/a0cfad1a5f9738526c534f55c28f6ca0", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/malignant-neoplastic-disease" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.aktive_tumorkrebserkrankungen_code.1-aktive_tumorkrebserkrankungen_code" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394593009", - "display": "Medical oncology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "C80.9" - }, { - "system": "http://snomed.info/sct", - "code": "363346000" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|a0cfad1a5f9738526c534f55c28f6ca0" - } - }, { - "fullUrl": "Condition/e50f5d3a6205bcbab24fcc1c8be7b603", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "G20" - }, { - "system": "http://snomed.info/sct", - "code": "49049000" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e50f5d3a6205bcbab24fcc1c8be7b603" - } - }, { - "fullUrl": "Condition/2232c9bf87bcaea3662d0cdf99e95eec", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_demenz" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "F03" - }, { - "system": "http://snomed.info/sct", - "code": "52448006" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|2232c9bf87bcaea3662d0cdf99e95eec" - } - }, { - "fullUrl": "Condition/3d41249fd134d042643a1bf0cba029f4", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_multiple_sklerose" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "G35" - }, { - "system": "http://snomed.info/sct", - "code": "24700007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|3d41249fd134d042643a1bf0cba029f4" - } - }, { - "fullUrl": "Condition/b4673122eee799ca8e50b7c39e5cf3c8", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_neuromuskulaere_erkrankungen" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "G70.9" - }, { - "system": "http://snomed.info/sct", - "code": "257277002" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|b4673122eee799ca8e50b7c39e5cf3c8" - } - }, { - "fullUrl": "Condition/2bb096fb82a3d305feadb3d78483ee55", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_epilepsie" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "G40.9" - }, { - "system": "http://snomed.info/sct", - "code": "84757009" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|2bb096fb82a3d305feadb3d78483ee55" - } - }, { - "fullUrl": "Condition/cf51c6ee676a7d36a6a06991c97f5037", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_migraene" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "G43.9" - }, { - "system": "http://snomed.info/sct", - "code": "37796009" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|cf51c6ee676a7d36a6a06991c97f5037" - } - }, { - "fullUrl": "Condition/8cc199f205fcba71bda6423edb76a0fc", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_zn_apoplex_mit_residuen" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I69.4" - }, { - "system": "http://snomed.info/sct", - "code": "440140008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|8cc199f205fcba71bda6423edb76a0fc" - } - }, { - "fullUrl": "Condition/52d3feb390e15355015e0000878ff861", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_zn_apoplex_ohne_residuen" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z86.7" - }, { - "system": "http://snomed.info/sct", - "code": "429993008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|52d3feb390e15355015e0000878ff861" - } - }, { - "fullUrl": "Condition/62a3f771bff4d565927fff9d88631f84", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_psychose" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "F29" - }, { - "system": "http://snomed.info/sct", - "code": "69322001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|62a3f771bff4d565927fff9d88631f84" - } - }, { - "fullUrl": "Condition/ef62e366c18c37efd57a628727e0d629", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_depression" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "F32.9" - }, { - "system": "http://snomed.info/sct", - "code": "35489007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|ef62e366c18c37efd57a628727e0d629" - } - }, { - "fullUrl": "Condition/158281e46b9fcc558fcaab8e9fc62ff0", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_angsterkrankung" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394591006", - "display": "Neurology (qualifier value)" - }, { - "system": "http://snomed.info/sct", - "code": "394587001", - "display": "Psychiatry (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "F41.9" - }, { - "system": "http://snomed.info/sct", - "code": "197480006" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|158281e46b9fcc558fcaab8e9fc62ff0" - } - }, { - "fullUrl": "Condition/7f7cb1ee559e234a47f9f5791d874283", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-kidney-diseases" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_nierenerkrankungen_code.1-chronische_nierenerkrankungen_code" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394589003", - "display": "Nephrology (qualifier value)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "Z99.2" - }, { - "system": "http://snomed.info/sct", - "code": "714152005" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|7f7cb1ee559e234a47f9f5791d874283" - } - }, { - "fullUrl": "Condition/ae345eb37cee2728e38df71dcf60a8b7", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/gastrointestinal-ulcers" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.magengeschwure_code.1-magengeschwure_code" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "394584008", - "display": "Gastroenterology (qualifier value))" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "K28" - }, { - "system": "http://snomed.info/sct", - "code": "40845000" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|ae345eb37cee2728e38df71dcf60a8b7" - } - }, { - "fullUrl": "Observation/8d797113634820fe7b035349f4799336", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/smoking-status" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.raucherstatus_code.1-raucherstatus_code" - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "social-history", - "display": "Social History" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "72166-2" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://loinc.org", - "code": "LA18976-3" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|8d797113634820fe7b035349f4799336" - } - }, { - "fullUrl": "Observation/a813e636ecf46c38cec9059480a4eb98", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/history-of-travel" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.reiseaktivitat_country_1.1-reiseaktivitat_country_1", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "social-history", - "display": "Social History" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "8691-8" - }, { - "system": "http://snomed.info/sct", - "code": "443846001" - } ], - "text": "History of Travel" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373066001" - } ] - }, - "component": [ { - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "82752-7", - "display": "Date travel started" - } ], - "text": "Travel start date" - }, - "valueDateTime": "2020-01-01" - }, { - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "91560-3", - "display": "Date of departure from travel destination" - } ], - "text": "Travel end date" - }, - "valueDateTime": "2021-04-30" - }, { - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94651-7", - "display": "Country of travel" - } ], - "text": "Country of travel" - }, - "valueCodeableConcept": { - "coding": [ { - "system": "urn:iso:std:iso:3166", - "code": "AO", - "display": "Angola" - } ], - "text": "Angola" - } - } ] - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|a813e636ecf46c38cec9059480a4eb98" - } - }, { - "fullUrl": "Procedure/cc1d9effec7880059304a7da2af9e53b", - "resource": { - "resourceType": "Procedure", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/respiratory-therapies" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.bestehende_sauerstoff_oder_beatmungstherapie_code.1-bestehende_sauerstoff_oder_beatmungstherapie_code" - } ], - "status": "in-progress", - "category": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "277132007", - "display": "Therapeutic procedure (procedure)" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "53950000" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_performedDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Procedure", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|cc1d9effec7880059304a7da2af9e53b" - } - }, { - "fullUrl": "Immunization/78e7f2d8bf1c9c395b3c435dbcbfa41b", - "resource": { - "resourceType": "Immunization", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/immunization" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.impfungen_influenza.1-impfungen_influenza" - } ], - "status": "completed", - "vaccineCode": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "836377006" - } ] - }, - "patient": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "occurrenceDateTime": "2019-04-25", - "protocolApplied": [ { - "targetDisease": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "6142004" - } ] - } ], - "_doseNumberString": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - } ] - }, - "request": { - "method": "POST", - "url": "Immunization", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId|78e7f2d8bf1c9c395b3c435dbcbfa41b" - } - }, { - "fullUrl": "Immunization/4fae4dcca51487424cd5a9b5e982578d", - "resource": { - "resourceType": "Immunization", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/immunization" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.impfungen_influenza.1-impfungen_pneumokokken" - } ], - "status": "completed", - "vaccineCode": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "836398006" - } ] - }, - "patient": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "occurrenceDateTime": "2020-03-03", - "protocolApplied": [ { - "targetDisease": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "16814004" - } ] - } ], - "_doseNumberString": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - } ] - }, - "request": { - "method": "POST", - "url": "Immunization", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId|4fae4dcca51487424cd5a9b5e982578d" - } - }, { - "fullUrl": "Immunization/ca1584ba1018f9ab0209021c9cf04ae8", - "resource": { - "resourceType": "Immunization", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/immunization" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.impfungen_influenza.1-impfungen_bcg" - } ], - "status": "completed", - "vaccineCode": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "836402002" - } ] - }, - "patient": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "occurrenceDateTime": "2019-04-10", - "protocolApplied": [ { - "targetDisease": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "56717001" - } ] - } ], - "_doseNumberString": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - } ] - }, - "request": { - "method": "POST", - "url": "Immunization", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId|ca1584ba1018f9ab0209021c9cf04ae8" - } - }, { - "fullUrl": "Immunization/9205d01d4aceb36aeafa264a18a10cd4", - "resource": { - "resourceType": "Immunization", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/immunization" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.impfungen_influenza.1-impfungen_covid_19" - } ], - "status": "not-done", - "vaccineCode": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "1119349007" - } ] - }, - "patient": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_occurrenceDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "protocolApplied": [ { - "targetDisease": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "840539006" - } ] - } ], - "_doseNumberString": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - } ] - }, - "request": { - "method": "POST", - "url": "Immunization", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId|9205d01d4aceb36aeafa264a18a10cd4" - } - }, { - "fullUrl": "Consent/8a397e16ded291857c6da7f34d845b71", - "resource": { - "resourceType": "Consent", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/do-not-resuscitate-order" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/consentId", - "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.dnranordnung_code.1-dnranordnung" - } ], - "status": "active", - "scope": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/consentscope", - "code": "adr", - "display": "Advanced Care Directive" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes", - "code": "dnr", - "display": "Do Not Resuscitate" - } ] - } ], - "patient": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "policy": [ { - "uri": "https://www.aerzteblatt.de/archiv/65440/DNR-Anordnungen-Das-fehlende-Bindeglied" - } ], - "provision": { - "code": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "304252001" - } ] - } ] - } - }, - "request": { - "method": "POST", - "url": "Consent", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/consentId|8a397e16ded291857c6da7f34d845b71" - } - }, { - "fullUrl": "DiagnosticReport/7db8d983943891d0e79a2537f41df66a", - "resource": { - "resourceType": "DiagnosticReport", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diagnostic-report-radiology" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId", - "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.befund_bildgebender_verfahren_ct.1-befund_bildgebender_verfahren_ct" - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "18726-0", - "display": "Radiology studies (set)" - }, { - "system": "http://terminology.hl7.org/CodeSystem/v2-0074", - "code": "RAD", - "display": "Radiology" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "18748-4", - "display": "Diagnostic imaging study" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "conclusionCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "118247008:{363713009=263654008,42752001=840539006}" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "DiagnosticReport", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId|7db8d983943891d0e79a2537f41df66a" - } - }, { - "fullUrl": "Procedure/23336a6967dc8136c44671d097dcebf3", - "resource": { - "resourceType": "Procedure", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/radiology-procedures" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", - "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.bildgebende_verfahren_ct.1-bildgebende_verfahren_ct" - } ], - "status": "completed", - "category": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "103693007", - "display": "Diagnostic procedure (procedure)" - } ] - }, - "code": { - "coding": [ { - "system": "http://dicom.nema.org/resources/ontology/DCM", - "code": "CT" - }, { - "system": "http://snomed.info/sct", - "code": "77477000:363704007=39607008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_performedDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "39607008", - "display": "Lung structure (body structure)" - } ] - } ], - "report": [ { - "reference": "DiagnosticReport/7db8d983943891d0e79a2537f41df66a" - } ] - }, - "request": { - "method": "POST", - "url": "Procedure", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|23336a6967dc8136c44671d097dcebf3" - } - }, { - "fullUrl": "DiagnosticReport/121391ebc20f01c123838478c01eb099", - "resource": { - "resourceType": "DiagnosticReport", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diagnostic-report-radiology" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId", - "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.befund_bildgebender_verfahren_ct.1-befund_bildgebender_verfahren_roentgen" - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "18726-0", - "display": "Radiology studies (set)" - }, { - "system": "http://terminology.hl7.org/CodeSystem/v2-0074", - "code": "RAD", - "display": "Radiology" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "18748-4", - "display": "Diagnostic imaging study" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "conclusionCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "118247008:363713009=17621005" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "DiagnosticReport", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId|121391ebc20f01c123838478c01eb099" - } - }, { - "fullUrl": "Procedure/63d1e2cbec6a210a60808de18b88d430", - "resource": { - "resourceType": "Procedure", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/radiology-procedures" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", - "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.bildgebende_verfahren_ct.1-bildgebende_verfahren_roentgen" - } ], - "status": "completed", - "category": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "103693007", - "display": "Diagnostic procedure (procedure)" - } ] - }, - "code": { - "coding": [ { - "system": "http://dicom.nema.org/resources/ontology/DCM", - "code": "RG" - }, { - "system": "http://snomed.info/sct", - "code": "168537006:363704007=39607008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_performedDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "39607008", - "display": "Lung structure (body structure)" - } ] - } ], - "report": [ { - "reference": "DiagnosticReport/121391ebc20f01c123838478c01eb099" - } ] - }, - "request": { - "method": "POST", - "url": "Procedure", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|63d1e2cbec6a210a60808de18b88d430" - } - }, { - "fullUrl": "DiagnosticReport/ea540a3d68536a554ad89879d166fb9b", - "resource": { - "resourceType": "DiagnosticReport", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diagnostic-report-radiology" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId", - "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.befund_bildgebender_verfahren_ct.1-befund_bildgebender_verfahren_us" - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "18726-0", - "display": "Radiology studies (set)" - }, { - "system": "http://terminology.hl7.org/CodeSystem/v2-0074", - "code": "RAD", - "display": "Radiology" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "18748-4", - "display": "Diagnostic imaging study" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "conclusionCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "118247008:363713009=373068000" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "DiagnosticReport", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId|ea540a3d68536a554ad89879d166fb9b" - } - }, { - "fullUrl": "Procedure/834e4facc0023e09ada2ddae64cbbf52", - "resource": { - "resourceType": "Procedure", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/radiology-procedures" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", - "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.bildgebende_verfahren_ct.1-bildgebende_verfahren_us" - } ], - "status": "completed", - "category": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "103693007", - "display": "Diagnostic procedure (procedure)" - } ] - }, - "code": { - "coding": [ { - "system": "http://dicom.nema.org/resources/ontology/DCM", - "code": "US" - }, { - "system": "http://snomed.info/sct", - "code": "16310003:363704007=39607008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_performedDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "bodySite": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "39607008", - "display": "Lung structure (body structure)" - } ] - } ], - "report": [ { - "reference": "DiagnosticReport/ea540a3d68536a554ad89879d166fb9b" - } ] - }, - "request": { - "method": "POST", - "url": "Procedure", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|834e4facc0023e09ada2ddae64cbbf52" - } - }, { - "fullUrl": "Observation/a7e0bafdb16b5208b621146591775bf2", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pregnancy-status" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.schwangerschaft_code.1-schwangerschaft_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "social-history", - "display": "Social History" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "82810-3" - } ], - "text": "Pregnancy status" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://loinc.org", - "code": "LA15173-0" - }, { - "system": "http://snomed.info/sct", - "code": "77386006" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|a7e0bafdb16b5208b621146591775bf2" - } - }, { - "fullUrl": "Observation/4f1849da986cd6574243cad240676309", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sex-assigned-at-birth" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.biologisches_geschlecht_code.1-biologisches_geschlecht_code" - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "social-history", - "display": "Social History" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "76689-9" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://hl7.org/fhir/administrative-gender", - "code": "female" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|4f1849da986cd6574243cad240676309" - } - }, { - "fullUrl": "Observation/c7ac42650063403e9bf68f545afb512f", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/frailty-score" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.frailtyscore_code.1-frailtyscore_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "survey", - "display": "Survey" - } ] - } ], - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "763264000" - } ], - "text": "Frailty Scale Score" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/frailty-score", - "code": "9" - } ] - }, - "method": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "445414007", - "display": "Canadian Study of Health and Aging clinical frailty scale" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c7ac42650063403e9bf68f545afb512f" - } - }, { - "fullUrl": "Observation/540a48c942408b04a753b7a9f05987f0", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/body-weight" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.gewicht_code.1-gewicht_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "29463-7" - }, { - "system": "http://snomed.info/sct", - "code": "27113001" - } ], - "text": "Body Weight" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 130, - "unit": "kilogram", - "system": "http://unitsofmeasure.org", - "code": "kg" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|540a48c942408b04a753b7a9f05987f0" - } - }, { - "fullUrl": "Observation/b1e6c82a81da9cc7c53da1742adc0ac6", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/body-height" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.korpergrose_code.1-korpergrose_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "8302-2" - }, { - "system": "http://snomed.info/sct", - "code": "50373000" - } ], - "text": "Body height" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 155, - "unit": "centimeter", - "system": "http://unitsofmeasure.org", - "code": "cm" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|b1e6c82a81da9cc7c53da1742adc0ac6" - } - }, { - "fullUrl": "Observation/56a2ff5358f4cee3e741092b35344199", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/known-exposure" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.epidemiologische_faktoren.1-epidemiologische_faktoren.kontakt_mit_an_covid19_erkrankter_personq_code.1-kontakt_mit_an_covid19_erkrankter_personq_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "social-history", - "display": "Social History" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "88636-6" - } ], - "text": "Known exposure" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "840546002" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|56a2ff5358f4cee3e741092b35344199" - } - }, { - "fullUrl": "Condition/10e70a8e57207b64c3fa26d51fa9500d", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_venoese_thrombose" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "116223007" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I82.9" - }, { - "system": "http://snomed.info/sct", - "code": "111293003" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|10e70a8e57207b64c3fa26d51fa9500d" - } - }, { - "fullUrl": "Condition/e95e2237f89e17e3a6667368c478ade6", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_lungenarterienembolie" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "116223007" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I26.9" - }, { - "system": "http://snomed.info/sct", - "code": "59282003" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e95e2237f89e17e3a6667368c478ade6" - } - }, { - "fullUrl": "Condition/b477e364572e1e76563eca485ba3314e", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_stroke" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "116223007" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I64" - }, { - "system": "http://snomed.info/sct", - "code": "230690007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|b477e364572e1e76563eca485ba3314e" - } - }, { - "fullUrl": "Condition/326e7bcdc551143b739a9805ed73576f", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_myokardinfarkt" - } ], - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "116223007" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I21.9" - }, { - "system": "http://snomed.info/sct", - "code": "22298006" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|326e7bcdc551143b739a9805ed73576f" - } - }, { - "fullUrl": "Condition/6b61f570cda73213491211f04ae52d02", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] - }, - "modifierExtension": [ { - "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "261665006", - "display": "Unknown (qualifier value)" - } ], - "text": "Presence unknown." - } - } ], - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_andere" - } ], - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "116223007" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "I82.9" - }, { - "system": "http://snomed.info/sct", - "code": "371039008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6b61f570cda73213491211f04ae52d02" - } - }, { - "fullUrl": "Condition/defb942e73ddf1cc6a28aacbf7c623a1", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_pulmonale_co_infektionen" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "116223007" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "J18.9" - }, { - "system": "http://snomed.info/sct", - "code": "128601007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|defb942e73ddf1cc6a28aacbf7c623a1" - } - }, { - "fullUrl": "Condition/518b244a9ff9fcd52da05f8965bcf6df", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_blutstrominfektionen" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "116223007" - } ] - } ], - "code": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", - "version": "2021", - "code": "A41.9" - }, { - "system": "http://snomed.info/sct", - "code": "434156008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|518b244a9ff9fcd52da05f8965bcf6df" - } - }, { - "fullUrl": "Condition/0eb6da1056e1bc597088bfe4d07b6c04", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_bauchschmerzen" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "75325-1" - } ] - } ], - "severity": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "6736007" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "21522001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|0eb6da1056e1bc597088bfe4d07b6c04" - } - }, { - "fullUrl": "Condition/18f4a74b819f48e846aea8428cbf2e65", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_bewusstseinsstoerungen_verwirrtheit" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "refuted", - "display": "Refuted" - }, { - "system": "http://snomed.info/sct", - "code": "410594000", - "display": "Definitely NOT present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "75325-1" - } ] - } ], - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "40917007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|18f4a74b819f48e846aea8428cbf2e65" - } - }, { - "fullUrl": "Condition/7ae512e36d6be2671663a9c72a267ebc", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_durchfall" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "75325-1" - } ] - } ], - "severity": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "6736007" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "62315008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|7ae512e36d6be2671663a9c72a267ebc" - } - }, { - "fullUrl": "Condition/da799a2594ad682ccf003a17a42fa0a5", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_erbrechen" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "75325-1" - } ] - } ], - "severity": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "24484000" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "422400008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|da799a2594ad682ccf003a17a42fa0a5" - } - }, { - "fullUrl": "Condition/383f7ebb1247a9fdaf5154f4d2447565", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] - }, - "modifierExtension": [ { - "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "261665006", - "display": "Unknown (qualifier value)" - } ], - "text": "Presence unknown." - } - } ], - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_husten" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "75325-1" - } ] - } ], - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "49727002" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|383f7ebb1247a9fdaf5154f4d2447565" - } - }, { - "fullUrl": "Condition/e6d3b0194d67cfadb95a73dc56fd5ced", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_kurzatmigkeit_dyspnoe" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "75325-1" - } ] - } ], - "severity": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "442452003" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "267036007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e6d3b0194d67cfadb95a73dc56fd5ced" - } - }, { - "fullUrl": "Condition/e58efc4175c485a70cae4d16515109f5", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_uebelkeit" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "75325-1" - } ] - } ], - "severity": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "24484000" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "422587007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e58efc4175c485a70cae4d16515109f5" - } - }, { - "fullUrl": "Condition/cb351c76451dc77c7be7b33df720f11e", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_fieber" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "75325-1" - } ] - } ], - "severity": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "6736007" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "426000000" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|cb351c76451dc77c7be7b33df720f11e" - } - }, { - "fullUrl": "Condition/fd18f40e701b014998240c8ee77036b0", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_kopfschmerzen" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "75325-1" - } ] - } ], - "severity": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "255604002" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "25064002" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|fd18f40e701b014998240c8ee77036b0" - } - }, { - "fullUrl": "Procedure/f5099ee9e4ebecb30404aa827095425d", - "resource": { - "resourceType": "Procedure", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/dialysis" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", - "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.dialyse_hamofiltration_code.1-dialyse_hamofiltration_code" - } ], - "status": "in-progress", - "category": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "277132007", - "display": "Therapeutic procedure (procedure)" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "108241001" - } ], - "text": "Dialysis" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_performedDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Procedure", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|f5099ee9e4ebecb30404aa827095425d" - } - }, { - "fullUrl": "Procedure/f0681e4ddb86deeb21e4348f01d10f18", - "resource": { - "resourceType": "Procedure", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/apheresis" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", - "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.apherese_code.1-apherese_code" - } ], - "status": "in-progress", - "category": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "277132007", - "display": "Therapeutic procedure (procedure)" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "127788007" - } ], - "text": "Apheresis" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_performedDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Procedure", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|f0681e4ddb86deeb21e4348f01d10f18" - } - }, { - "fullUrl": "Procedure/4031dde4e474e8666379ecc981039015", - "resource": { - "resourceType": "Procedure", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/prone-position" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", - "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.bauchlage_code.1-bauchlage_code" - } ], - "status": "in-progress", - "category": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "225287004", - "display": "Procedures relating to positioning and support (procedure)" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "431182000" - } ], - "text": "Prone position" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_performedDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Procedure", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|4031dde4e474e8666379ecc981039015" - } - }, { - "fullUrl": "Procedure/f52ad2d78fa2e2f0b34d1978ce16ba9d", - "resource": { - "resourceType": "Procedure", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/extracorporeal-membrane-oxygenation" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", - "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.ecmotherapie_code.1-ecmotherapie_code" - } ], - "status": "in-progress", - "category": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "277132007", - "display": "Therapeutic procedure (procedure)" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "233573008" - } ], - "text": "ECMO" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_performedDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Procedure", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|f52ad2d78fa2e2f0b34d1978ce16ba9d" - } - }, { - "fullUrl": "Procedure/7f06d5b778fd7d9b7994b4709bfaba74", - "resource": { - "resourceType": "Procedure", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/respiratory-therapies" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", - "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.beatmungstherapie_code.1-beatmungstherapie" - } ], - "status": "in-progress", - "category": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "277132007", - "display": "Therapeutic procedure (procedure)" - } ] - }, - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "371907003:425391005=426854004" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_performedDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "usedCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "426854004" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "Procedure", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|7f06d5b778fd7d9b7994b4709bfaba74" - } - }, { - "fullUrl": "Observation/4b5f5a80141ab5ae8077f3f88211eeca", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/patient-in-icu" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.liegt_der_patient_auf_der_intensivstationq_code.1-liegt_der_patient_auf_der_intensivstationq" - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "survey", - "display": "Survey" - } ] - } ], - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "01", - "display": "Is the patient in the intensive care unit?" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373066001" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|4b5f5a80141ab5ae8077f3f88211eeca" - } - }, { - "fullUrl": "Condition/030b210545dfcce392b2437998748873", - "resource": { - "resourceType": "Condition", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/dependence-on-ventilator" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", - "value": "1-Event.1_fall_arm_1.1-Form.outcome_bei_entlassung.1-outcome_bei_entlassung.respiratorisches_outcome_code.1-respiratorisches_outcome_code" - } ], - "clinicalStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } ] - }, - "verificationStatus": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", - "code": "confirmed", - "display": "Confirmed" - }, { - "system": "http://snomed.info/sct", - "code": "410605003", - "display": "Confirmed present (qualifier value)" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "404989005", - "display": "Ventilation status (observable entity)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "444932008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_recordedDate": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - } - }, - "request": { - "method": "POST", - "url": "Condition", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|030b210545dfcce392b2437998748873" - } - }, { - "fullUrl": "Observation/295079020c484b97139cf61dfd17597f", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/discharge-disposition" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.outcome_bei_entlassung.1-outcome_bei_entlassung.entlassungsart_code.1-entlassungsart_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "social-history", - "display": "Social History" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "55128-3" - } ], - "text": "type of Discharge" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "371827001" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|295079020c484b97139cf61dfd17597f" - } - }, { - "fullUrl": "Observation/7036a4295910bec756a86548c51c2155", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-rt-pcr" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.outcome_bei_entlassung.1-outcome_bei_entlassung.ergebnis_folgeabstrich_code.1-ergebnis_folgeabstrich_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6", - "display": "Laboratory studies (set)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94500-6" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "260373001" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|7036a4295910bec756a86548c51c2155" - } - }, { - "fullUrl": "Observation/c6c4aa0c109f0ef0ce0bea83d1295000", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.crp_code.1-crp", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "48421-2", - "display": "c-reactive-protein-in-capillary-blood" - } ], - "text": "crp" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 20.12, - "unit": "mg/dL", - "system": "http://unitsofmeasure.org", - "code": "mg/dL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c6c4aa0c109f0ef0ce0bea83d1295000" - } - }, { - "fullUrl": "Observation/b18504380f29923f1e2535f0690ae652", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ferritin_code.1-ferritin", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "86914-9", - "display": "ferritin-goal-serum-or-plasma" - } ], - "text": "ferritin" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12.12, - "unit": "ng/mL", - "system": "http://unitsofmeasure.org", - "code": "ng/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|b18504380f29923f1e2535f0690ae652" - } - }, { - "fullUrl": "Observation/57af451484bed3dac9d0658e76e60abb", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.bilirubin_code.1-bilirubin", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "14631-6", - "display": "bilirubin.total-in-serum-or-plasma" - } ], - "text": "bilirubin" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12.23, - "unit": "umol/L", - "system": "http://unitsofmeasure.org", - "code": "umol/L" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|57af451484bed3dac9d0658e76e60abb" - } - }, { - "fullUrl": "Observation/a9dd6563d85197d56723589bbd50a456", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ddimer_code.1-ddimer", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "48066-5", - "display": "fibrin-d-dimer-ddu-in-platelet-poor-plasma" - } ], - "text": "ddimer" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 10.0, - "unit": "ng/mL", - "system": "http://unitsofmeasure.org", - "code": "ng/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|a9dd6563d85197d56723589bbd50a456" - } - }, { - "fullUrl": "Observation/aad455b964a2553d98a2069d46a9c862", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.gammagt_code.1-gammagt", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "2325-9", - "display": "gamma-glutamyl-transferase-aspartate-aminotransferase-in-serum-or-plasma" - } ], - "text": "gammagt" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 5.2, - "unit": "U/L", - "system": "http://unitsofmeasure.org", - "code": "U/L" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|aad455b964a2553d98a2069d46a9c862" - } - }, { - "fullUrl": "Observation/19d8d00510005a69deea2bf1098f6831", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.gotast_code.1-gotast", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "88112-8", - "display": "aspartate-aminotransferase-in-serum-or-plasma-by-no-addition-of-p-5-p" - } ], - "text": "gotast" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 140, - "unit": "U/L", - "system": "http://unitsofmeasure.org", - "code": "U/L" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|19d8d00510005a69deea2bf1098f6831" - } - }, { - "fullUrl": "Observation/7d1a6f74189f4f0c548d02ceeacaa77a", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ldh_code.1-ldh", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "14803-1", - "display": "lactate-dehydrogenase-in-body-fluid-by-lactate-to-pyruvate-reaction" - } ], - "text": "ldh" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 150, - "unit": "U/L", - "system": "http://unitsofmeasure.org", - "code": "U/L" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|7d1a6f74189f4f0c548d02ceeacaa77a" - } - }, { - "fullUrl": "Observation/0d981d3043fc264fa9b78f9b26029a48", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.kardiale_troponine_code.1-kardiale_troponine", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "48425-3", - "display": "troponin-t.cardiac-in-blood" - } ], - "text": "kardiale_troponine" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12.2, - "unit": "ng/mL", - "system": "http://unitsofmeasure.org", - "code": "ng/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|0d981d3043fc264fa9b78f9b26029a48" - } - }, { - "fullUrl": "Observation/c1108c784b76b703cb069b34bcf34de8", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.hamoglobin_code.1-hamoglobin", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "718-7", - "display": "hemoglobin-in-blood" - } ], - "text": "hamoglobin" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 8.5, - "unit": "g/dL", - "system": "http://unitsofmeasure.org", - "code": "g/dL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c1108c784b76b703cb069b34bcf34de8" - } - }, { - "fullUrl": "Observation/d3c90eae28de0fbbf0a7d6c22a6b920d", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.kreatinin_code.1-kreatinin", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "2160-0", - "display": "creatinine-in-serum-or-plasma" - } ], - "text": "kreatinin" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12.5, - "unit": "mg/L", - "system": "http://unitsofmeasure.org", - "code": "mg/L" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|d3c90eae28de0fbbf0a7d6c22a6b920d" - } - }, { - "fullUrl": "Observation/daeaafe11755740646d6e93bd13cdf10", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.laktat_code.1-laktat", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "14118-4", - "display": "lactate-in-serum-or-plasma" - } ], - "text": "laktat" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12, - "unit": "mg/dL", - "system": "http://unitsofmeasure.org", - "code": "mg/dL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|daeaafe11755740646d6e93bd13cdf10" - } - }, { - "fullUrl": "Observation/d6b363609ec0f23d45f3c248e196ae1e", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.leukozyten_absolut_code.1-leukozyten_absolut", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "6690-2", - "display": "leukocytes-in-blood-by-automated-count" - } ], - "text": "leukozyten_absolut" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 124, - "unit": "10*3/uL", - "system": "http://unitsofmeasure.org", - "code": "10*3/uL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|d6b363609ec0f23d45f3c248e196ae1e" - } - }, { - "fullUrl": "Observation/05cbe513382c2611d7a38f2d9576b026", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.lymphozyten_absolut_code.1-lymphozyten_absolut", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "731-0", - "display": "lymphocytes-in-blood-by-automated-count" - } ], - "text": "lymphozyten_absolut" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 162.2, - "unit": "10*3/uL", - "system": "http://unitsofmeasure.org", - "code": "10*3/uL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|05cbe513382c2611d7a38f2d9576b026" - } - }, { - "fullUrl": "Observation/c788d56370f329e0fc639d441944b966", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.neutrophile_absolut_code.1-neutrophile_absolut", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "26499-4", - "display": "neutrophils-in-blood" - } ], - "text": "neutrophile_absolut" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 10.67, - "unit": "10*3/uL", - "system": "http://unitsofmeasure.org", - "code": "10*3/uL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c788d56370f329e0fc639d441944b966" - } - }, { - "fullUrl": "Observation/b62ab4cb10abf72c9a392d7f875ee513", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ptt_code.1-ptt", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "16631-4", - "display": "aptt-in-blood-by-coagulation-11-saline" - } ], - "text": "ptt" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 5, - "unit": "s", - "system": "http://unitsofmeasure.org", - "code": "s" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|b62ab4cb10abf72c9a392d7f875ee513" - } - }, { - "fullUrl": "Observation/438c4a7ca77969f413a05a1a9dfdfb2a", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.thrombozyten_absolut_code.1-thrombozyten_absolut", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "26516-5", - "display": "platelets-in-plasma" - } ], - "text": "thrombozyten_absolut" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 9.9, - "unit": "10*3/uL", - "system": "http://unitsofmeasure.org", - "code": "10*3/uL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|438c4a7ca77969f413a05a1a9dfdfb2a" - } - }, { - "fullUrl": "Observation/19879eaeb48f6ad089e882c252a7440e", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.inr_code.1-inr", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "46418-0", - "display": "inr-in-capillary-blood-by-coagulation-assay" - } ], - "text": "inr" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 99.9, - "unit": "{INR}", - "system": "http://unitsofmeasure.org", - "code": "{INR}" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|19879eaeb48f6ad089e882c252a7440e" - } - }, { - "fullUrl": "Observation/90836f31df913c7c16459ec5e8acbaf5", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.serumalbumin_code.1-serumalbumin", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "61152-5", - "display": "albumin-in-serum-or-plasma-by-bromocresol-purple-bcp-dye-binding-method" - } ], - "text": "serumalbumin" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 9.9, - "unit": "g/dL", - "system": "http://unitsofmeasure.org", - "code": "g/dL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|90836f31df913c7c16459ec5e8acbaf5" - } - }, { - "fullUrl": "Observation/10ecb6f5122913455d8adc1bec2cc61b", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.antithrombin_iii_code.1-antithrombin_iii", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "3174-0", - "display": "antithrombin-in-platelet-poor-plasma-by-chromogenic-method" - } ], - "text": "antithrombin_iii" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 9.4, - "unit": "[IU]/mL", - "system": "http://unitsofmeasure.org", - "code": "[IU]/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|10ecb6f5122913455d8adc1bec2cc61b" - } - }, { - "fullUrl": "Observation/a9e3a6cb462320856852a4a4f1b40451", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.pct_procalcitonin_code.1-pct_procalcitonin", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "75241-0", - "display": "procalcitonin-in-serum-or-plasma-by-immunoassay" - } ], - "text": "pct_procalcitonin" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 123.99, - "unit": "ng/mL", - "system": "http://unitsofmeasure.org", - "code": "ng/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|a9e3a6cb462320856852a4a4f1b40451" - } - }, { - "fullUrl": "Observation/69cf7898a72f2ad8134a0a56fcca294e", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.il6_interleukin_6_code.1-il6_interleukin_6", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "44322-6", - "display": "interleukin-6-in-serum-or-plasma" - } ], - "text": "il6_interleukin_6" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 22.99, - "unit": "pg/mL", - "system": "http://unitsofmeasure.org", - "code": "pg/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|69cf7898a72f2ad8134a0a56fcca294e" - } - }, { - "fullUrl": "Observation/ab8f04367e154d82937a130774cc7d79", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ntprobnp_code.1-ntprobnp", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "33762-6", - "display": "natriuretic-peptide.b-prohormone-n-terminal-in-serum-or-plasma" - } ], - "text": "ntprobnp" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 23.12, - "unit": "pg/mL", - "system": "http://unitsofmeasure.org", - "code": "pg/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|ab8f04367e154d82937a130774cc7d79" - } - }, { - "fullUrl": "Observation/d0c364ae358b5cd6afafbd00d49e5b1e", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.fibrinogen_code.1-fibrinogen", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "30902-1", - "display": "fibrinogen-in-platelet-poor-plasma-by-heat-denaturation" - } ], - "text": "fibrinogen" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12, - "unit": "g/L", - "system": "http://unitsofmeasure.org", - "code": "g/L" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|d0c364ae358b5cd6afafbd00d49e5b1e" - } - }, { - "fullUrl": "Observation/c03e0a5a1ce3bc2c467bf4c555a496da", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-rt-pcr" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2rtpcr_code.1-sarsco_v2rtpcr_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94500-6", - "display": "sars-cov-2-covid-19-rna-in-respiratory-specimen-by-naa-with-probe-detection" - } ], - "text": "SARS-CoV-2-RNA (PCR)" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "260373001", - "display": "Detected (qualifier value)" - } ], - "text": "SARS-CoV-2-RNA positiv" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c03e0a5a1ce3bc2c467bf4c555a496da" - } - }, { - "fullUrl": "Observation/71c3c99f3aa819f15620db902f7bf554", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-ab-pnl-ser-pl-ia" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ab_ia_ql_code.1-sarsco_v2_covid19_ab_pnl_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94504-8" - } ], - "text": "sarsco_v2_covid19_ab_pnl" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "hasMember": [ { - "reference": "Observation/36aa48a9cf003b80b5d8409b9f84cd4c" - }, { - "reference": "Observation/d0defccbd7da3608f83a29d94c81b4a1" - }, { - "reference": "Observation/1fad7001bef169ba818f8d022e67714e" - }, { - "reference": "Observation/97c5e718cf6dbf4b534c0c9cfc59e614" - }, { - "reference": "Observation/97bc563b27ce55d0c54eeb23f7ee79e3" - }, { - "reference": "Observation/cbe306564e08d1f48b857a8a4bdd8d08" - }, { - "reference": "Observation/0d7142d3e0a5e68f31be7bd72c68687b" - }, { - "reference": "Observation/34d7542e8550af2e3c4a451ef05ea2fc" - } ] - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|71c3c99f3aa819f15620db902f7bf554" - } - }, { - "fullUrl": "Observation/36aa48a9cf003b80b5d8409b9f84cd4c", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-ab-ser-pl-ql-ia" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ab_ia_ql_code.1-sarsco_v2_covid19_ab_ia_ql_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94762-2", - "display": "sars-cov-2-covid-19-ab-in-serum-or-plasma-by-immunoassay" - } ], - "text": "sarsco_v2_covid19_ab_ia_ql" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "260415000" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|36aa48a9cf003b80b5d8409b9f84cd4c" - } - }, { - "fullUrl": "Observation/d0defccbd7da3608f83a29d94c81b4a1", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-ab-ser-pl-ia-acnc" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ab_ia_qn_code.1-sarsco_v2_covid19_ab_ia_qn_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94769-7", - "display": "sars-cov-2-covid-19-ab-in-serum-or-plasma-by-immunoassay" - } ], - "text": "sarsco_v2_covid19_ab_ia_qn" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 15, - "unit": "[IU]/mL", - "system": "http://unitsofmeasure.org", - "code": "[IU]/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|d0defccbd7da3608f83a29d94c81b4a1" - } - }, { - "fullUrl": "Observation/1fad7001bef169ba818f8d022e67714e", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-iga-ser-pl-ql-ia" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_a_ia_ql_code.1-sarsco_v2_covid19_ig_a_ia_ql_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94562-6", - "display": "sars-cov-2-covid-19-iga-ab-in-serum-or-plasma-by-immunoassay" - } ], - "text": "sarsco_v2_covid19_ig_a_ia_ql" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "260373001" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|1fad7001bef169ba818f8d022e67714e" - } - }, { - "fullUrl": "Observation/97c5e718cf6dbf4b534c0c9cfc59e614", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-iga-ser-pl-ia-acnc" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_a_ia_qn_code.1-sarsco_v2_covid19_ig_a_ia_qn_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94720-0", - "display": "sars-cov-2-covid-19-iga-ab-in-serum-or-plasma-by-immunoassay" - } ], - "text": "sarsco_v2_covid19_ig_a_ia_qn" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12, - "unit": "[IU]/mL", - "system": "http://unitsofmeasure.org", - "code": "[IU]/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|97c5e718cf6dbf4b534c0c9cfc59e614" - } - }, { - "fullUrl": "Observation/97bc563b27ce55d0c54eeb23f7ee79e3", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-igg-ser-pl-ql-ia" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_g_ia_ql_code.1-sarsco_v2_covid19_ig_g_ia_ql_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94563-4", - "display": "sars-cov-2-covid-19-igg-ab-in-serum-or-plasma-by-immunoassay" - } ], - "text": "sarsco_v2_covid19_ig_g_ia_ql" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "260373001" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|97bc563b27ce55d0c54eeb23f7ee79e3" - } - }, { - "fullUrl": "Observation/cbe306564e08d1f48b857a8a4bdd8d08", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-igg-ser-pl-ia-acnc" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_g_ia_qn_code.1-sarsco_v2_covid19_ig_g_ia_qn_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94505-5", - "display": "sars-cov-2-covid-19-igg-ab-in-serum-or-plasma-by-immunoassay" - } ], - "text": "sarsco_v2_covid19_ig_g_ia_qn" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12.6, - "unit": "[arb'U]/mL", - "system": "http://unitsofmeasure.org", - "code": "[arb'U]/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|cbe306564e08d1f48b857a8a4bdd8d08" - } - }, { - "fullUrl": "Observation/0d7142d3e0a5e68f31be7bd72c68687b", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-igm-ser-pl-ql-ia" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_m_ia_ql_code.1-sarsco_v2_covid19_ig_m_ia_ql_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94564-2", - "display": "sars-cov-2-covid-19-igm-ab-in-serum-or-plasma-by-immunoassay" - } ], - "text": "sarsco_v2_covid19_ig_m_ia_ql" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "260373001" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|0d7142d3e0a5e68f31be7bd72c68687b" - } - }, { - "fullUrl": "Observation/34d7542e8550af2e3c4a451ef05ea2fc", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-igm-ser-pl-ia-acnc" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_m_ia_qn_code.1-sarsco_v2_covid19_ig_m_ia_qn_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "94506-3", - "display": "sars-cov-2-covid-19-igm-ab-in-serum-or-plasma-by-immunoassay" - } ], - "text": "sarsco_v2_covid19_ig_m_ia_qn" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12, - "unit": "[arb'U]/mL", - "system": "http://unitsofmeasure.org", - "code": "[arb'U]/mL" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|34d7542e8550af2e3c4a451ef05ea2fc" - } - }, { - "fullUrl": "MedicationStatement/738644ecbdf2351ad08ad6e914c44d1b", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_antipyretika" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "N02B" - }, { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "antipyretic" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|738644ecbdf2351ad08ad6e914c44d1b" - } - }, { - "fullUrl": "MedicationStatement/b65dcd2c29be11ec690b1f97170c69ca", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_kortikosteroide" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "G01B" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|b65dcd2c29be11ec690b1f97170c69ca" - } - }, { - "fullUrl": "MedicationStatement/f82761d223e1bce214c390ce48fa7a32", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_atazanavir" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AR15" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f82761d223e1bce214c390ce48fa7a32" - } - }, { - "fullUrl": "MedicationStatement/82c925220f1b1192b43f8fae91123d4e", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_darunavir" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AR14" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|82c925220f1b1192b43f8fae91123d4e" - } - }, { - "fullUrl": "MedicationStatement/a8260b3a2712040d97b611829126856c", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_chloroquine_phosphate" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "P01BA01" - }, { - "system": "http://snomed.info/sct", - "code": "14728000" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|a8260b3a2712040d97b611829126856c" - } - }, { - "fullUrl": "MedicationStatement/66a3a49903b2d6283d00a0612d0021d7", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_hydroxychloroquine" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "P01BA02" - }, { - "system": "http://snomed.info/sct", - "code": "83490000" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|66a3a49903b2d6283d00a0612d0021d7" - } - }, { - "fullUrl": "MedicationStatement/8530d5fb33d3a055fc9692e9828f4d75", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_ivermectin" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "D11AX22" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "P02CF01" - }, { - "system": "http://snomed.info/sct", - "code": "96138006" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|8530d5fb33d3a055fc9692e9828f4d75" - } - }, { - "fullUrl": "MedicationStatement/f1c4170a4a772bd7ef5d706f08aef9e2", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_lopinavir_ritonavir" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AR10" - }, { - "system": "http://snomed.info/sct", - "code": "134573001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f1c4170a4a772bd7ef5d706f08aef9e2" - } - }, { - "fullUrl": "MedicationStatement/b17d67fee5e95da4d329b8aa34ca3f6d", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_ganciclovir" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AB06" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "S01AD09" - }, { - "system": "http://snomed.info/sct", - "code": "78025001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|b17d67fee5e95da4d329b8aa34ca3f6d" - } - }, { - "fullUrl": "MedicationStatement/466ab6bd182e5feda2b1d7a7aeff6ee0", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_oseltamivir" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AH02" - }, { - "system": "http://snomed.info/sct", - "code": "386142008" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|466ab6bd182e5feda2b1d7a7aeff6ee0" - } - }, { - "fullUrl": "MedicationStatement/d5a099001e02479728054c2808d15d7b", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_remdesivir" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fdasis.nlm.nih.gov", - "code": "3QKI37EEHE" - }, { - "system": "http://snomed.info/sct", - "code": "870518005" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|d5a099001e02479728054c2808d15d7b" - } - }, { - "fullUrl": "MedicationStatement/f3c1aee6cef1a72302a3a08985d139f2", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_ribavirin" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AP01" - }, { - "system": "http://snomed.info/sct", - "code": "35063004" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f3c1aee6cef1a72302a3a08985d139f2" - } - }, { - "fullUrl": "MedicationStatement/f40ce9b76c2112d9e538291d6be69534", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_camostat" - } ], - "status": "not-taken", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B02AB04" - }, { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "camostat" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f40ce9b76c2112d9e538291d6be69534" - } - }, { - "fullUrl": "MedicationStatement/c678f28f5d497d6587faa76efbd77480", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_favipiravir" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AX27" - }, { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "favipiravir" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|c678f28f5d497d6587faa76efbd77480" - } - }, { - "fullUrl": "MedicationStatement/2cfe06dea473205aa4b55ac50c2b5239", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_convalescent_plasma" - } ], - "status": "not-taken", - "medicationCodeableConcept": { - "coding": [ { - "system": "urn:oid:2.16.840.1.113883.6.18.2.6", - "code": "E9743" - }, { - "system": "urn:oid:2.16.840.1.113883.6.18.2.6", - "code": "E9744" - }, { - "system": "urn:oid:2.16.840.1.113883.6.18.2.6", - "code": "E9745" - }, { - "system": "urn:oid:2.16.840.1.113883.6.18.2.6", - "code": "E9746" - }, { - "system": "urn:oid:2.16.840.1.113883.6.18.2.6", - "code": "E9747" - }, { - "system": "urn:oid:2.16.840.1.113883.6.18.2.6", - "code": "E9748" - }, { - "system": "urn:oid:2.16.840.1.113883.6.18.2.6", - "code": "E9749" - }, { - "system": "urn:oid:2.16.840.1.113883.6.18.2.6", - "code": "E9750" - }, { - "system": "urn:oid:2.16.840.1.113883.6.18.2.6", - "code": "E9752" - }, { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "convalescent-plasma" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|2cfe06dea473205aa4b55ac50c2b5239" - } - }, { - "fullUrl": "MedicationStatement/2fff8ba7810f13abf56da951ecce5e20", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_steroids_gt_05_mg_kg_prednisone_equivalents" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "steroids-gt" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|2fff8ba7810f13abf56da951ecce5e20" - } - }, { - "fullUrl": "MedicationStatement/8e84ab83f716721f1511115a1559d0c3", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_steroids_lt_05_mg_kg_prednisone_equivalents" - } ], - "status": "unknown", - "medicationCodeableConcept": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "steroids-lt" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|8e84ab83f716721f1511115a1559d0c3" - } - }, { - "fullUrl": "MedicationStatement/7d140cba5db00a82030badcf23cad1cc", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_tocilizumab" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/ops", - "code": "6-005.n" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|7d140cba5db00a82030badcf23cad1cc" - } - }, { - "fullUrl": "MedicationStatement/0a33e036990066e9249c4e22121eec33", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_sarilumab" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/ops", - "code": "6-00a.g" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "L04AC14" - }, { - "system": "http://snomed.info/sct", - "code": "763522001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|0a33e036990066e9249c4e22121eec33" - } - }, { - "fullUrl": "MedicationStatement/17571b1d79e88d61df8be3af16321744", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_cni_or_mtor_inhibitors_eg_cyclosporin_a_tacrolimus_sirolimus_everolimus" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "L01XE10" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|17571b1d79e88d61df8be3af16321744" - } - }, { - "fullUrl": "MedicationStatement/a4c1e5ea57e481bc19ee53caf3a10574", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_anti_tnf_alpha_inhibitors_eg_adalimumab_etanercept" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/ops", - "code": "6-002.b" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|a4c1e5ea57e481bc19ee53caf3a10574" - } - }, { - "fullUrl": "MedicationStatement/fb26c96ddc5fb7104215b062648162ce", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_il1_receptor_antangonists" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/ops", - "code": "6-006.7" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "L04AC" - }, { - "system": "http://snomed.info/sct", - "code": "430817009" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|fb26c96ddc5fb7104215b062648162ce" - } - }, { - "fullUrl": "MedicationStatement/167d6dfb19a796fdc360bfd892bdf306", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_ruxolitinib" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/ops", - "code": "6-009.4" - }, { - "system": "http://snomed.info/sct", - "code": "703779004" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|167d6dfb19a796fdc360bfd892bdf306" - } - }, { - "fullUrl": "MedicationStatement/78a5ff941c5a3a644b233df9bc0b2567", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_colchicine" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "M04AC01" - }, { - "system": "http://snomed.info/sct", - "code": "73133000" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|78a5ff941c5a3a644b233df9bc0b2567" - } - }, { - "fullUrl": "MedicationStatement/1406d6cd4f8eef4f9c27cd2b0fac4dec", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_interferone_any" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "S01AD05" - }, { - "system": "http://snomed.info/sct", - "code": "768865007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|1406d6cd4f8eef4f9c27cd2b0fac4dec" - } - }, { - "fullUrl": "MedicationStatement/0e8bb33746d93301ad626c71decf112b", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_25_hydroxyvitamin_d" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "A11CC06" - }, { - "system": "http://snomed.info/sct", - "code": "88519001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|0e8bb33746d93301ad626c71decf112b" - } - }, { - "fullUrl": "MedicationStatement/dd7d6def763677e172e59600743462f9", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_zinc" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "A12CB" - }, { - "system": "http://snomed.info/sct", - "code": "764877006" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|dd7d6def763677e172e59600743462f9" - } - }, { - "fullUrl": "MedicationStatement/d65661ae8c7fd7f8ecd7be9b5274813d", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.acehemmer_code.1-acehemmer_code" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "41549009" - } ], - "text": "ACE inhibitors" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|d65661ae8c7fd7f8ecd7be9b5274813d" - } - }, { - "fullUrl": "MedicationStatement/f62da31eea0c8d9ac28284329f3d80d5", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.immunglobuline_code.1-immunglobuline_code" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "333710000" - } ], - "text": "immunoglobulins" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f62da31eea0c8d9ac28284329f3d80d5" - } - }, { - "fullUrl": "MedicationStatement/6d5d8b131ae1f26022f63358e6e11eb6", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_unfraktioniertes_heparin" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "81839001" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AB01" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00", - "reasonCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373808002", - "display": "Curative - procedure intent (qualifier value)" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|6d5d8b131ae1f26022f63358e6e11eb6" - } - }, { - "fullUrl": "MedicationStatement/466fd11e68703367b25dd0074b0dcc0b", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_niedermolekulares_heparin" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "81839001" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AB13" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00", - "reasonCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373808002", - "display": "Curative - procedure intent (qualifier value)" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|466fd11e68703367b25dd0074b0dcc0b" - } - }, { - "fullUrl": "MedicationStatement/40e9558eb38ea601648718b7a10e4aa6", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_argatroban" - } ], - "status": "not-taken", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "81839001" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AE03" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00", - "reasonCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373808002", - "display": "Curative - procedure intent (qualifier value)" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|40e9558eb38ea601648718b7a10e4aa6" - } - }, { - "fullUrl": "MedicationStatement/334462f597acdf650fc01fbafb7fd36f", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_plaettchenaggregationshemmer" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "81839001" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AC" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00", - "reasonCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373808002", - "display": "Curative - procedure intent (qualifier value)" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|334462f597acdf650fc01fbafb7fd36f" - } - }, { - "fullUrl": "MedicationStatement/9b8e2ab5561737dbaf9d1cd58f95e568", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_danaparoid" - } ], - "status": "unknown", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "81839001" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AB09" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00", - "reasonCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373808002", - "display": "Curative - procedure intent (qualifier value)" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|9b8e2ab5561737dbaf9d1cd58f95e568" - } - }, { - "fullUrl": "MedicationStatement/dfff4e5c14f1f27bb51c5cb3ad3ba811", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_phenprocoumon" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "81839001" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AA04" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00", - "reasonCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373808002", - "display": "Curative - procedure intent (qualifier value)" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|dfff4e5c14f1f27bb51c5cb3ad3ba811" - } - }, { - "fullUrl": "MedicationStatement/ed1a6e19bd697e1a9de4f0faf575bf7c", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_doak" - } ], - "status": "not-taken", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "81839001" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AE" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AF" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00", - "reasonCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373808002", - "display": "Curative - procedure intent (qualifier value)" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|ed1a6e19bd697e1a9de4f0faf575bf7c" - } - }, { - "fullUrl": "MedicationStatement/32de7959247fc3c3f4450cd689026e7b", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_sonstige" - } ], - "status": "not-taken", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "81839001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-07-14T14:45:00+00:00", - "reasonCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373808002", - "display": "Curative - procedure intent (qualifier value)" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|32de7959247fc3c3f4450cd689026e7b" - } - }, { - "fullUrl": "MedicationStatement/d311b1ac3dd07e4d5903d709fd9d83bb", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_antipyretika" - } ], - "status": "not-taken", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "N02B" - }, { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "antipyretic" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-09-24T09:31:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|d311b1ac3dd07e4d5903d709fd9d83bb" - } - }, { - "fullUrl": "MedicationStatement/3d8b08e728fe049b1832b8f97571c5cc", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_kortikosteroide" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "G01B" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "H02" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "M01BA" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "R03AK" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "S02B" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "R03AL" - }, { - "system": "http://snomed.info/sct", - "code": "768759001" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-09-24T09:31:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|3d8b08e728fe049b1832b8f97571c5cc" - } - }, { - "fullUrl": "MedicationStatement/f38ae64c09804ab0a51d1a2f5796d4fc", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_atazanavir" - } ], - "status": "not-taken", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AE08" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AR15" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "J05AR23" - }, { - "system": "http://snomed.info/sct", - "code": "413591007" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-09-24T09:31:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f38ae64c09804ab0a51d1a2f5796d4fc" - } - }, { - "fullUrl": "MedicationStatement/f5acfb6dbf038402a408c03fd8289d2d", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_colchicine" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "M04AC01" - }, { - "system": "http://snomed.info/sct", - "code": "73133000" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-09-24T09:31:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f5acfb6dbf038402a408c03fd8289d2d" - } - }, { - "fullUrl": "MedicationStatement/ece97efdf3dbf61d9e00a353e6c3767e", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_zinc" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "A12CB" - }, { - "system": "http://snomed.info/sct", - "code": "764877006" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-09-24T09:31:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|ece97efdf3dbf61d9e00a353e6c3767e" - } - }, { - "fullUrl": "MedicationStatement/2e2da5b5c2bc3906bddf943751549995", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.acehemmer_code.1-acehemmer_code" - } ], - "status": "not-taken", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "41549009" - } ], - "text": "ACE inhibitors" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-09-24T09:31:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|2e2da5b5c2bc3906bddf943751549995" - } - }, { - "fullUrl": "MedicationStatement/00bb50daaf33f7970f2c8804179977aa", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.immunglobuline_code.1-immunglobuline_code" - } ], - "status": "active", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "333710000" - } ], - "text": "immunoglobulins" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-09-24T09:31:00+00:00" - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|00bb50daaf33f7970f2c8804179977aa" - } - }, { - "fullUrl": "MedicationStatement/c461ea66b4e42f85cc49bafa682937be", - "resource": { - "resourceType": "MedicationStatement", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", - "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_unfraktioniertes_heparin" - } ], - "status": "not-taken", - "medicationCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "81839001" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AB01" - }, { - "system": "http://fhir.de/CodeSystem/dimdi/atc", - "code": "B01AB51" - } ] - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "effectiveDateTime": "2020-09-24T09:31:00+00:00", - "reasonCode": [ { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373808002", - "display": "Curative - procedure intent (qualifier value)" - } ] - } ] - }, - "request": { - "method": "POST", - "url": "MedicationStatement", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|c461ea66b4e42f85cc49bafa682937be" - } - }, { - "fullUrl": "Observation/b6203461a5df4697fdf3e5e86c66d40e", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/carbon-dioxide-partial-pressure" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.pa_co2_code.1-pa_co2_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6", - "display": "Laboratory studies (set)" - }, { - "system": "http://loinc.org", - "code": "18767-4", - "display": "Blood gas studies (set)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "11557-6" - } ], - "text": "Carbon dioxide [Partial pressure] in blood" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12, - "unit": "mmHg", - "system": "http://unitsofmeasure.org", - "code": "mm[Hg]" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|b6203461a5df4697fdf3e5e86c66d40e" - } - }, { - "fullUrl": "Observation/c6fdecd3782aaff9e683305101191245", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/oxygen-partial-pressure" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.pa_o2_code.1-pa_o2_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6", - "display": "Laboratory studies (set)" - }, { - "system": "http://loinc.org", - "code": "18767-4", - "display": "Blood gas studies (set)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "11557-8" - } ], - "text": "Oxygen [Partial pressure] in blood" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12, - "unit": "mmHg", - "system": "http://unitsofmeasure.org", - "code": "mm[Hg]" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c6fdecd3782aaff9e683305101191245" - } - }, { - "fullUrl": "Observation/c1f61168b1b3225745c1ff64280fe576", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/inhaled-oxygen-concentration" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.fi_o2_code.1-fi_o2_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6", - "display": "Laboratory studies (set)" - }, { - "system": "http://loinc.org", - "code": "18767-4", - "display": "Blood gas studies (set)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "3150-0" - }, { - "system": "http://snomed.info/sct", - "code": "250774007" - } ], - "text": "Oxygen [Partial pressure] in blood" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12, - "unit": "%", - "system": "http://unitsofmeasure.org", - "code": "%" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c1f61168b1b3225745c1ff64280fe576" - } - }, { - "fullUrl": "Observation/89880d99ff5c2e29db82b82203e4e295", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pH" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.p_hwert_code.1-p_hwert_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "laboratory", - "display": "Laboratory" - }, { - "system": "http://loinc.org", - "code": "26436-6", - "display": "Laboratory studies (set)" - }, { - "system": "http://loinc.org", - "code": "18767-4", - "display": "Blood gas studies (set)" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "11558-4" - } ], - "text": "pH of Blood" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12, - "unit": "pH", - "system": "http://unitsofmeasure.org", - "code": "[pH]" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|89880d99ff5c2e29db82b82203e4e295" - } - }, { - "fullUrl": "Observation/c6f6bb4c56362d1fa454ecce2c8e2f91", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sofa-score" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.sofa_score_resp.1-sofa_total_score", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "survey", - "display": "Survey" - } ] - } ], - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "06", - "display": "SOFA-Score" - } ], - "text": "Sepsis-related organ failure assessment score" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueInteger": 6, - "component": [ { - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "resp", - "display": "Respiratory system" - } ], - "text": "SOFA Respiratory system scoring category" - }, - "valueCodeableConcept": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "resp0", - "display": "Respiratory system SOFA score 0" - } ], - "text": "PaO2/FiO2 [mmHg (kPa)] ≥ 400 (53.3)" - } - }, { - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "ns", - "display": "Nervous system" - } ], - "text": "SOFA Nervous system scoring category" - }, - "valueCodeableConcept": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "ns2", - "display": "Nervous system SOFA score 2" - } ], - "text": "Glasgow Coma Scale (GCS) 10-12" - } - }, { - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "kid", - "display": "Kidneys" - } ], - "text": "SOFA Kidneys scoring category" - }, - "valueCodeableConcept": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "kid2", - "display": "Kidneys SOFA score 2" - } ], - "text": "Creatinine (mg/dl) [?mol/L] (or urine output) 2.0-3.4 [171-299]" - } - }, { - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "cvs", - "display": "Cardiovascular system" - } ], - "text": "SOFA Cardiovascular system scoring category" - }, - "valueCodeableConcept": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "cvs1", - "display": "Cardiovascular system SOFA score 1" - } ], - "text": "Mean arterial pressure (definitions) < 70 mmHg" - } - }, { - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "liv", - "display": "Liver" - } ], - "text": "SOFA Liver scoring category" - }, - "valueCodeableConcept": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "liv1", - "display": "Liver SOFA score 1" - } ], - "text": "Bilirubin (mg/dl) [umol/L] 1.2-1.9 [20-32]" - } - }, { - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "coa", - "display": "Coagulation" - } ], - "text": "SOFA Coagulation scoring category" - }, - "valueCodeableConcept": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", - "code": "coa0", - "display": "Coagulation SOFA score 0" - } ], - "text": "Platelets×10^3/ul ? 150" - } - } ] - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c6f6bb4c56362d1fa454ecce2c8e2f91" - } - }, { - "fullUrl": "Observation/6f250b44c463792c053abb52996fdea7", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/respiratory-rate" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.atemfrequenz_code.1-atemfrequenz_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "9279-1" - }, { - "system": "http://snomed.info/sct", - "code": "86290005" - } ], - "text": "Respiratory rate" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 12, - "unit": "per minute", - "system": "http://unitsofmeasure.org", - "code": "/min" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|6f250b44c463792c053abb52996fdea7" - } - }, { - "fullUrl": "Observation/29c562a8deefb0ea52e80de99ad8c42e", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/blood-pressure" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.blutdruck_systolisch_code.1-blutdruck_systolisch_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "85354-9", - "display": "Blood pressure panel with all children optional" - }, { - "system": "http://snomed.info/sct", - "code": "75367002", - "display": "Blood pressure (observable entity)" - } ], - "text": "Blood pressure" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "component": [ { - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "8480-6" - }, { - "system": "http://snomed.info/sct", - "code": "271649006" - } ], - "text": "Systolic blood pressure" - }, - "valueQuantity": { - "value": 12, - "unit": "mmHg", - "system": "http://unitsofmeasure.org", - "code": "mm[Hg]" - } - }, { - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "8462-4" - }, { - "system": "http://snomed.info/sct", - "code": "271650006" - } ], - "text": "Diastolic blood pressure" - }, - "valueQuantity": { - "value": 12, - "unit": "mmHg", - "system": "http://unitsofmeasure.org", - "code": "mm[Hg]" - } - } ] - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|29c562a8deefb0ea52e80de99ad8c42e" - } - }, { - "fullUrl": "Observation/695442d147cccc0c169b6748ec0359c0", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/heart-rate" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.herzfrequenz_code.1-herzfrequenz_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "8867-4" - }, { - "system": "http://snomed.info/sct", - "code": "364075005" - } ], - "text": "Heart rate" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 60, - "unit": "per minute", - "system": "http://unitsofmeasure.org", - "code": "/min" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|695442d147cccc0c169b6748ec0359c0" - } - }, { - "fullUrl": "Observation/e5f9c86eafe6e1af1bcb9d442d9ec2ce", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/body-temperature" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.korpertemperatur_code.1-korpertemperatur_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "8310-5" - }, { - "system": "http://snomed.info/sct", - "code": "386725007" - } ], - "text": "Body temperature" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 38, - "unit": "°C", - "system": "http://unitsofmeasure.org", - "code": "Cel" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|e5f9c86eafe6e1af1bcb9d442d9ec2ce" - } - }, { - "fullUrl": "Observation/943c5d6bde4edbfad3f4621b37fba924", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/oxygen-saturation" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.periphere_sauerstoffsattigung_code.1-periphere_sauerstoffsattigung_code", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } ] - } ], - "code": { - "coding": [ { - "system": "http://loinc.org", - "code": "2708-6" - }, { - "system": "http://loinc.org", - "code": "59408-5" - }, { - "system": "http://loinc.org", - "code": "20564-1" - }, { - "system": "http://snomed.info/sct", - "code": "431314004" - } ], - "text": "Oxygen saturation in Arterial blood" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "encounter": { - "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueQuantity": { - "value": 70, - "unit": "%", - "system": "http://unitsofmeasure.org", - "code": "%" - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|943c5d6bde4edbfad3f4621b37fba924" - } - }, { - "fullUrl": "Consent/e2e78e1c85111f2d58b7185f9f6e60b4", - "resource": { - "resourceType": "Consent", - "meta": { - "profile": [ "http://fhir.de/ConsentManagement/StructureDefinition/Consent" ] - }, - "identifier": [ { - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/consentId", - "value": "1-Event.basisdaten_arm_1.1-Form.einwilligungserklaerung_mii_broad_consent.1-einwilligungserklaerung_mii_broad_consent.miibc_dat_dok.1-miibc_consent_status" - } ], - "status": "active", - "scope": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes", - "code": "research", - "display": "Research Information Access" - } ] - }, - "category": [ { - "coding": [ { - "system": "http://loinc.org", - "code": "57016-8" - } ] - } ], - "patient": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "dateTime": "2020-12-11", - "organization": [ { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } ], - "policy": [ { - "uri": "https://www.medizininformatik-initiative.de/sites/default/files/2020-04/MII_AG-Consent_Einheitlicher-Mustertext_v1.6d.pdf" - } ], - "provision": { - "type": "deny", - "period": { - "start": "2020-12-11T00:00:00+00:00", - "end": "2050-12-11T00:00:00+00:00" - }, - "provision": [ { - "type": "permit", - "period": { - "start": "2020-12-11T00:00:00+00:00", - "end": "2050-12-11T00:00:00+00:00" - }, - "code": [ { - "coding": [ { - "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", - "code": "2.16.840.1.113883.3.1937.777.24.5.1.1", - "display": "gee_erhebung_verarbeitung" - } ] - } ] - }, { - "type": "permit", - "period": { - "start": "2015-12-11T00:00:00+00:00", - "end": "2020-12-11T00:00:00+00:00" - }, - "code": [ { - "coding": [ { - "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", - "code": "2.16.840.1.113883.3.1937.777.24.5.1.7", - "display": "gee_krankenkassendaten_retro" - } ] - } ] - }, { - "type": "permit", - "period": { - "start": "2020-12-11T00:00:00+00:00", - "end": "2025-12-11T00:00:00+00:00" - }, - "code": [ { - "coding": [ { - "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", - "code": "2.16.840.1.113883.3.1937.777.24.5.1.10", - "display": "gee_krankenkassendaten_pro" - } ] - } ] - }, { - "type": "deny", - "period": { - "start": "2020-12-11T00:00:00+00:00", - "end": "2050-12-11T00:00:00+00:00" - }, - "code": [ { - "coding": [ { - "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", - "code": "2.16.840.1.113883.3.1937.777.24.5.1.14", - "display": "gee_biomaterialien" - } ] - } ] - }, { - "type": "permit", - "period": { - "start": "2020-12-11T00:00:00+00:00", - "end": "2050-12-11T00:00:00+00:00" - }, - "code": [ { - "coding": [ { - "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", - "code": "2.16.840.1.113883.3.1937.777.24.5.1.31", - "display": "gee_biomaterialien_zusaetzlich" - } ] - } ] - }, { - "type": "permit", - "period": { - "start": "2020-12-11T00:00:00+00:00", - "end": "2050-12-11T00:00:00+00:00" - }, - "code": [ { - "coding": [ { - "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", - "code": "2.16.840.1.113883.3.1937.777.24.5.1.19", - "display": "gee_kontaktaufnahme" - } ] - } ] - }, { - "type": "deny", - "period": { - "start": "2020-12-11T00:00:00+00:00", - "end": "2050-12-11T00:00:00+00:00" - }, - "code": [ { - "coding": [ { - "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", - "code": "2.16.840.1.113883.3.1937.777.24.5.1.23", - "display": "gee_kontaktaufnahme_zusatzbefunde" - } ] - } ] - } ] - } - }, - "request": { - "method": "POST", - "url": "Consent", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/consentId|e2e78e1c85111f2d58b7185f9f6e60b4" - } - }, { - "fullUrl": "Observation/093423f0996ef856f3357f1004b48ae8", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/study-inclusion-covid-19" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.basisdaten_arm_1.1-Form.studieneinschluss_einschlusskriterien.1-studieneinschluss_einschlusskriterien.covid19_aufnahme_code.1-covid19_aufnahme", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "survey", - "display": "Survey" - } ] - } ], - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "02", - "display": "Study inclusion due to Covid-19" - } ], - "text": "Confirmed Covid-19 diagnosis as main reason for enrolment in the study" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373066001" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|093423f0996ef856f3357f1004b48ae8" - } - }, { - "fullUrl": "Observation/1d82f3cb1072e66dbc76399a72608b38", - "resource": { - "resourceType": "Observation", - "meta": { - "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/interventional-clinical-trial-participation" ] - }, - "identifier": [ { - "type": { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "OBI", - "display": "Observation Instance Identifier" - } ] - }, - "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", - "value": "1-Event.basisdaten_arm_1.1-Form.studieneinschluss_einschlusskriterien.1-studieneinschluss_einschlusskriterien.interventionelle_studienteilnahme_code.1-interventionelle_studienteilnahme", - "assigner": { - "reference": "Organization/7bf3ad593927360881a2fe7425317511" - } - } ], - "status": "final", - "category": [ { - "coding": [ { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "survey", - "display": "Survey" - } ] - } ], - "code": { - "coding": [ { - "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", - "code": "03", - "display": "Participation in interventional clinical trials" - } ], - "text": "Has the patient participated in one or more interventional clinical trials?" - }, - "subject": { - "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" - }, - "_effectiveDateTime": { - "extension": [ { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "unknown" - } ] - }, - "valueCodeableConcept": { - "coding": [ { - "system": "http://snomed.info/sct", - "code": "373067005" - } ] - } - }, - "request": { - "method": "POST", - "url": "Observation", - "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|1d82f3cb1072e66dbc76399a72608b38" - } - } ] -} \ No newline at end of file diff --git a/feasibility-triangle/init-testdata.sh b/feasibility-triangle/upload-testdata.sh similarity index 100% rename from feasibility-triangle/init-testdata.sh rename to feasibility-triangle/upload-testdata.sh From 3805e3c4bf7354a39568fcbb3536a8268de5791d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 17:54:45 +0200 Subject: [PATCH 021/118] update readme with information about testdata upload --- feasibility-triangle/README.md | 4 +++- feasibility-triangle/upload-testdata.sh | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index b495d61..55ea4f9 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -132,8 +132,10 @@ For example for the FHIR Server: ssh -L 8081:127.0.0.1:8081 your-username@your-s ### Step 10 - Init Testdata (Optional) -TODO - add description of testdata initialisation here. +To initialise testdata execute the `get-mii-testdata.sh`. This will download MII core dataset conformant testdata from +unpack it and save them to the testdata folder of this repository. +You can then load the data into your FHIR Server using the `upload-testdata.sh` script. ### Configurable environment variables diff --git a/feasibility-triangle/upload-testdata.sh b/feasibility-triangle/upload-testdata.sh index e82f2f3..72a50d6 100755 --- a/feasibility-triangle/upload-testdata.sh +++ b/feasibility-triangle/upload-testdata.sh @@ -1,9 +1,10 @@ #!/usr/bin/env sh BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +FHIR_BASE_URL=${FEASIBILITY_TESTDATA_UPLOAD_FHIR_BASE_URL:-http://localhost:8081/fhir} FILES=$BASE_DIR/testdata/* for fhirBundle in $FILES; do echo "Sending Testdata bundle $fhirBundle ..." - curl -X POST -H "Content-Type: application/json" -d @$fhirBundle http://localhost:8081/fhir + curl -X POST -H "Content-Type: application/json" -d @$fhirBundle $FHIR_BASE_URL done From 00ae15c6126f66b6fc64e4e56f72cd46428a226f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 18:09:18 +0200 Subject: [PATCH 022/118] update readme --- feasibility-triangle/README.md | 3 +++ .../aktin-client/aktin-requests.log | 14 -------------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 55ea4f9..5fc9e55 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -90,6 +90,9 @@ To configure the AKTIN client in the default setup, change the following environ - FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM - FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS +If you are using AKTIN, as in the default setup you have to adjust the rights of the aktin-requests.log file to allow the AKTIN container user to write the logs as follows: +`chown 10001:10001 aktin-client/atkin-requests.log` + ### Step 8 - Start the feasibility triangle To start the triangle navigate to `/opt/feasibility-deploy/feasibility-triangle` and diff --git a/feasibility-triangle/aktin-client/aktin-requests.log b/feasibility-triangle/aktin-client/aktin-requests.log index e85d122..e69de29 100644 --- a/feasibility-triangle/aktin-client/aktin-requests.log +++ b/feasibility-triangle/aktin-client/aktin-requests.log @@ -1,14 +0,0 @@ -##### INCOMING REQUEST at Tue Apr 12 13:22:17 UTC 2022 ##### -----BEGIN REQUEST---- -{"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"gender","system":"mii.abide","display":"Geschlecht"}],"attributeFilters":[{"type":"concept","selectedConcepts":[{"code":"female","system":"http://hl7.org/fhir/administrative-gender","display":"Female"}],"attributeCode":{"code":"gender","system":"mii.abide","display":"Geschlecht"}}]}]]} -----END REQUEST---- -----BEGIN RESPONSE---- - -----END RESPONSE---- -##### INCOMING REQUEST at Tue Apr 12 13:23:18 UTC 2022 ##### -----BEGIN REQUEST---- -{"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"gender","system":"mii.abide","display":"Geschlecht"}],"attributeFilters":[{"type":"concept","selectedConcepts":[{"code":"female","system":"http://hl7.org/fhir/administrative-gender","display":"Female"}],"attributeCode":{"code":"gender","system":"mii.abide","display":"Geschlecht"}}]}]]} -----END REQUEST---- -----BEGIN RESPONSE---- -1120 -----END RESPONSE---- From 0b807694a2af79cc548084acaaa85fbfb8469221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 18:24:29 +0200 Subject: [PATCH 023/118] update readme --- feasibility-portal/README.md | 2 ++ feasibility-triangle/README.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 2369f5c..a7e8323 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -66,6 +66,7 @@ If you use the default local feasibility portal setup you will only have to chan |backend/.env|FEASIBILITY_BACKEND_DIRECT_ENABLED|true| |backend/.env|FEASIBILITY_BACKEND_API_BASE_URL|base-url-of-your-local-feasibility-portal/api| |backend/.env|FLARE_WEBSERVICE_BASE_URL|http://flare:8080| +|backend/.env|FEASIBILITY_BACKEND_ALLOWED_ORIGINS|base-url-of-your-local-feasibility-portal| For more details on the environment variables see the paragraph **Configurable environment variables** of this README. @@ -133,6 +134,7 @@ After a few moments you should see the results to your query in the **Number of |FEASIBILITY_BACKEND_API_BASE_URL|the api url of the backend. If using an nginx this url should be the url of the nginx, which forwards to the backend|https://localhost/api/||BACKEND| |FEASIBILITY_BACKEND_DIRECT_ENABLED|enables the direct broker. This connects the backend directly to flare and is only meant to be used for a local installation|false||BACKEND| |FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL|the url of the flare component the backend should connect to when using the direct broker|http://flare:8080||BACKEND| +|FEASIBILITY_BACKEND_ALLOWED_ORIGINS|base-url-of-your-local-feasibility-portal |https://localhost||BACKEND| |FEASIBILITY_BACKEND_AKTIN_ENABLED|enables the aktin broker|false||BACKEND| |FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL|aktin broker base url|http://aktin-broker:8080/broker/||BACKEND| |FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY|aktin broker admin api key. The backend needs admin access as it requires permission to post new queries to the broker|xxxApiKeyAdmin123||BACKEND| diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 5fc9e55..e3ffd23 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -91,7 +91,7 @@ To configure the AKTIN client in the default setup, change the following environ - FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS If you are using AKTIN, as in the default setup you have to adjust the rights of the aktin-requests.log file to allow the AKTIN container user to write the logs as follows: -`chown 10001:10001 aktin-client/atkin-requests.log` +`chown 10001:10001 /opt/feasibility-deploy/feasibility-triangle/aktin-client/aktin-requests.log` ### Step 8 - Start the feasibility triangle From 90ebd7ce1dfa039050877245a3a01fb3a6109047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 28 Apr 2022 18:39:04 +0200 Subject: [PATCH 024/118] update readme --- feasibility-portal/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index a7e8323..58e6b6c 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -67,12 +67,14 @@ If you use the default local feasibility portal setup you will only have to chan |backend/.env|FEASIBILITY_BACKEND_API_BASE_URL|base-url-of-your-local-feasibility-portal/api| |backend/.env|FLARE_WEBSERVICE_BASE_URL|http://flare:8080| |backend/.env|FEASIBILITY_BACKEND_ALLOWED_ORIGINS|base-url-of-your-local-feasibility-portal| +|gui/deploy-config.json|uiBackendApi > baseUrl |base-url-of-your-local-feasibility-portal/api/v1| +|gui/deploy-config.json|auth > baseUrl |base-url-of-your-local-feasibility-portal| For more details on the environment variables see the paragraph **Configurable environment variables** of this README. ### Step 7 - Start the feasibility portal -To start the portal navigate to `/opt/feasibility-deploy/feasibility-portal/start-feasibility-portal-local.sh` and +To start the portal navigate to `/opt/feasibility-deploy/feasibility-portal` and execute `bash start-feasibility-portal-local.sh`. This starts the following default local feasibility portal, with the following components: @@ -86,7 +88,7 @@ This starts the following default local feasibility portal, with the following c ### Step 8 - Configure keycloak and add a user for the user interface Navigate with your browser to https://my-fesibility-domain/auth -and log in to keyloak using the admin password set in step 6 (FEASIBILITY_KEYCLOAK_ADMIN_PW). +click on "Administration Console" and log in to keyloak using the admin password set in step 6 (FEASIBILITY_KEYCLOAK_ADMIN_PW). User: admin Pw: my password set in step 6 @@ -100,9 +102,11 @@ from from: https://feasibility.forschen-fuer-gesundheit.de to: https://your-feasibility-domain/* +Save the changes by clicking the "save" button. + 2. Add a user for to your feasibility user interface: -Click on `Users > Add User` and fill in the field **Username** with a username of your choice and add the user under **Groups** to the group **/codex-develop**. -Click on **Credentials** and type a password of your choice and confirm it. +Click on `Users > Add User` and fill in the field **Username** with a username of your choice and add the user under **Groups** to the group **/codex-develop** and save the user by clicking on `save`. +Click on **Credentials** and fill the `Password` and `Password Confirmation` fields with a password of your choice and save the changes by clicking `set password` ### Step 9 - Access the user interface and send first query From 0a843226cc1430320f57c109811edc6b59308c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 2 May 2022 16:39:10 +0200 Subject: [PATCH 025/118] portal backend set keycloak enabled = true as default --- feasibility-portal/backend/.env.default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index 7e6b778..7fed5f0 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -3,7 +3,7 @@ FEASIBILITY_BACKEND_DATASOURCE_HOST=feasibility-gui-backend-db FEASIBILITY_BACKEND_DATASOURCE_PORT=5432 FEASIBILITY_BACKEND_DATASOURCE_USERNAME=guidbuser FEASIBILITY_BACKEND_DATASOURCE_PASSWORD=guidbpw -FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=false +FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=true FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://keycloak:8080 FEASIBILITY_BACKEND_KEYCLOAK_REALM=codex-develop From 19a6e21172aebef74996d243c3496592ced8d867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 18 May 2022 15:26:08 +0200 Subject: [PATCH 026/118] update backend and gui version to new releases --- feasibility-portal/backend/docker-compose.yml | 2 +- feasibility-portal/gui/deploy-config.json.default | 9 ++++++--- feasibility-portal/gui/docker-compose.yml | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 71aec36..766cfb5 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:1.0.5-rc4 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.0.0-rc1 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: diff --git a/feasibility-portal/gui/deploy-config.json.default b/feasibility-portal/gui/deploy-config.json.default index 85f8f18..e3dd921 100644 --- a/feasibility-portal/gui/deploy-config.json.default +++ b/feasibility-portal/gui/deploy-config.json.default @@ -11,7 +11,8 @@ "auth": { "baseUrl": "https://localhost", "realm": "codex-develop", - "clientId": "feasibility-gui" + "clientId": "feasibility-gui", + "roles": ["CODEX_USER"] }, "legal": { "version": "0.9.0", @@ -26,7 +27,8 @@ }, "extra": { "displayvaluefiltericon": false, - "showoptionspage": false + "showoptionspage": false, + "optionpageroles": ["CODEX_USER"] } }, "options": { @@ -38,7 +40,8 @@ "mock": { "terminology": false, "query": false, - "result": false + "result": false, + "loadnsave": false }, "stylesheet": "abideTheme", "fhirport": "8082", diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 67de75f..90e76e7 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.2.0_RC11 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.2.0_RC12 ports: - "443:8443" restart: unless-stopped From 345ca091a445519fc395733c45b1c09ff302a5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 19 May 2022 12:21:01 +0200 Subject: [PATCH 027/118] fix backend docker-compose file env vars --- feasibility-portal/backend/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 766cfb5..385a70d 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -14,8 +14,8 @@ services: FEASIBILITY_DATABASE_PASSWORD: ${FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-guidbpw} BROKER_CLIENT_TYPE: ${FEASIBILITY_BACKEND_BROKER_CLIENT_TYPE:-AKTIN} KEYCLOAK_ENABLED: ${FEASIBILITY_BACKEND_KEYCLOAK_ENABLED:-true} - KEYCLOAK_ALLOWED_ROLE: ${KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} - KEYCLOAK_BASE_URL: ${FEASIBILITY_BACKEND_FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} + KEYCLOAK_ALLOWED_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} + KEYCLOAK_BASE_URL: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} KEYCLOAK_REALM: ${FEASIBILITY_BACKEND_KEYCLOAK_REALM:-codex-develop} KEYCLOAK_CLIENT_ID: ${FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID:-feasibility-gui} CQL_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED:-true} From bd14919454ab3eda5a4f5e153ca99626fd9daacf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 7 Jul 2022 13:16:40 +0200 Subject: [PATCH 028/118] update keycloak and env files to reflect generalised MII repo --- feasibility-portal/backend/.env.default | 4 +- .../gui/deploy-config.json.default | 8 +- .../keycloak/init/initial-realm-prod.json | 4698 +++++++---------- 3 files changed, 1802 insertions(+), 2908 deletions(-) diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index 7fed5f0..626c5e4 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -5,8 +5,8 @@ FEASIBILITY_BACKEND_DATASOURCE_USERNAME=guidbuser FEASIBILITY_BACKEND_DATASOURCE_PASSWORD=guidbpw FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=true FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER -FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://keycloak:8080 -FEASIBILITY_BACKEND_KEYCLOAK_REALM=codex-develop +FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://auth:8080 +FEASIBILITY_BACKEND_KEYCLOAK_REALM=feasibility FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID=feasibility-gui FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=false FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED=false diff --git a/feasibility-portal/gui/deploy-config.json.default b/feasibility-portal/gui/deploy-config.json.default index e3dd921..46d0d97 100644 --- a/feasibility-portal/gui/deploy-config.json.default +++ b/feasibility-portal/gui/deploy-config.json.default @@ -10,13 +10,13 @@ }, "auth": { "baseUrl": "https://localhost", - "realm": "codex-develop", + "realm": "feasibility", "clientId": "feasibility-gui", - "roles": ["CODEX_USER"] + "roles": ["FEASIBILITY_USER"] }, "legal": { "version": "0.9.0", - "copyrightOwner": "CODEX Team" + "copyrightOwner": "MII Team" }, "features": { "v2": { @@ -28,7 +28,7 @@ "extra": { "displayvaluefiltericon": false, "showoptionspage": false, - "optionpageroles": ["CODEX_USER"] + "optionpageroles": ["FEASIBILITY_USER"] } }, "options": { diff --git a/feasibility-portal/keycloak/init/initial-realm-prod.json b/feasibility-portal/keycloak/init/initial-realm-prod.json index 04297f4..5ea86b9 100644 --- a/feasibility-portal/keycloak/init/initial-realm-prod.json +++ b/feasibility-portal/keycloak/init/initial-realm-prod.json @@ -1,2904 +1,1798 @@ { -"id": "codex-develop", -"realm": "codex-develop", -"displayName": "codex develop realm", -"notBefore": 0, -"defaultSignatureAlgorithm": "RS256", -"revokeRefreshToken": false, -"refreshTokenMaxReuse": 0, -"accessTokenLifespan": 300, -"accessTokenLifespanForImplicitFlow": 900, -"ssoSessionIdleTimeout": 1800, -"ssoSessionMaxLifespan": 36000, -"ssoSessionIdleTimeoutRememberMe": 0, -"ssoSessionMaxLifespanRememberMe": 0, -"offlineSessionIdleTimeout": 2592000, -"offlineSessionMaxLifespanEnabled": false, -"offlineSessionMaxLifespan": 5184000, -"clientSessionIdleTimeout": 0, -"clientSessionMaxLifespan": 0, -"clientOfflineSessionIdleTimeout": 0, -"clientOfflineSessionMaxLifespan": 0, -"accessCodeLifespan": 60, -"accessCodeLifespanUserAction": 300, -"accessCodeLifespanLogin": 1800, -"actionTokenGeneratedByAdminLifespan": 43200, -"actionTokenGeneratedByUserLifespan": 300, -"oauth2DeviceCodeLifespan": 600, -"oauth2DevicePollingInterval": 5, -"enabled": true, -"sslRequired": "external", -"registrationAllowed": false, -"registrationEmailAsUsername": false, -"rememberMe": false, -"verifyEmail": false, -"loginWithEmailAllowed": true, -"duplicateEmailsAllowed": false, -"resetPasswordAllowed": false, -"editUsernameAllowed": false, -"bruteForceProtected": true, -"permanentLockout": false, -"maxFailureWaitSeconds": 900, -"minimumQuickLoginWaitSeconds": 60, -"waitIncrementSeconds": 60, -"quickLoginCheckMilliSeconds": 1000, -"maxDeltaTimeSeconds": 43200, -"failureFactor": 30, -"roles": { -"realm": [ -{ -"id": "234d9488-fd72-47ff-aaaa-9182cf4e9c94", -"name": "CODEX_USER", -"description": "this is for development purposes only and allows full access to all features", -"composite": false, -"clientRole": false, -"containerId": "codex-develop", -"attributes": {} -}, -{ -"id": "7d988f33-e10a-437c-9470-fa817fce27fd", -"name": "default-roles-codex-develop", -"description": "${role_default-roles}", -"composite": true, -"composites": { -"realm": [ -"offline_access", -"uma_authorization" -], -"client": { -"account": [ -"view-profile", -"manage-account" -] -} -}, -"clientRole": false, -"containerId": "codex-develop", -"attributes": {} -}, -{ -"id": "2115205d-7d9d-4588-ba58-c7119f5cadb8", -"name": "uma_authorization", -"description": "${role_uma_authorization}", -"composite": false, -"clientRole": false, -"containerId": "codex-develop", -"attributes": {} -}, -{ -"id": "7575186c-ee41-492b-8c2c-a3046a28baaa", -"name": "offline_access", -"description": "${role_offline-access}", -"composite": false, -"clientRole": false, -"containerId": "codex-develop", -"attributes": {} -} -], -"client": { -"diz-ukf": [], -"realm-management": [ -{ -"id": "6ef2f4a0-e69f-48e2-ade5-789867a1f506", -"name": "create-client", -"description": "${role_create-client}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "06bce4fa-6063-4f40-b07f-57bf13ac02d6", -"name": "view-events", -"description": "${role_view-events}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "d3a727f9-dc79-43e0-8538-f503472a981c", -"name": "manage-events", -"description": "${role_manage-events}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "620cec8e-9472-49a6-9c87-0d38cb612ce6", -"name": "manage-realm", -"description": "${role_manage-realm}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "041baff5-7dba-4610-ac57-cbe6e322c5ee", -"name": "query-groups", -"description": "${role_query-groups}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "ded66799-c4cc-40eb-a41c-6664f737133a", -"name": "view-realm", -"description": "${role_view-realm}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "7bc76c46-fa6d-4865-8de6-541d9c5cf3be", -"name": "manage-authorization", -"description": "${role_manage-authorization}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "49a92e81-0540-47e0-bb65-d53439ed033d", -"name": "manage-identity-providers", -"description": "${role_manage-identity-providers}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "ea9b2dfb-3b8f-4091-8b21-b93cbf468e76", -"name": "impersonation", -"description": "${role_impersonation}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "cae8e208-6dd0-48d7-b576-1b74ee2325dc", -"name": "view-users", -"description": "${role_view-users}", -"composite": true, -"composites": { -"client": { -"realm-management": [ -"query-users", -"query-groups" -] -} -}, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "e22e2a6d-2095-4491-a7a5-fa851a260f8a", -"name": "manage-users", -"description": "${role_manage-users}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "0d64002a-678e-4edf-afb5-164b01e583ce", -"name": "query-users", -"description": "${role_query-users}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "f67c03c2-940a-4dc7-94b1-c3b02c879cc8", -"name": "view-identity-providers", -"description": "${role_view-identity-providers}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "5d80b412-33f2-4829-bf93-654a3a1d4729", -"name": "query-realms", -"description": "${role_query-realms}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "1432e629-14a9-4cd5-a7e8-eb2604596bca", -"name": "query-clients", -"description": "${role_query-clients}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "b1f9fa5d-6c81-462c-b057-84e95428afc1", -"name": "manage-clients", -"description": "${role_manage-clients}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "b469f4e7-4488-4562-969f-a00e4d27a6af", -"name": "realm-admin", -"description": "${role_realm-admin}", -"composite": true, -"composites": { -"client": { -"realm-management": [ -"create-client", -"view-events", -"manage-events", -"manage-realm", -"query-groups", -"view-realm", -"manage-authorization", -"manage-identity-providers", -"impersonation", -"view-users", -"manage-users", -"query-users", -"view-identity-providers", -"query-realms", -"query-clients", -"manage-clients", -"view-authorization", -"view-clients" -] -} -}, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "39334f25-7fac-4535-b37b-45bd4b9e30ca", -"name": "view-authorization", -"description": "${role_view-authorization}", -"composite": false, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -}, -{ -"id": "53d2e35b-1391-455a-89dc-f91566062994", -"name": "view-clients", -"description": "${role_view-clients}", -"composite": true, -"composites": { -"client": { -"realm-management": [ -"query-clients" -] -} -}, -"clientRole": true, -"containerId": "97968df9-46f9-4444-9863-e200f600bc7b", -"attributes": {} -} -], -"diz-umm": [], -"feasibility-gui": [], -"security-admin-console": [], -"diz-uker": [], -"admin-cli": [], -"middleware-broker": [], -"diz-uka": [], -"account-console": [], -"broker": [ -{ -"id": "bd3f8312-52f1-4bc9-b708-152285b87b94", -"name": "read-token", -"description": "${role_read-token}", -"composite": false, -"clientRole": true, -"containerId": "f3955d64-565f-46c3-bf0d-2e8a9716e504", -"attributes": {} -} -], -"account": [ -{ -"id": "c078d5c6-80bc-4811-b31a-24f54216d22b", -"name": "delete-account", -"description": "${role_delete-account}", -"composite": false, -"clientRole": true, -"containerId": "58de4034-0047-40f4-a0c7-7d746cd19d72", -"attributes": {} -}, -{ -"id": "3b4e41be-e77d-4a7a-a82a-90a064c0b3ed", -"name": "manage-consent", -"description": "${role_manage-consent}", -"composite": true, -"composites": { -"client": { -"account": [ -"view-consent" -] -} -}, -"clientRole": true, -"containerId": "58de4034-0047-40f4-a0c7-7d746cd19d72", -"attributes": {} -}, -{ -"id": "f45d884b-1c5a-44bb-b617-1fc59ad30ff2", -"name": "view-applications", -"description": "${role_view-applications}", -"composite": false, -"clientRole": true, -"containerId": "58de4034-0047-40f4-a0c7-7d746cd19d72", -"attributes": {} -}, -{ -"id": "a69ead20-97b1-47ac-b3e1-ac89d180802b", -"name": "view-profile", -"description": "${role_view-profile}", -"composite": false, -"clientRole": true, -"containerId": "58de4034-0047-40f4-a0c7-7d746cd19d72", -"attributes": {} -}, -{ -"id": "25cc13e9-4b87-40c0-b894-4ff14a760581", -"name": "manage-account-links", -"description": "${role_manage-account-links}", -"composite": false, -"clientRole": true, -"containerId": "58de4034-0047-40f4-a0c7-7d746cd19d72", -"attributes": {} -}, -{ -"id": "173548bf-ff7b-49a4-99f2-be38c0be0453", -"name": "manage-account", -"description": "${role_manage-account}", -"composite": true, -"composites": { -"client": { -"account": [ -"manage-account-links" -] -} -}, -"clientRole": true, -"containerId": "58de4034-0047-40f4-a0c7-7d746cd19d72", -"attributes": {} -}, -{ -"id": "93c6eaad-2278-4617-8ac2-b9838a4fc8a6", -"name": "view-consent", -"description": "${role_view-consent}", -"composite": false, -"clientRole": true, -"containerId": "58de4034-0047-40f4-a0c7-7d746cd19d72", -"attributes": {} -} -] -} -}, -"groups": [ -{ -"id": "cce70ab0-7355-4210-baf7-93d07343f852", -"name": "codex-develop", -"path": "/codex-develop", -"attributes": {}, -"realmRoles": [ -"CODEX_USER" -], -"clientRoles": {}, -"subGroups": [] -} -], -"defaultRole": { -"id": "7d988f33-e10a-437c-9470-fa817fce27fd", -"name": "default-roles-codex-develop", -"description": "${role_default-roles}", -"composite": true, -"clientRole": false, -"containerId": "codex-develop" -}, -"requiredCredentials": [ -"password" -], -"otpPolicyType": "totp", -"otpPolicyAlgorithm": "HmacSHA1", -"otpPolicyInitialCounter": 0, -"otpPolicyDigits": 6, -"otpPolicyLookAheadWindow": 1, -"otpPolicyPeriod": 30, -"otpSupportedApplications": [ -"FreeOTP", -"Google Authenticator" -], -"webAuthnPolicyRpEntityName": "keycloak", -"webAuthnPolicySignatureAlgorithms": [ -"ES256" -], -"webAuthnPolicyRpId": "", -"webAuthnPolicyAttestationConveyancePreference": "not specified", -"webAuthnPolicyAuthenticatorAttachment": "not specified", -"webAuthnPolicyRequireResidentKey": "not specified", -"webAuthnPolicyUserVerificationRequirement": "not specified", -"webAuthnPolicyCreateTimeout": 0, -"webAuthnPolicyAvoidSameAuthenticatorRegister": false, -"webAuthnPolicyAcceptableAaguids": [], -"webAuthnPolicyPasswordlessRpEntityName": "keycloak", -"webAuthnPolicyPasswordlessSignatureAlgorithms": [ -"ES256" -], -"webAuthnPolicyPasswordlessRpId": "", -"webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified", -"webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified", -"webAuthnPolicyPasswordlessRequireResidentKey": "not specified", -"webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified", -"webAuthnPolicyPasswordlessCreateTimeout": 0, -"webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false, -"webAuthnPolicyPasswordlessAcceptableAaguids": [], -"users": [ -{ -"id": "e110ea20-bb3f-439f-b17e-40b4f378c366", -"createdTimestamp": 1611754418555, -"username": "service-account-diz-uka", -"enabled": true, -"totp": false, -"emailVerified": false, -"serviceAccountClientId": "diz-uka", -"disableableCredentialTypes": [], -"requiredActions": [], -"realmRoles": [ -"uma_authorization", -"offline_access" -], -"clientRoles": { -"account": [ -"view-profile", -"manage-account" -] -}, -"notBefore": 0, -"groups": [] -}, -{ -"id": "e1d5f479-21fb-4838-b79b-1138f283ac9f", -"createdTimestamp": 1611752991562, -"username": "service-account-diz-uker", -"enabled": true, -"totp": false, -"emailVerified": false, -"serviceAccountClientId": "diz-uker", -"disableableCredentialTypes": [], -"requiredActions": [], -"realmRoles": [ -"uma_authorization", -"offline_access" -], -"clientRoles": { -"account": [ -"view-profile", -"manage-account" -] -}, -"notBefore": 0, -"groups": [] -}, -{ -"id": "e9cf9ac9-7894-4e34-a9b5-242a8fdc4a2f", -"createdTimestamp": 1611750913052, -"username": "service-account-diz-ukf", -"enabled": true, -"totp": false, -"emailVerified": false, -"serviceAccountClientId": "diz-ukf", -"disableableCredentialTypes": [], -"requiredActions": [], -"realmRoles": [ -"uma_authorization", -"offline_access" -], -"clientRoles": { -"account": [ -"view-profile", -"manage-account" -] -}, -"notBefore": 0, -"groups": [] -}, -{ -"id": "b9235783-d5ad-4f0b-ab0b-b99c21d0106a", -"createdTimestamp": 1611755169205, -"username": "service-account-diz-umm", -"enabled": true, -"totp": false, -"emailVerified": false, -"serviceAccountClientId": "diz-umm", -"disableableCredentialTypes": [], -"requiredActions": [], -"realmRoles": [ -"uma_authorization", -"offline_access" -], -"clientRoles": { -"account": [ -"view-profile", -"manage-account" -] -}, -"notBefore": 0, -"groups": [] -} -], -"scopeMappings": [ -{ -"client": "feasibility-gui", -"roles": [ -"CODEX_USER" -] -}, -{ -"clientScope": "offline_access", -"roles": [ -"offline_access" -] -} -], -"clientScopeMappings": { -"account": [ -{ -"client": "account-console", -"roles": [ -"manage-account" -] -} -] -}, -"clients": [ -{ -"id": "58de4034-0047-40f4-a0c7-7d746cd19d72", -"clientId": "account", -"name": "${client_account}", -"rootUrl": "${authBaseUrl}", -"baseUrl": "/realms/codex-develop/account/", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [ -"/realms/codex-develop/account/*" -], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": true, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": false, -"publicClient": false, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": {}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": false, -"nodeReRegistrationTimeout": 0, -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "3787bcaa-e3cf-47fc-a103-01bad3079cfd", -"clientId": "account-console", -"name": "${client_account-console}", -"rootUrl": "${authBaseUrl}", -"baseUrl": "/realms/codex-develop/account/", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [ -"/realms/codex-develop/account/*" -], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": true, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": false, -"publicClient": true, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": { -"pkce.code.challenge.method": "S256" -}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": false, -"nodeReRegistrationTimeout": 0, -"protocolMappers": [ -{ -"id": "f2c4a481-3653-4873-b2d8-9f43a010c7d3", -"name": "audience resolve", -"protocol": "openid-connect", -"protocolMapper": "oidc-audience-resolve-mapper", -"consentRequired": false, -"config": {} -} -], -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "104a7fea-42b6-494f-b1c0-0e6bd39e80e2", -"clientId": "admin-cli", -"name": "${client_admin-cli}", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": false, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": true, -"serviceAccountsEnabled": false, -"publicClient": true, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": {}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": false, -"nodeReRegistrationTimeout": 0, -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "f3955d64-565f-46c3-bf0d-2e8a9716e504", -"clientId": "broker", -"name": "${client_broker}", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": true, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": false, -"publicClient": false, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": {}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": false, -"nodeReRegistrationTimeout": 0, -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "a990ffc5-3853-4911-aa0b-2e67acc67654", -"clientId": "diz-uka", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [ -"*" -], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": false, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": true, -"publicClient": false, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": { -"saml.assertion.signature": "false", -"saml.force.post.binding": "false", -"saml.multivalued.roles": "false", -"saml.encrypt": "false", -"backchannel.logout.revoke.offline.tokens": "false", -"saml.server.signature": "false", -"saml.server.signature.keyinfo.ext": "false", -"exclude.session.state.from.auth.response": "false", -"backchannel.logout.session.required": "true", -"client_credentials.use_refresh_token": "false", -"saml_force_name_id_format": "false", -"saml.client.signature": "false", -"tls.client.certificate.bound.access.tokens": "false", -"saml.authnstatement": "false", -"display.on.consent.screen": "false", -"saml.onetimeuse.condition": "false" -}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": true, -"nodeReRegistrationTimeout": -1, -"protocolMappers": [ -{ -"id": "9ad40dc2-7d2f-4bcb-aff8-87b102683d59", -"name": "Client ID", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientId", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientId", -"jsonType.label": "String" -} -}, -{ -"id": "6d38235d-b875-4230-88b4-0a1fd85e2e3f", -"name": "Client IP Address", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientAddress", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientAddress", -"jsonType.label": "String" -} -}, -{ -"id": "db753d17-d132-4149-a728-12f98ff681a1", -"name": "site-id", -"protocol": "openid-connect", -"protocolMapper": "oidc-hardcoded-claim-mapper", -"consentRequired": false, -"config": { -"claim.value": "uka", -"userinfo.token.claim": "false", -"id.token.claim": "false", -"access.token.claim": "true", -"claim.name": "site-id", -"jsonType.label": "String", -"access.tokenResponse.claim": "false" -} -}, -{ -"id": "bffce946-42d7-4c80-909f-f7577efafe1f", -"name": "site-name", -"protocol": "openid-connect", -"protocolMapper": "oidc-hardcoded-claim-mapper", -"consentRequired": false, -"config": { -"claim.value": "Universitätsklinikum Aachen", -"userinfo.token.claim": "false", -"id.token.claim": "false", -"access.token.claim": "true", -"claim.name": "site-name", -"jsonType.label": "String", -"access.tokenResponse.claim": "false" -} -}, -{ -"id": "f893aae2-ee23-4536-97c1-7fbe41d8a69d", -"name": "Client Host", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientHost", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientHost", -"jsonType.label": "String" -} -} -], -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "b7c8fb32-3b2c-4b68-ac16-3dd7fd52c0db", -"clientId": "diz-uker", -"name": "DIZ Klinikum Erlangen", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [ -"*" -], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": true, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": true, -"publicClient": false, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": { -"saml.assertion.signature": "false", -"saml.force.post.binding": "false", -"saml.multivalued.roles": "false", -"saml.encrypt": "false", -"backchannel.logout.revoke.offline.tokens": "false", -"saml.server.signature": "false", -"saml.server.signature.keyinfo.ext": "false", -"exclude.session.state.from.auth.response": "false", -"backchannel.logout.session.required": "true", -"client_credentials.use_refresh_token": "false", -"saml_force_name_id_format": "false", -"saml.client.signature": "false", -"tls.client.certificate.bound.access.tokens": "false", -"saml.authnstatement": "false", -"display.on.consent.screen": "false", -"saml.onetimeuse.condition": "false" -}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": true, -"nodeReRegistrationTimeout": -1, -"protocolMappers": [ -{ -"id": "7d24f353-3c53-4999-a751-9fd4e68af32b", -"name": "Client Host", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientHost", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientHost", -"jsonType.label": "String" -} -}, -{ -"id": "d824e8bd-4575-4ec0-987b-781eea1eb344", -"name": "site-name", -"protocol": "openid-connect", -"protocolMapper": "oidc-hardcoded-claim-mapper", -"consentRequired": false, -"config": { -"claim.value": "Universitätsklinikum Erlangen", -"userinfo.token.claim": "false", -"id.token.claim": "false", -"access.token.claim": "true", -"claim.name": "site-name", -"jsonType.label": "String", -"access.tokenResponse.claim": "false" -} -}, -{ -"id": "a36c9375-c3cc-478a-b346-688c3e1ecf39", -"name": "Client ID", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientId", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientId", -"jsonType.label": "String" -} -}, -{ -"id": "8702c166-1c0f-4a4b-a547-a596a4fb604c", -"name": "Client IP Address", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientAddress", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientAddress", -"jsonType.label": "String" -} -}, -{ -"id": "97b2a224-abda-478b-9a5c-52e3c80275ce", -"name": "site-id", -"protocol": "openid-connect", -"protocolMapper": "oidc-hardcoded-claim-mapper", -"consentRequired": false, -"config": { -"claim.value": "uker", -"userinfo.token.claim": "false", -"id.token.claim": "false", -"access.token.claim": "true", -"claim.name": "site-id", -"jsonType.label": "String", -"access.tokenResponse.claim": "false" -} -} -], -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "7023c077-3b12-4b6e-848f-b9daaee8559b", -"clientId": "diz-ukf", -"name": "Diz Klinikum Frankfurt", -"description": "", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [ -"*" -], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": true, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": true, -"publicClient": false, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": { -"saml.assertion.signature": "false", -"saml.force.post.binding": "false", -"saml.multivalued.roles": "false", -"saml.encrypt": "false", -"backchannel.logout.revoke.offline.tokens": "false", -"saml.server.signature": "false", -"saml.server.signature.keyinfo.ext": "false", -"exclude.session.state.from.auth.response": "false", -"backchannel.logout.session.required": "true", -"client_credentials.use_refresh_token": "false", -"saml_force_name_id_format": "false", -"saml.client.signature": "false", -"tls.client.certificate.bound.access.tokens": "false", -"saml.authnstatement": "false", -"display.on.consent.screen": "false", -"saml.onetimeuse.condition": "false" -}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": true, -"nodeReRegistrationTimeout": -1, -"protocolMappers": [ -{ -"id": "6cfd2eea-3e6c-46aa-ae47-21f4a826b718", -"name": "Client IP Address", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientAddress", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientAddress", -"jsonType.label": "String" -} -}, -{ -"id": "9709abf0-bfd3-41a2-9750-b7216026cb08", -"name": "Client Host", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientHost", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientHost", -"jsonType.label": "String" -} -}, -{ -"id": "579c084e-d066-4032-9d03-a1ad7612f182", -"name": "site name", -"protocol": "openid-connect", -"protocolMapper": "oidc-hardcoded-claim-mapper", -"consentRequired": false, -"config": { -"claim.value": "Universitätsklinikum Frankfurt", -"userinfo.token.claim": "false", -"id.token.claim": "false", -"access.token.claim": "true", -"claim.name": "site-name", -"jsonType.label": "String", -"access.tokenResponse.claim": "false" -} -}, -{ -"id": "16ba2d6b-5160-4796-8d2f-dd854673c286", -"name": "Client ID", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientId", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientId", -"jsonType.label": "String" -} -}, -{ -"id": "89c4bd1c-f496-4f3f-a326-f25d50577ec9", -"name": "site-claim", -"protocol": "openid-connect", -"protocolMapper": "oidc-hardcoded-claim-mapper", -"consentRequired": false, -"config": { -"claim.value": "ukf", -"userinfo.token.claim": "false", -"id.token.claim": "false", -"access.token.claim": "true", -"claim.name": "site-id", -"jsonType.label": "String", -"access.tokenResponse.claim": "false" -} -} -], -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "e0f89ff0-dc21-42df-a34f-f6534cc63546", -"clientId": "diz-umm", -"name": "Diz Klinikum Mannheim", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [ -"*" -], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": false, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": true, -"publicClient": false, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": { -"saml.assertion.signature": "false", -"saml.force.post.binding": "false", -"saml.multivalued.roles": "false", -"saml.encrypt": "false", -"backchannel.logout.revoke.offline.tokens": "false", -"saml.server.signature": "false", -"saml.server.signature.keyinfo.ext": "false", -"exclude.session.state.from.auth.response": "false", -"backchannel.logout.session.required": "true", -"client_credentials.use_refresh_token": "false", -"saml_force_name_id_format": "false", -"saml.client.signature": "false", -"tls.client.certificate.bound.access.tokens": "false", -"saml.authnstatement": "false", -"display.on.consent.screen": "false", -"saml.onetimeuse.condition": "false" -}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": true, -"nodeReRegistrationTimeout": -1, -"protocolMappers": [ -{ -"id": "1b5eb35f-8e3c-451c-82dd-3814822d976c", -"name": "Client Host", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientHost", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientHost", -"jsonType.label": "String" -} -}, -{ -"id": "286b9ab7-1852-4a90-9fec-604d838d0105", -"name": "site-name", -"protocol": "openid-connect", -"protocolMapper": "oidc-hardcoded-claim-mapper", -"consentRequired": false, -"config": { -"claim.value": "Universitätsklinikum Mannheim", -"userinfo.token.claim": "false", -"id.token.claim": "false", -"access.token.claim": "true", -"claim.name": "site-name", -"jsonType.label": "String", -"access.tokenResponse.claim": "false" -} -}, -{ -"id": "d40ef512-9416-437e-8d81-aab76d709cd0", -"name": "Client IP Address", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientAddress", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientAddress", -"jsonType.label": "String" -} -}, -{ -"id": "b1a7d22a-d62c-4c27-ba4e-3f583f93b810", -"name": "site-id", -"protocol": "openid-connect", -"protocolMapper": "oidc-hardcoded-claim-mapper", -"consentRequired": false, -"config": { -"claim.value": "umm", -"userinfo.token.claim": "false", -"id.token.claim": "false", -"access.token.claim": "true", -"claim.name": "site-id", -"jsonType.label": "String", -"access.tokenResponse.claim": "false" -} -}, -{ -"id": "0c5e5ea6-dea8-4e08-9784-e8bfc3570877", -"name": "Client ID", -"protocol": "openid-connect", -"protocolMapper": "oidc-usersessionmodel-note-mapper", -"consentRequired": false, -"config": { -"user.session.note": "clientId", -"userinfo.token.claim": "true", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "clientId", -"jsonType.label": "String" -} -} -], -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "d2b31de6-0333-468a-a104-2ff8f759d786", -"clientId": "feasibility-gui", -"name": "feasibility gui", -"rootUrl": "https://feasibility.forschen-fuer-gesundheit.de", -"baseUrl": "https://feasibility.forschen-fuer-gesundheit.de", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"redirectUris": [ -"https://feasibility.forschen-fuer-gesundheit.de" -], -"webOrigins": [ -"https://feasibility.forschen-fuer-gesundheit.de" -], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": true, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": true, -"serviceAccountsEnabled": false, -"publicClient": true, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": { -"saml.assertion.signature": "false", -"id.token.as.detached.signature": "false", -"saml.force.post.binding": "false", -"saml.multivalued.roles": "false", -"saml.encrypt": "false", -"oauth2.device.authorization.grant.enabled": "false", -"backchannel.logout.revoke.offline.tokens": "false", -"saml.server.signature": "false", -"saml.server.signature.keyinfo.ext": "false", -"use.refresh.tokens": "true", -"exclude.session.state.from.auth.response": "false", -"oidc.ciba.grant.enabled": "false", -"saml.artifact.binding": "false", -"backchannel.logout.session.required": "true", -"client_credentials.use_refresh_token": "false", -"saml_force_name_id_format": "false", -"saml.client.signature": "false", -"tls.client.certificate.bound.access.tokens": "false", -"require.pushed.authorization.requests": "false", -"saml.authnstatement": "false", -"display.on.consent.screen": "false", -"saml.onetimeuse.condition": "false" -}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": true, -"nodeReRegistrationTimeout": -1, -"protocolMappers": [ -{ -"id": "3c9dc1e7-63c0-4d5f-add7-a0e4443999c7", -"name": "groups", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-realm-role-mapper", -"consentRequired": false, -"config": { -"multivalued": "true", -"userinfo.token.claim": "true", -"user.attribute": "foo", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "groups", -"jsonType.label": "String" -} -} -], -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "57f9233c-e17b-4dc1-ba97-13c52ef341f4", -"clientId": "middleware-broker", -"name": "Middleware Broker", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [ -"*" -], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": false, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": false, -"publicClient": false, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": { -"saml.assertion.signature": "false", -"saml.force.post.binding": "false", -"saml.multivalued.roles": "false", -"saml.encrypt": "false", -"backchannel.logout.revoke.offline.tokens": "false", -"saml.server.signature": "false", -"saml.server.signature.keyinfo.ext": "false", -"exclude.session.state.from.auth.response": "false", -"backchannel.logout.session.required": "true", -"client_credentials.use_refresh_token": "false", -"saml_force_name_id_format": "false", -"saml.client.signature": "false", -"tls.client.certificate.bound.access.tokens": "false", -"saml.authnstatement": "false", -"display.on.consent.screen": "false", -"saml.onetimeuse.condition": "false" -}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": true, -"nodeReRegistrationTimeout": -1, -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "97968df9-46f9-4444-9863-e200f600bc7b", -"clientId": "realm-management", -"name": "${client_realm-management}", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [], -"webOrigins": [], -"notBefore": 0, -"bearerOnly": true, -"consentRequired": false, -"standardFlowEnabled": true, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": false, -"publicClient": false, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": {}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": false, -"nodeReRegistrationTimeout": 0, -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -}, -{ -"id": "cdd22346-0e4a-449b-879f-d9ba7b90e12c", -"clientId": "security-admin-console", -"name": "${client_security-admin-console}", -"rootUrl": "${authAdminUrl}", -"baseUrl": "/admin/codex-develop/console/", -"surrogateAuthRequired": false, -"enabled": true, -"alwaysDisplayInConsole": false, -"clientAuthenticatorType": "client-secret", -"secret": "**********", -"redirectUris": [ -"/admin/codex-develop/console/*" -], -"webOrigins": [ -"+" -], -"notBefore": 0, -"bearerOnly": false, -"consentRequired": false, -"standardFlowEnabled": true, -"implicitFlowEnabled": false, -"directAccessGrantsEnabled": false, -"serviceAccountsEnabled": false, -"publicClient": true, -"frontchannelLogout": false, -"protocol": "openid-connect", -"attributes": { -"pkce.code.challenge.method": "S256" -}, -"authenticationFlowBindingOverrides": {}, -"fullScopeAllowed": false, -"nodeReRegistrationTimeout": 0, -"protocolMappers": [ -{ -"id": "5dce29d4-cbb8-4936-b847-8581717e98e8", -"name": "locale", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "locale", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "locale", -"jsonType.label": "String" -} -} -], -"defaultClientScopes": [ -"web-origins", -"roles", -"profile", -"email" -], -"optionalClientScopes": [ -"address", -"phone", -"offline_access", -"microprofile-jwt" -] -} -], -"clientScopes": [ -{ -"id": "ddc37a1c-c9f0-4a65-8df4-aa4734d3eab0", -"name": "role_list", -"description": "SAML role list", -"protocol": "saml", -"attributes": { -"consent.screen.text": "${samlRoleListScopeConsentText}", -"display.on.consent.screen": "true" -}, -"protocolMappers": [ -{ -"id": "4f09c2b1-6fa3-4139-9ead-d117cc8f837a", -"name": "role list", -"protocol": "saml", -"protocolMapper": "saml-role-list-mapper", -"consentRequired": false, -"config": { -"single": "false", -"attribute.nameformat": "Basic", -"attribute.name": "Role" -} -} -] -}, -{ -"id": "fc03e27c-af69-4555-ac90-0f798a13d662", -"name": "offline_access", -"description": "OpenID Connect built-in scope: offline_access", -"protocol": "openid-connect", -"attributes": { -"consent.screen.text": "${offlineAccessScopeConsentText}", -"display.on.consent.screen": "true" -} -}, -{ -"id": "aa7a47ca-fb6c-4e68-a958-e2c7c0df4cb6", -"name": "microprofile-jwt", -"description": "Microprofile - JWT built-in scope", -"protocol": "openid-connect", -"attributes": { -"include.in.token.scope": "true", -"display.on.consent.screen": "false" -}, -"protocolMappers": [ -{ -"id": "e914b43f-8809-44b9-a263-d833a4abbb0a", -"name": "upn", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-property-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "username", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "upn", -"jsonType.label": "String" -} -}, -{ -"id": "ac2e9505-f796-4086-8d49-d6fc112c3af6", -"name": "groups", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-realm-role-mapper", -"consentRequired": false, -"config": { -"multivalued": "true", -"userinfo.token.claim": "true", -"user.attribute": "foo", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "groups", -"jsonType.label": "String" -} -} -] -}, -{ -"id": "66979aa9-f8b2-4849-8047-c5c514b0894d", -"name": "roles", -"description": "OpenID Connect scope for add user roles to the access token", -"protocol": "openid-connect", -"attributes": { -"include.in.token.scope": "false", -"display.on.consent.screen": "true", -"consent.screen.text": "${rolesScopeConsentText}" -}, -"protocolMappers": [ -{ -"id": "b9d4c8ed-8349-4036-a316-f5da88e1affd", -"name": "realm roles", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-realm-role-mapper", -"consentRequired": false, -"config": { -"user.attribute": "foo", -"access.token.claim": "true", -"claim.name": "realm_access.roles", -"jsonType.label": "String", -"multivalued": "true" -} -}, -{ -"id": "86df93b0-95d2-4ddf-8a67-c95cd8548b4c", -"name": "client roles", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-client-role-mapper", -"consentRequired": false, -"config": { -"user.attribute": "foo", -"access.token.claim": "true", -"claim.name": "resource_access.${client_id}.roles", -"jsonType.label": "String", -"multivalued": "true" -} -}, -{ -"id": "9512f843-d701-447a-81ad-c37c514f5e85", -"name": "audience resolve", -"protocol": "openid-connect", -"protocolMapper": "oidc-audience-resolve-mapper", -"consentRequired": false, -"config": {} -} -] -}, -{ -"id": "217f533d-3b86-4c18-ba3f-9cd3a2ee2020", -"name": "profile", -"description": "OpenID Connect built-in scope: profile", -"protocol": "openid-connect", -"attributes": { -"include.in.token.scope": "true", -"display.on.consent.screen": "true", -"consent.screen.text": "${profileScopeConsentText}" -}, -"protocolMappers": [ -{ -"id": "56a95df4-a2aa-4084-bb0c-a1c582bc49de", -"name": "full name", -"protocol": "openid-connect", -"protocolMapper": "oidc-full-name-mapper", -"consentRequired": false, -"config": { -"id.token.claim": "true", -"access.token.claim": "true", -"userinfo.token.claim": "true" -} -}, -{ -"id": "cda8131f-1089-461c-b7d7-9095f9f09039", -"name": "given name", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-property-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "firstName", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "given_name", -"jsonType.label": "String" -} -}, -{ -"id": "472e35d5-bdca-4b2e-a254-a039e8d38055", -"name": "middle name", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "middleName", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "middle_name", -"jsonType.label": "String" -} -}, -{ -"id": "fc05cdc0-8af3-4ef3-9e4f-13739a27b8eb", -"name": "updated at", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "updatedAt", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "updated_at", -"jsonType.label": "String" -} -}, -{ -"id": "e7687a07-343d-468f-94a9-eb164b116def", -"name": "username", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-property-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "username", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "preferred_username", -"jsonType.label": "String" -} -}, -{ -"id": "24b05ecf-9e9d-4339-b0a0-a3a74d31a6b7", -"name": "website", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "website", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "website", -"jsonType.label": "String" -} -}, -{ -"id": "1680e452-542a-4cd8-8dc3-3a1a5f81a0fd", -"name": "nickname", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "nickname", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "nickname", -"jsonType.label": "String" -} -}, -{ -"id": "b8e7ac11-ffa9-4d9f-b69a-b943a413b712", -"name": "gender", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "gender", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "gender", -"jsonType.label": "String" -} -}, -{ -"id": "f236c5c8-7c33-423d-8d7e-f50aad004994", -"name": "zoneinfo", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "zoneinfo", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "zoneinfo", -"jsonType.label": "String" -} -}, -{ -"id": "6d1e7cb0-cafc-4e1a-bcff-1ad7455543a0", -"name": "profile", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "profile", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "profile", -"jsonType.label": "String" -} -}, -{ -"id": "fe9d04d9-7335-4c1b-bb79-243ef9879adf", -"name": "locale", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "locale", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "locale", -"jsonType.label": "String" -} -}, -{ -"id": "4566115f-0422-4f85-b725-c73e648db062", -"name": "picture", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "picture", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "picture", -"jsonType.label": "String" -} -}, -{ -"id": "1cba28ae-5118-47e5-9f50-9389ef84486e", -"name": "birthdate", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "birthdate", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "birthdate", -"jsonType.label": "String" -} -}, -{ -"id": "cfed8843-761c-4842-9504-51413cfd1175", -"name": "family name", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-property-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "lastName", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "family_name", -"jsonType.label": "String" -} -} -] -}, -{ -"id": "ebd9ef35-eef3-4173-ae10-68e31431543c", -"name": "address", -"description": "OpenID Connect built-in scope: address", -"protocol": "openid-connect", -"attributes": { -"include.in.token.scope": "true", -"display.on.consent.screen": "true", -"consent.screen.text": "${addressScopeConsentText}" -}, -"protocolMappers": [ -{ -"id": "c28c14c3-eaaf-4b35-bb27-47e6a0082221", -"name": "address", -"protocol": "openid-connect", -"protocolMapper": "oidc-address-mapper", -"consentRequired": false, -"config": { -"user.attribute.formatted": "formatted", -"user.attribute.country": "country", -"user.attribute.postal_code": "postal_code", -"userinfo.token.claim": "true", -"user.attribute.street": "street", -"id.token.claim": "true", -"user.attribute.region": "region", -"access.token.claim": "true", -"user.attribute.locality": "locality" -} -} -] -}, -{ -"id": "7076f74a-d3ca-4358-ac4e-4327fb6abccc", -"name": "email", -"description": "OpenID Connect built-in scope: email", -"protocol": "openid-connect", -"attributes": { -"include.in.token.scope": "true", -"display.on.consent.screen": "true", -"consent.screen.text": "${emailScopeConsentText}" -}, -"protocolMappers": [ -{ -"id": "2154d906-8036-47f3-bdc8-95168bbf98fb", -"name": "email verified", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-property-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "emailVerified", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "email_verified", -"jsonType.label": "boolean" -} -}, -{ -"id": "addbcb30-55d6-4719-912f-6fd3ba096608", -"name": "email", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-property-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "email", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "email", -"jsonType.label": "String" -} -} -] -}, -{ -"id": "643899ea-61ae-41e1-a16e-cfaa4f6e9cbf", -"name": "web-origins", -"description": "OpenID Connect scope for add allowed web origins to the access token", -"protocol": "openid-connect", -"attributes": { -"include.in.token.scope": "false", -"display.on.consent.screen": "false", -"consent.screen.text": "" -}, -"protocolMappers": [ -{ -"id": "73052104-9074-4c49-bc66-604c394b56e9", -"name": "allowed web origins", -"protocol": "openid-connect", -"protocolMapper": "oidc-allowed-origins-mapper", -"consentRequired": false, -"config": {} -} -] -}, -{ -"id": "ecdb49aa-e141-4456-b705-2c9056b357ca", -"name": "phone", -"description": "OpenID Connect built-in scope: phone", -"protocol": "openid-connect", -"attributes": { -"include.in.token.scope": "true", -"display.on.consent.screen": "true", -"consent.screen.text": "${phoneScopeConsentText}" -}, -"protocolMappers": [ -{ -"id": "54ed815a-74e9-448c-9dc4-06f58d1e8e79", -"name": "phone number verified", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "phoneNumberVerified", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "phone_number_verified", -"jsonType.label": "boolean" -} -}, -{ -"id": "76e6bc11-144e-4b98-9844-9f22bbc1a81b", -"name": "phone number", -"protocol": "openid-connect", -"protocolMapper": "oidc-usermodel-attribute-mapper", -"consentRequired": false, -"config": { -"userinfo.token.claim": "true", -"user.attribute": "phoneNumber", -"id.token.claim": "true", -"access.token.claim": "true", -"claim.name": "phone_number", -"jsonType.label": "String" -} -} -] -} -], -"defaultDefaultClientScopes": [ -"profile", -"web-origins", -"roles", -"email", -"role_list" -], -"defaultOptionalClientScopes": [ -"microprofile-jwt", -"address", -"phone", -"offline_access" -], -"browserSecurityHeaders": { -"contentSecurityPolicyReportOnly": "", -"xContentTypeOptions": "nosniff", -"xRobotsTag": "none", -"xFrameOptions": "ALLOW-FROM https://feasibility.forschen-fuer-gesundheit.de", -"contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; https://feasibility.forschen-fuer-gesundheit.de", -"xXSSProtection": "1; mode=block", -"strictTransportSecurity": "max-age=31536000; includeSubDomains" -}, -"smtpServer": {}, -"eventsEnabled": false, -"eventsListeners": [ -"jboss-logging" -], -"enabledEventTypes": [], -"adminEventsEnabled": false, -"adminEventsDetailsEnabled": false, -"identityProviders": [], -"identityProviderMappers": [], -"components": { -"org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [ -{ -"id": "d678125d-4a20-4730-a629-939e768de9ff", -"name": "Full Scope Disabled", -"providerId": "scope", -"subType": "anonymous", -"subComponents": {}, -"config": {} -}, -{ -"id": "a5327830-86ac-426c-a77b-00bd81dba0db", -"name": "Max Clients Limit", -"providerId": "max-clients", -"subType": "anonymous", -"subComponents": {}, -"config": { -"max-clients": [ -"200" -] -} -}, -{ -"id": "f516ba7a-0b6b-44cf-8719-78ce76a349b9", -"name": "Allowed Client Scopes", -"providerId": "allowed-client-templates", -"subType": "anonymous", -"subComponents": {}, -"config": { -"allow-default-scopes": [ -"true" -] -} -}, -{ -"id": "8b8c1d8c-7d01-4985-8c81-b18f671e555e", -"name": "Trusted Hosts", -"providerId": "trusted-hosts", -"subType": "anonymous", -"subComponents": {}, -"config": { -"host-sending-registration-request-must-match": [ -"true" -], -"client-uris-must-match": [ -"true" -] -} -}, -{ -"id": "9c7e9418-c113-431e-a26b-4d300e44cfd6", -"name": "Consent Required", -"providerId": "consent-required", -"subType": "anonymous", -"subComponents": {}, -"config": {} -}, -{ -"id": "129768ec-66db-4de0-9b67-dd3889e092e8", -"name": "Allowed Protocol Mapper Types", -"providerId": "allowed-protocol-mappers", -"subType": "authenticated", -"subComponents": {}, -"config": { -"allowed-protocol-mapper-types": [ -"oidc-usermodel-attribute-mapper", -"oidc-full-name-mapper", -"saml-role-list-mapper", -"oidc-address-mapper", -"saml-user-property-mapper", -"oidc-usermodel-property-mapper", -"saml-user-attribute-mapper", -"oidc-sha256-pairwise-sub-mapper" -] -} -}, -{ -"id": "a3b792d9-2819-496e-b48e-91dd51ec9d2a", -"name": "Allowed Client Scopes", -"providerId": "allowed-client-templates", -"subType": "authenticated", -"subComponents": {}, -"config": { -"allow-default-scopes": [ -"true" -] -} -}, -{ -"id": "e533cdfb-5afc-4685-a0a1-4a1fd6d4716d", -"name": "Allowed Protocol Mapper Types", -"providerId": "allowed-protocol-mappers", -"subType": "anonymous", -"subComponents": {}, -"config": { -"allowed-protocol-mapper-types": [ -"oidc-usermodel-attribute-mapper", -"saml-user-property-mapper", -"oidc-sha256-pairwise-sub-mapper", -"saml-role-list-mapper", -"oidc-full-name-mapper", -"oidc-usermodel-property-mapper", -"oidc-address-mapper", -"saml-user-attribute-mapper" -] -} -} -], -"org.keycloak.keys.KeyProvider": [ -{ -"id": "485b2c16-6c0a-4274-9ab4-a957ed56eabd", -"name": "hmac-generated", -"providerId": "hmac-generated", -"subComponents": {}, -"config": { -"priority": [ -"100" -], -"algorithm": [ -"HS256" -] -} -}, -{ -"id": "aa37ed27-fa9d-40bd-90c8-d26478531db6", -"name": "rsa-generated", -"providerId": "rsa-generated", -"subComponents": {}, -"config": { -"priority": [ -"100" -] -} -}, -{ -"id": "5bbd86a4-df07-4b06-8c4e-6bf4a38caa53", -"name": "aes-generated", -"providerId": "aes-generated", -"subComponents": {}, -"config": { -"priority": [ -"100" -] -} -} -] -}, -"internationalizationEnabled": false, -"supportedLocales": [], -"authenticationFlows": [ -{ -"id": "d36f5255-710b-4f16-962d-79de80337530", -"alias": "Account verification options", -"description": "Method with which to verity the existing account", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "idp-email-verification", -"authenticatorFlow": false, -"requirement": "ALTERNATIVE", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "ALTERNATIVE", -"priority": 20, -"flowAlias": "Verify Existing Account by Re-authentication", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "836723c7-d3b8-4305-8dfc-ecf22d84ea5d", -"alias": "Authentication Options", -"description": "Authentication options.", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "basic-auth", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "basic-auth-otp", -"authenticatorFlow": false, -"requirement": "DISABLED", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "auth-spnego", -"authenticatorFlow": false, -"requirement": "DISABLED", -"priority": 30, -"userSetupAllowed": false, -"autheticatorFlow": false -} -] -}, -{ -"id": "d07ba96d-fd71-404e-b2f2-4f75f0b19ef5", -"alias": "Browser - Conditional OTP", -"description": "Flow to determine if the OTP is required for the authentication", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "conditional-user-configured", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "auth-otp-form", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -} -] -}, -{ -"id": "b1924030-02ce-4297-b6bb-1ef4083318b8", -"alias": "Direct Grant - Conditional OTP", -"description": "Flow to determine if the OTP is required for the authentication", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "conditional-user-configured", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "direct-grant-validate-otp", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -} -] -}, -{ -"id": "3bf11139-b411-4795-9d02-1068e92103cd", -"alias": "First broker login - Conditional OTP", -"description": "Flow to determine if the OTP is required for the authentication", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "conditional-user-configured", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "auth-otp-form", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -} -] -}, -{ -"id": "86bd977a-7ae5-4396-8bfb-98adef09cb35", -"alias": "Handle Existing Account", -"description": "Handle what to do if there is existing account with same email/username like authenticated identity provider", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "idp-confirm-link", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "REQUIRED", -"priority": 20, -"flowAlias": "Account verification options", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "1245fb82-cf33-4040-8e12-0da5b8a6ca8a", -"alias": "Reset - Conditional OTP", -"description": "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "conditional-user-configured", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "reset-otp", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -} -] -}, -{ -"id": "62493d55-86b2-4282-a054-3fca77b4255b", -"alias": "User creation or linking", -"description": "Flow for the existing/non-existing user alternatives", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticatorConfig": "create unique user config", -"authenticator": "idp-create-user-if-unique", -"authenticatorFlow": false, -"requirement": "ALTERNATIVE", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "ALTERNATIVE", -"priority": 20, -"flowAlias": "Handle Existing Account", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "f3776b9b-3a02-4bdf-b798-0a104184b31e", -"alias": "Verify Existing Account by Re-authentication", -"description": "Reauthentication of existing account", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "idp-username-password-form", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "CONDITIONAL", -"priority": 20, -"flowAlias": "First broker login - Conditional OTP", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "362f89f3-5e20-4778-8b05-ceb0f4c9ae4b", -"alias": "browser", -"description": "browser based authentication", -"providerId": "basic-flow", -"topLevel": true, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "auth-cookie", -"authenticatorFlow": false, -"requirement": "ALTERNATIVE", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "auth-spnego", -"authenticatorFlow": false, -"requirement": "DISABLED", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "identity-provider-redirector", -"authenticatorFlow": false, -"requirement": "ALTERNATIVE", -"priority": 25, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "ALTERNATIVE", -"priority": 30, -"flowAlias": "forms", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "ba7f8247-cc82-448e-a6a7-6242d7deabc2", -"alias": "clients", -"description": "Base authentication for clients", -"providerId": "client-flow", -"topLevel": true, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "client-secret", -"authenticatorFlow": false, -"requirement": "ALTERNATIVE", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "client-jwt", -"authenticatorFlow": false, -"requirement": "ALTERNATIVE", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "client-secret-jwt", -"authenticatorFlow": false, -"requirement": "ALTERNATIVE", -"priority": 30, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "client-x509", -"authenticatorFlow": false, -"requirement": "ALTERNATIVE", -"priority": 40, -"userSetupAllowed": false, -"autheticatorFlow": false -} -] -}, -{ -"id": "da762a68-3168-4328-a133-37a499dcf49e", -"alias": "direct grant", -"description": "OpenID Connect Resource Owner Grant", -"providerId": "basic-flow", -"topLevel": true, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "direct-grant-validate-username", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "direct-grant-validate-password", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "CONDITIONAL", -"priority": 30, -"flowAlias": "Direct Grant - Conditional OTP", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "7d3b33ce-d81a-4ead-8f43-0460c42bb465", -"alias": "docker auth", -"description": "Used by Docker clients to authenticate against the IDP", -"providerId": "basic-flow", -"topLevel": true, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "docker-http-basic-authenticator", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -} -] -}, -{ -"id": "4b40dbf9-871d-4f3e-9549-3e2095e7afce", -"alias": "first broker login", -"description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", -"providerId": "basic-flow", -"topLevel": true, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticatorConfig": "review profile config", -"authenticator": "idp-review-profile", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "REQUIRED", -"priority": 20, -"flowAlias": "User creation or linking", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "0a3c6df9-d4dd-4fad-b0f0-c3286e81b16d", -"alias": "forms", -"description": "Username, password, otp and other auth forms.", -"providerId": "basic-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "auth-username-password-form", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "CONDITIONAL", -"priority": 20, -"flowAlias": "Browser - Conditional OTP", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "5233e6bd-9b0e-4dd7-832c-9cccf5461f0b", -"alias": "http challenge", -"description": "An authentication flow based on challenge-response HTTP Authentication Schemes", -"providerId": "basic-flow", -"topLevel": true, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "no-cookie-redirect", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "REQUIRED", -"priority": 20, -"flowAlias": "Authentication Options", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "cfe041c6-babc-4ac7-a22e-f909727d8603", -"alias": "registration", -"description": "registration flow", -"providerId": "basic-flow", -"topLevel": true, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "registration-page-form", -"authenticatorFlow": true, -"requirement": "REQUIRED", -"priority": 10, -"flowAlias": "registration form", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "2322211d-da96-496f-936a-7b475e59c6d7", -"alias": "registration form", -"description": "registration form", -"providerId": "form-flow", -"topLevel": false, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "registration-user-creation", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "registration-profile-action", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 40, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "registration-password-action", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 50, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "registration-recaptcha-action", -"authenticatorFlow": false, -"requirement": "DISABLED", -"priority": 60, -"userSetupAllowed": false, -"autheticatorFlow": false -} -] -}, -{ -"id": "b230ee41-d032-430a-9696-2b72ef13ff66", -"alias": "reset credentials", -"description": "Reset credentials for a user if they forgot their password or something", -"providerId": "basic-flow", -"topLevel": true, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "reset-credentials-choose-user", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "reset-credential-email", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 20, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticator": "reset-password", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 30, -"userSetupAllowed": false, -"autheticatorFlow": false -}, -{ -"authenticatorFlow": true, -"requirement": "CONDITIONAL", -"priority": 40, -"flowAlias": "Reset - Conditional OTP", -"userSetupAllowed": false, -"autheticatorFlow": true -} -] -}, -{ -"id": "827bc678-bf3d-40a6-89c4-38b9551d80d3", -"alias": "saml ecp", -"description": "SAML ECP Profile Authentication Flow", -"providerId": "basic-flow", -"topLevel": true, -"builtIn": true, -"authenticationExecutions": [ -{ -"authenticator": "http-basic-authenticator", -"authenticatorFlow": false, -"requirement": "REQUIRED", -"priority": 10, -"userSetupAllowed": false, -"autheticatorFlow": false -} -] -} -], -"authenticatorConfig": [ -{ -"id": "2565c938-a088-402c-97c5-040ddc655dad", -"alias": "create unique user config", -"config": { -"require.password.update.after.registration": "false" -} -}, -{ -"id": "ae312d41-a4d2-4cb0-a0a5-86101e3d0313", -"alias": "review profile config", -"config": { -"update.profile.on.first.login": "missing" -} -} -], -"requiredActions": [ -{ -"alias": "CONFIGURE_TOTP", -"name": "Configure OTP", -"providerId": "CONFIGURE_TOTP", -"enabled": true, -"defaultAction": false, -"priority": 10, -"config": {} -}, -{ -"alias": "terms_and_conditions", -"name": "Terms and Conditions", -"providerId": "terms_and_conditions", -"enabled": false, -"defaultAction": false, -"priority": 20, -"config": {} -}, -{ -"alias": "UPDATE_PASSWORD", -"name": "Update Password", -"providerId": "UPDATE_PASSWORD", -"enabled": true, -"defaultAction": false, -"priority": 30, -"config": {} -}, -{ -"alias": "UPDATE_PROFILE", -"name": "Update Profile", -"providerId": "UPDATE_PROFILE", -"enabled": true, -"defaultAction": false, -"priority": 40, -"config": {} -}, -{ -"alias": "VERIFY_EMAIL", -"name": "Verify Email", -"providerId": "VERIFY_EMAIL", -"enabled": true, -"defaultAction": false, -"priority": 50, -"config": {} -}, -{ -"alias": "delete_account", -"name": "Delete Account", -"providerId": "delete_account", -"enabled": false, -"defaultAction": false, -"priority": 60, -"config": {} -}, -{ -"alias": "update_user_locale", -"name": "Update User Locale", -"providerId": "update_user_locale", -"enabled": true, -"defaultAction": false, -"priority": 1000, -"config": {} -} -], -"browserFlow": "browser", -"registrationFlow": "registration", -"directGrantFlow": "direct grant", -"resetCredentialsFlow": "reset credentials", -"clientAuthenticationFlow": "clients", -"dockerAuthenticationFlow": "docker auth", -"attributes": { -"cibaBackchannelTokenDeliveryMode": "poll", -"cibaExpiresIn": "120", -"cibaAuthRequestedUserHint": "login_hint", -"oauth2DeviceCodeLifespan": "600", -"clientOfflineSessionMaxLifespan": "0", -"oauth2DevicePollingInterval": "5", -"clientSessionIdleTimeout": "0", -"clientSessionMaxLifespan": "0", -"parRequestUriLifespan": "60", -"clientOfflineSessionIdleTimeout": "0", -"cibaInterval": "5" -}, -"keycloakVersion": "15.0.2", -"userManagedAccessAllowed": false, -"clientProfiles": { -"profiles": [] -}, -"clientPolicies": { -"policies": [] -} + "id" : "feasibility", + "realm" : "feasibility", + "notBefore" : 0, + "defaultSignatureAlgorithm" : "RS256", + "revokeRefreshToken" : false, + "refreshTokenMaxReuse" : 0, + "accessTokenLifespan" : 300, + "accessTokenLifespanForImplicitFlow" : 900, + "ssoSessionIdleTimeout" : 1800, + "ssoSessionMaxLifespan" : 36000, + "ssoSessionIdleTimeoutRememberMe" : 0, + "ssoSessionMaxLifespanRememberMe" : 0, + "offlineSessionIdleTimeout" : 2592000, + "offlineSessionMaxLifespanEnabled" : false, + "offlineSessionMaxLifespan" : 5184000, + "clientSessionIdleTimeout" : 0, + "clientSessionMaxLifespan" : 0, + "clientOfflineSessionIdleTimeout" : 0, + "clientOfflineSessionMaxLifespan" : 0, + "accessCodeLifespan" : 60, + "accessCodeLifespanUserAction" : 300, + "accessCodeLifespanLogin" : 1800, + "actionTokenGeneratedByAdminLifespan" : 43200, + "actionTokenGeneratedByUserLifespan" : 300, + "oauth2DeviceCodeLifespan" : 600, + "oauth2DevicePollingInterval" : 5, + "enabled" : true, + "sslRequired" : "external", + "registrationAllowed" : false, + "registrationEmailAsUsername" : false, + "rememberMe" : false, + "verifyEmail" : false, + "loginWithEmailAllowed" : true, + "duplicateEmailsAllowed" : false, + "resetPasswordAllowed" : false, + "editUsernameAllowed" : false, + "bruteForceProtected" : false, + "permanentLockout" : false, + "maxFailureWaitSeconds" : 900, + "minimumQuickLoginWaitSeconds" : 60, + "waitIncrementSeconds" : 60, + "quickLoginCheckMilliSeconds" : 1000, + "maxDeltaTimeSeconds" : 43200, + "failureFactor" : 30, + "roles" : { + "realm" : [ { + "id" : "913cae18-a8ca-46aa-a555-46bcc276c6a5", + "name" : "uma_authorization", + "description" : "${role_uma_authorization}", + "composite" : false, + "clientRole" : false, + "containerId" : "feasibility", + "attributes" : { } + }, { + "id" : "7a906443-fad8-47ab-b02b-01a36ac2a725", + "name" : "offline_access", + "description" : "${role_offline-access}", + "composite" : false, + "clientRole" : false, + "containerId" : "feasibility", + "attributes" : { } + }, { + "id" : "185a6bc8-6d93-4286-9df6-d038e3075131", + "name" : "FEASIBILITY_USER", + "description" : "Standard feasibility user, which is allowed to send feasibility queries but has no admin rights", + "composite" : false, + "clientRole" : false, + "containerId" : "feasibility", + "attributes" : { } + }, { + "id" : "d37ac4b9-ff18-49f0-b5db-04015bd8ef04", + "name" : "default-roles-feasibility", + "description" : "${role_default-roles}", + "composite" : true, + "composites" : { + "realm" : [ "offline_access", "uma_authorization" ], + "client" : { + "account" : [ "manage-account", "view-profile" ] + } + }, + "clientRole" : false, + "containerId" : "feasibility", + "attributes" : { } + } ], + "client" : { + "realm-management" : [ { + "id" : "355674ff-8891-485c-a68e-8c94cfec490a", + "name" : "view-identity-providers", + "description" : "${role_view-identity-providers}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "69d186fe-fc92-4b29-a287-144c4ead7bc5", + "name" : "manage-clients", + "description" : "${role_manage-clients}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "e089ab06-7d1a-4593-b8f8-82acb26ad4fe", + "name" : "manage-users", + "description" : "${role_manage-users}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "06383980-7900-4759-aec2-4cb253ebaa0d", + "name" : "manage-authorization", + "description" : "${role_manage-authorization}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "0d8ac718-e81d-4663-b3d1-ab72c3fa4c2f", + "name" : "view-realm", + "description" : "${role_view-realm}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "6dc13962-883a-4c78-a948-7eb91bdc1333", + "name" : "query-groups", + "description" : "${role_query-groups}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "e38a62c9-39ad-4b72-a504-adc9ccfa8325", + "name" : "query-clients", + "description" : "${role_query-clients}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "4c7e669f-8ade-4263-947d-28c9e949cb8a", + "name" : "realm-admin", + "description" : "${role_realm-admin}", + "composite" : true, + "composites" : { + "client" : { + "realm-management" : [ "view-identity-providers", "manage-users", "manage-clients", "view-realm", "manage-authorization", "query-groups", "query-clients", "view-events", "view-authorization", "query-users", "query-realms", "manage-realm", "manage-events", "create-client", "view-users", "view-clients", "manage-identity-providers", "impersonation" ] + } + }, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "f01b3e77-6ce7-48a7-8836-5296602a9377", + "name" : "view-events", + "description" : "${role_view-events}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "a277268b-02d6-4d1b-9f6f-fdddc39f2f1d", + "name" : "query-users", + "description" : "${role_query-users}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "dbf38fbc-9449-49ef-bced-b645c8d8e9ff", + "name" : "view-authorization", + "description" : "${role_view-authorization}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "b91f9193-06f7-46a4-860c-47e07c6e19e2", + "name" : "query-realms", + "description" : "${role_query-realms}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "06bcea3b-53ba-451c-970c-1076b0828d75", + "name" : "manage-realm", + "description" : "${role_manage-realm}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "3a2d6159-cba0-420d-a714-99cec7bab561", + "name" : "manage-events", + "description" : "${role_manage-events}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "feba4c38-9734-4084-8e7d-5c96e369658d", + "name" : "create-client", + "description" : "${role_create-client}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "2bed404b-7bc7-4820-93e7-3281172049c7", + "name" : "view-clients", + "description" : "${role_view-clients}", + "composite" : true, + "composites" : { + "client" : { + "realm-management" : [ "query-clients" ] + } + }, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "c20771d4-2295-4a2b-a565-d596bf8b3ec7", + "name" : "view-users", + "description" : "${role_view-users}", + "composite" : true, + "composites" : { + "client" : { + "realm-management" : [ "query-groups", "query-users" ] + } + }, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "6f959669-5dd8-4c20-8043-fadc35f96f2f", + "name" : "impersonation", + "description" : "${role_impersonation}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + }, { + "id" : "57707eab-db06-434c-8e6d-48e1e05edbf5", + "name" : "manage-identity-providers", + "description" : "${role_manage-identity-providers}", + "composite" : false, + "clientRole" : true, + "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "attributes" : { } + } ], + "feasibility-gui" : [ ], + "security-admin-console" : [ ], + "admin-cli" : [ ], + "account-console" : [ ], + "broker" : [ { + "id" : "5d8b0f88-6275-41bf-992a-0bd16e69825f", + "name" : "read-token", + "description" : "${role_read-token}", + "composite" : false, + "clientRole" : true, + "containerId" : "543d5000-dd9b-4db9-a0a1-ea3665c59c20", + "attributes" : { } + } ], + "account" : [ { + "id" : "fd6c7388-4057-4faf-b69f-3063e81cb3a8", + "name" : "view-consent", + "description" : "${role_view-consent}", + "composite" : false, + "clientRole" : true, + "containerId" : "809d8294-46d9-4219-b617-02f790af5037", + "attributes" : { } + }, { + "id" : "5a704c35-2f22-4f95-aedf-f4b89459e6c7", + "name" : "manage-account", + "description" : "${role_manage-account}", + "composite" : true, + "composites" : { + "client" : { + "account" : [ "manage-account-links" ] + } + }, + "clientRole" : true, + "containerId" : "809d8294-46d9-4219-b617-02f790af5037", + "attributes" : { } + }, { + "id" : "808d7ca7-d6c6-4763-bb79-4a471bbadd97", + "name" : "manage-account-links", + "description" : "${role_manage-account-links}", + "composite" : false, + "clientRole" : true, + "containerId" : "809d8294-46d9-4219-b617-02f790af5037", + "attributes" : { } + }, { + "id" : "c775280f-4b65-403a-b8ec-0f133cbb3b7e", + "name" : "view-profile", + "description" : "${role_view-profile}", + "composite" : false, + "clientRole" : true, + "containerId" : "809d8294-46d9-4219-b617-02f790af5037", + "attributes" : { } + }, { + "id" : "d183e0db-004e-4bc2-b4bd-b324b2479b3b", + "name" : "view-applications", + "description" : "${role_view-applications}", + "composite" : false, + "clientRole" : true, + "containerId" : "809d8294-46d9-4219-b617-02f790af5037", + "attributes" : { } + }, { + "id" : "5cd0e740-7701-46be-9688-183b8397f9ca", + "name" : "delete-account", + "description" : "${role_delete-account}", + "composite" : false, + "clientRole" : true, + "containerId" : "809d8294-46d9-4219-b617-02f790af5037", + "attributes" : { } + }, { + "id" : "3c06193c-94ce-446a-8948-69070e7826d2", + "name" : "manage-consent", + "description" : "${role_manage-consent}", + "composite" : true, + "composites" : { + "client" : { + "account" : [ "view-consent" ] + } + }, + "clientRole" : true, + "containerId" : "809d8294-46d9-4219-b617-02f790af5037", + "attributes" : { } + } ] + } + }, + "groups" : [ { + "id" : "dd4dfa45-4159-4098-9d91-1ad809674c67", + "name" : "feasibility-user", + "path" : "/feasibility-user", + "attributes" : { }, + "realmRoles" : [ "FEASIBILITY_USER" ], + "clientRoles" : { }, + "subGroups" : [ ] + } ], + "defaultRole" : { + "id" : "d37ac4b9-ff18-49f0-b5db-04015bd8ef04", + "name" : "default-roles-feasibility", + "description" : "${role_default-roles}", + "composite" : true, + "clientRole" : false, + "containerId" : "feasibility" + }, + "requiredCredentials" : [ "password" ], + "otpPolicyType" : "totp", + "otpPolicyAlgorithm" : "HmacSHA1", + "otpPolicyInitialCounter" : 0, + "otpPolicyDigits" : 6, + "otpPolicyLookAheadWindow" : 1, + "otpPolicyPeriod" : 30, + "otpSupportedApplications" : [ "FreeOTP", "Google Authenticator" ], + "webAuthnPolicyRpEntityName" : "keycloak", + "webAuthnPolicySignatureAlgorithms" : [ "ES256" ], + "webAuthnPolicyRpId" : "", + "webAuthnPolicyAttestationConveyancePreference" : "not specified", + "webAuthnPolicyAuthenticatorAttachment" : "not specified", + "webAuthnPolicyRequireResidentKey" : "not specified", + "webAuthnPolicyUserVerificationRequirement" : "not specified", + "webAuthnPolicyCreateTimeout" : 0, + "webAuthnPolicyAvoidSameAuthenticatorRegister" : false, + "webAuthnPolicyAcceptableAaguids" : [ ], + "webAuthnPolicyPasswordlessRpEntityName" : "keycloak", + "webAuthnPolicyPasswordlessSignatureAlgorithms" : [ "ES256" ], + "webAuthnPolicyPasswordlessRpId" : "", + "webAuthnPolicyPasswordlessAttestationConveyancePreference" : "not specified", + "webAuthnPolicyPasswordlessAuthenticatorAttachment" : "not specified", + "webAuthnPolicyPasswordlessRequireResidentKey" : "not specified", + "webAuthnPolicyPasswordlessUserVerificationRequirement" : "not specified", + "webAuthnPolicyPasswordlessCreateTimeout" : 0, + "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister" : false, + "webAuthnPolicyPasswordlessAcceptableAaguids" : [ ], + "users" : [ ], + "scopeMappings" : [ { + "clientScope" : "offline_access", + "roles" : [ "offline_access" ] + } ], + "clientScopeMappings" : { + "account" : [ { + "client" : "account-console", + "roles" : [ "manage-account" ] + } ] + }, + "clients" : [ { + "id" : "809d8294-46d9-4219-b617-02f790af5037", + "clientId" : "account", + "name" : "${client_account}", + "rootUrl" : "${authBaseUrl}", + "baseUrl" : "/realms/feasibility/account/", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ "/realms/feasibility/account/*" ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "8ea10973-aa64-4608-81cb-cf28436906a0", + "clientId" : "account-console", + "name" : "${client_account-console}", + "rootUrl" : "${authBaseUrl}", + "baseUrl" : "/realms/feasibility/account/", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ "/realms/feasibility/account/*" ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "pkce.code.challenge.method" : "S256" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "protocolMappers" : [ { + "id" : "c8f01dea-65e5-4a89-b022-f9cd49bdb0c2", + "name" : "audience resolve", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-audience-resolve-mapper", + "consentRequired" : false, + "config" : { } + } ], + "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "35a0cf7e-ab0d-4f64-8c59-a85df5c8666b", + "clientId" : "admin-cli", + "name" : "${client_admin-cli}", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : false, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : true, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "543d5000-dd9b-4db9-a0a1-ea3665c59c20", + "clientId" : "broker", + "name" : "${client_broker}", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : true, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : false, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "84966fed-c305-4da7-be96-10b4584eb052", + "clientId" : "feasibility-gui", + "name" : "feasibility-gui", + "rootUrl" : "https://localhost", + "baseUrl" : "https://localhost", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ "https://localhost/*" ], + "webOrigins" : [ "https://localhost" ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : true, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "saml.assertion.signature" : "false", + "id.token.as.detached.signature" : "false", + "saml.multivalued.roles" : "false", + "saml.force.post.binding" : "false", + "saml.encrypt" : "false", + "oauth2.device.authorization.grant.enabled" : "false", + "backchannel.logout.revoke.offline.tokens" : "false", + "saml.server.signature" : "false", + "saml.server.signature.keyinfo.ext" : "false", + "use.refresh.tokens" : "true", + "exclude.session.state.from.auth.response" : "false", + "oidc.ciba.grant.enabled" : "false", + "saml.artifact.binding" : "false", + "backchannel.logout.session.required" : "true", + "client_credentials.use_refresh_token" : "false", + "saml_force_name_id_format" : "false", + "saml.client.signature" : "false", + "tls.client.certificate.bound.access.tokens" : "false", + "require.pushed.authorization.requests" : "false", + "saml.authnstatement" : "false", + "display.on.consent.screen" : "false", + "saml.onetimeuse.condition" : "false" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : true, + "nodeReRegistrationTimeout" : -1, + "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", + "clientId" : "realm-management", + "name" : "${client_realm-management}", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : true, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : false, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "7d85918f-33f4-4967-a4b7-c37c27a4764e", + "clientId" : "security-admin-console", + "name" : "${client_security-admin-console}", + "rootUrl" : "${authAdminUrl}", + "baseUrl" : "/admin/feasibility/console/", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ "/admin/feasibility/console/*" ], + "webOrigins" : [ "+" ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "pkce.code.challenge.method" : "S256" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "protocolMappers" : [ { + "id" : "9a3554a7-3db0-42cd-a32d-253ed8974f66", + "name" : "locale", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "locale", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "locale", + "jsonType.label" : "String" + } + } ], + "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + } ], + "clientScopes" : [ { + "id" : "9e54c6c2-0aa6-46d3-98f8-639b9e84bca6", + "name" : "role_list", + "description" : "SAML role list", + "protocol" : "saml", + "attributes" : { + "consent.screen.text" : "${samlRoleListScopeConsentText}", + "display.on.consent.screen" : "true" + }, + "protocolMappers" : [ { + "id" : "660801b2-a9ef-4a67-8884-4461f40bd91c", + "name" : "role list", + "protocol" : "saml", + "protocolMapper" : "saml-role-list-mapper", + "consentRequired" : false, + "config" : { + "single" : "false", + "attribute.nameformat" : "Basic", + "attribute.name" : "Role" + } + } ] + }, { + "id" : "b503db75-c63d-43a9-99c4-8933411acac5", + "name" : "offline_access", + "description" : "OpenID Connect built-in scope: offline_access", + "protocol" : "openid-connect", + "attributes" : { + "consent.screen.text" : "${offlineAccessScopeConsentText}", + "display.on.consent.screen" : "true" + } + }, { + "id" : "22e668e6-7477-43b9-b980-d20f32203ab4", + "name" : "profile", + "description" : "OpenID Connect built-in scope: profile", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${profileScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "dc818891-ee21-42dd-a042-53ae54280284", + "name" : "zoneinfo", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "zoneinfo", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "zoneinfo", + "jsonType.label" : "String" + } + }, { + "id" : "8e62e716-8889-4f13-8256-dab11d583608", + "name" : "middle name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "middleName", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "middle_name", + "jsonType.label" : "String" + } + }, { + "id" : "23526425-35fd-4537-ab0b-aed54f59c63e", + "name" : "nickname", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "nickname", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "nickname", + "jsonType.label" : "String" + } + }, { + "id" : "058d0aa6-a967-4932-b384-b73e5ba0e0b4", + "name" : "full name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-full-name-mapper", + "consentRequired" : false, + "config" : { + "id.token.claim" : "true", + "access.token.claim" : "true", + "userinfo.token.claim" : "true" + } + }, { + "id" : "908a8f10-01bf-4a80-9e39-134a5259b7e7", + "name" : "locale", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "locale", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "locale", + "jsonType.label" : "String" + } + }, { + "id" : "49fec980-87e5-4035-a4db-f41cb1159d1f", + "name" : "picture", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "picture", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "picture", + "jsonType.label" : "String" + } + }, { + "id" : "7aa5f0c2-0a9c-486f-bcf7-e9d3dd071d9f", + "name" : "family name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "lastName", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "family_name", + "jsonType.label" : "String" + } + }, { + "id" : "400a3a74-c4e4-4f6a-a782-03f2daf8ed7f", + "name" : "birthdate", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "birthdate", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "birthdate", + "jsonType.label" : "String" + } + }, { + "id" : "b9604c8f-eaba-4333-808a-1c58a874decf", + "name" : "updated at", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "updatedAt", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "updated_at", + "jsonType.label" : "String" + } + }, { + "id" : "4efba9b3-f668-499a-b34d-3644d7ae8db6", + "name" : "profile", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "profile", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "profile", + "jsonType.label" : "String" + } + }, { + "id" : "726f471f-93c3-48a5-b2b8-4cb0fcf57ab7", + "name" : "website", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "website", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "website", + "jsonType.label" : "String" + } + }, { + "id" : "97f4560a-ff09-4983-a5a1-8166e9c035b8", + "name" : "gender", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "gender", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "gender", + "jsonType.label" : "String" + } + }, { + "id" : "6b9f9512-b501-45ee-b882-8a427ee84039", + "name" : "given name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "firstName", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "given_name", + "jsonType.label" : "String" + } + }, { + "id" : "925cfc56-bbe9-40e2-bb7e-9b8b84e93e69", + "name" : "username", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "username", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "preferred_username", + "jsonType.label" : "String" + } + } ] + }, { + "id" : "55f2daa4-f2cd-41f0-a617-3cc1365f692e", + "name" : "microprofile-jwt", + "description" : "Microprofile - JWT built-in scope", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "false" + }, + "protocolMappers" : [ { + "id" : "259ccd2b-2ebd-48ed-b605-6ac6007afce0", + "name" : "groups", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-realm-role-mapper", + "consentRequired" : false, + "config" : { + "multivalued" : "true", + "user.attribute" : "foo", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "groups", + "jsonType.label" : "String" + } + }, { + "id" : "2a4e87bf-9464-4d9f-9929-f667a77fb752", + "name" : "upn", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "username", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "upn", + "jsonType.label" : "String" + } + } ] + }, { + "id" : "9a476ca3-b855-46c8-bf58-6a4bae5b5dab", + "name" : "email", + "description" : "OpenID Connect built-in scope: email", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${emailScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "237c45bf-8633-4050-9984-586aa9da0a96", + "name" : "email", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "email", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "email", + "jsonType.label" : "String" + } + }, { + "id" : "0afa79db-68a0-4528-badb-6c10d9db820b", + "name" : "email verified", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "emailVerified", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "email_verified", + "jsonType.label" : "boolean" + } + } ] + }, { + "id" : "4629a245-a77b-4055-8244-ac6290cc89d1", + "name" : "address", + "description" : "OpenID Connect built-in scope: address", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${addressScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "00c69d3d-abed-4205-a8ef-6a3df86f545e", + "name" : "address", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-address-mapper", + "consentRequired" : false, + "config" : { + "user.attribute.formatted" : "formatted", + "user.attribute.country" : "country", + "user.attribute.postal_code" : "postal_code", + "userinfo.token.claim" : "true", + "user.attribute.street" : "street", + "id.token.claim" : "true", + "user.attribute.region" : "region", + "access.token.claim" : "true", + "user.attribute.locality" : "locality" + } + } ] + }, { + "id" : "754f520a-27c6-41e7-95a6-03ad374e4143", + "name" : "roles", + "description" : "OpenID Connect scope for add user roles to the access token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${rolesScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "c7cd55a9-9c1c-4390-b6f3-e59264461415", + "name" : "audience resolve", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-audience-resolve-mapper", + "consentRequired" : false, + "config" : { } + }, { + "id" : "a14fbf98-8ebe-416b-8263-5c50b77ed238", + "name" : "client roles", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-client-role-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "foo", + "access.token.claim" : "true", + "claim.name" : "resource_access.${client_id}.roles", + "jsonType.label" : "String", + "multivalued" : "true" + } + }, { + "id" : "1e63d316-6a19-4049-a295-5dd600f7b1b6", + "name" : "realm roles", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-realm-role-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "foo", + "access.token.claim" : "true", + "claim.name" : "realm_access.roles", + "jsonType.label" : "String", + "multivalued" : "true" + } + } ] + }, { + "id" : "2e6fa524-565e-4151-81a8-be4cb5e2b247", + "name" : "phone", + "description" : "OpenID Connect built-in scope: phone", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${phoneScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "7073f0a3-678e-4748-b379-83e3c7a89bd9", + "name" : "phone number", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "phoneNumber", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "phone_number", + "jsonType.label" : "String" + } + }, { + "id" : "e396c288-0869-467f-a315-173388845f20", + "name" : "phone number verified", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "phoneNumberVerified", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "phone_number_verified", + "jsonType.label" : "boolean" + } + } ] + }, { + "id" : "8fd75efa-3be8-46b3-bade-3f24433d03fd", + "name" : "web-origins", + "description" : "OpenID Connect scope for add allowed web origins to the access token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "false", + "consent.screen.text" : "" + }, + "protocolMappers" : [ { + "id" : "98108f6b-8bbc-46b9-83a1-30aa539c40e0", + "name" : "allowed web origins", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-allowed-origins-mapper", + "consentRequired" : false, + "config" : { } + } ] + } ], + "defaultDefaultClientScopes" : [ "role_list", "profile", "email", "roles", "web-origins" ], + "defaultOptionalClientScopes" : [ "offline_access", "address", "phone", "microprofile-jwt" ], + "browserSecurityHeaders" : { + "contentSecurityPolicyReportOnly" : "", + "xContentTypeOptions" : "nosniff", + "xRobotsTag" : "none", + "xFrameOptions" : "SAMEORIGIN", + "contentSecurityPolicy" : "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", + "xXSSProtection" : "1; mode=block", + "strictTransportSecurity" : "max-age=31536000; includeSubDomains" + }, + "smtpServer" : { }, + "eventsEnabled" : false, + "eventsListeners" : [ "jboss-logging" ], + "enabledEventTypes" : [ ], + "adminEventsEnabled" : false, + "adminEventsDetailsEnabled" : false, + "identityProviders" : [ ], + "identityProviderMappers" : [ ], + "components" : { + "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy" : [ { + "id" : "d51877c5-52e3-4480-84bf-c0619cb7ffba", + "name" : "Allowed Protocol Mapper Types", + "providerId" : "allowed-protocol-mappers", + "subType" : "authenticated", + "subComponents" : { }, + "config" : { + "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "oidc-address-mapper", "saml-user-attribute-mapper", "saml-user-property-mapper", "oidc-usermodel-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper" ] + } + }, { + "id" : "01d9486e-ba62-40f4-8462-4b960bdc3baa", + "name" : "Allowed Protocol Mapper Types", + "providerId" : "allowed-protocol-mappers", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-usermodel-property-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper", "oidc-address-mapper" ] + } + }, { + "id" : "4000d1c1-c789-4553-906e-51f7debe6053", + "name" : "Allowed Client Scopes", + "providerId" : "allowed-client-templates", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "allow-default-scopes" : [ "true" ] + } + }, { + "id" : "a4d284aa-27f4-4ec5-b36c-13984812a6f7", + "name" : "Trusted Hosts", + "providerId" : "trusted-hosts", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "host-sending-registration-request-must-match" : [ "true" ], + "client-uris-must-match" : [ "true" ] + } + }, { + "id" : "750791d1-e57f-49ec-94f2-97b10c64968d", + "name" : "Consent Required", + "providerId" : "consent-required", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { } + }, { + "id" : "4362fca0-4e80-4404-9f6e-51c484fb7186", + "name" : "Max Clients Limit", + "providerId" : "max-clients", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "max-clients" : [ "200" ] + } + }, { + "id" : "550e6ec0-9239-49ad-ba41-c88908c04a6c", + "name" : "Full Scope Disabled", + "providerId" : "scope", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { } + }, { + "id" : "bebecfb2-019f-412f-9250-d65b5f4d5080", + "name" : "Allowed Client Scopes", + "providerId" : "allowed-client-templates", + "subType" : "authenticated", + "subComponents" : { }, + "config" : { + "allow-default-scopes" : [ "true" ] + } + } ], + "org.keycloak.keys.KeyProvider" : [ { + "id" : "cd059e72-1677-4ff7-a522-a06208af5c69", + "name" : "rsa-enc-generated", + "providerId" : "rsa-generated", + "subComponents" : { }, + "config" : { + "privateKey" : [ "MIIEowIBAAKCAQEAyZgCT/dHAB/Q6nd9JQAs8qOwGLJNdGsCEIgzlxh9CgbUyiRXEGNSvCKDkCcMHJqcRwOiPhY5A6ZXAuSFWt754quYxZkJAvb5Pf2MunHkbL1Z2FHit0vLB7zLpF4nBecp+OdrstQSxo97lkHlkJmm0Vyeum1B5ornUBrViI/8nFXbMg/Wcc5X1B+1vl5iEeoN4WOFerl4PJCwtq+i9i0cWpESPMKxAeu9BDWkM6rg9vVjfozT/QwdzgBDDO+qZF6LtNZsogbwto2tSGHMpM01DB2TgBt4zDUBb6yysnDvgFSYlZVz3x0hDce4Zkzw7zNbkdhdnCls5eYGn9pPo+1d5QIDAQABAoIBACidq7mYxIFN57WVpW0S//tS52PSaLCP7raN+nbyxB6FCdJASBpRKJYnDgK5G0OYEuxr2wBPUeVeWiGHESchzY7Rq9ID50DlqYnHz9awo6kU7UkcFmV/q8Q/UXgoUAxsapRva8930uCWf/viAvKDQozj8Eb3RFPCoKAPB/6fo/GLLx+QCQxh763namiwceh8QCcw6b7Bb0bY5e85+n7Ff9L/Z2ic/ObW6B8fxKLuQ3IN8DnZ3aX3gu4AY64n2+slbk/9NRxjhQeYqG9EFVK40ynQ+/melIMHtcfnLWn4JmrE0SNmkPT2etzTG4iUG8OB7e90Cuyix6JHFvObU0YKRfECgYEA7c9UBuJNj+a+Ucd4JvDwDwWHm1FdAtJMkIaQGwTt2IuW5xH1NKhQPo0Jeg9Aj+tHuwuj9EqVEyqC46lp7XUPQ/P2RKl1CikmW6IHVFMT1GrM5agAeIrmY4VjlDnYAfPmL6vm8ubNVY8SpoTx2X0DOl11YDW7c6ayEjwRUp9Y5P8CgYEA2QOECfMFtE9E2F5MeNel1sZvFznRchMr6g3YxR3W+/xIX0gv8p7dgti8QugZ2Ux8NodXyIMiuZEzWus/b3q49KrcLf01+UJ0lGx9R4/hIA4yFrjNaEyMQVNF1he0S9+BLeQuYWpTDjQQV4c/PmJ9WAHcn4x5hg+wK2ZM2VE/yRsCgYEAuUkOmQZ9lB8eLi2SKhUTlUCjtZohM++ShBCz+rlOb6fi/Up6mHqDexj8R0PW88tHai7ZoZ7yo6o9rQ/0XnUUXceZG0pEzJPfNQn7V/IawygrWMwbAdCHTQdC3NxstqjHsmDnYl39oioFSATRQrkqaLEkoL98u9EncRmoDY3l/xUCgYBA9vd5DwJfJvfCGgCkkFH6CK9K8akMkEauK3UAFV29U5nKxE5uQDapq/43vUm3rljk7gFOaktj597K0e/MjJ1/yQJe1hVpSAakRBIA8UaAlR9ThAEhvwChsa8PV0tHB2KhfVSRHwY8E0PtH/TD1TIWvX/xV1kt09Z2N4q758HDjwKBgGTK9bYYErNeaIBoNqX3/SVFYFJR8C7p9OP6Jq3q6Nmys7Zz8DiNklwZVuquynuttJsl2iLFiVFZ7gUQlW3tbGwG4ZsEJDpPMoCj2vg6Cr7HMYAbi3UFAWlvJzcsJXgGshjipGE3E7pAM+g65vp/kPToiXzLV5v1QS1Yu0iFgpwe" ], + "keyUse" : [ "enc" ], + "certificate" : [ "MIICpTCCAY0CBgGB2C/SLjANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtmZWFzaWJpbGl0eTAeFw0yMjA3MDcxMDIyMDFaFw0zMjA3MDcxMDIzNDFaMBYxFDASBgNVBAMMC2ZlYXNpYmlsaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyZgCT/dHAB/Q6nd9JQAs8qOwGLJNdGsCEIgzlxh9CgbUyiRXEGNSvCKDkCcMHJqcRwOiPhY5A6ZXAuSFWt754quYxZkJAvb5Pf2MunHkbL1Z2FHit0vLB7zLpF4nBecp+OdrstQSxo97lkHlkJmm0Vyeum1B5ornUBrViI/8nFXbMg/Wcc5X1B+1vl5iEeoN4WOFerl4PJCwtq+i9i0cWpESPMKxAeu9BDWkM6rg9vVjfozT/QwdzgBDDO+qZF6LtNZsogbwto2tSGHMpM01DB2TgBt4zDUBb6yysnDvgFSYlZVz3x0hDce4Zkzw7zNbkdhdnCls5eYGn9pPo+1d5QIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAwKApdladuIgKDg+Bidq3ZVcQaua6ugUSjgWh5ZJcm1VCnrvdi8K1EtZd13uvJo4GUNPxRQPlu5/eDjHiil2gA7z1wz40X7i0KvTD3MnR5E+aHzHL38+sdYOPCUnG4BAni+Au9I5ZqyN5rg7V0ySzttdhlCqLnh0fi6/OebcoDq0NBQ7MF7sUZGVTlR/GTxPaK1rXyUFM9IvzhoorqM/FXMemzzu1F0pO0VYk52q34GedP5P3N87cgCe/3hgLrq6dyogshZ4ujrtcCk1ezOk9vVNx+rbPpaC39P542pA+FGFaU8epYapTL0huv6SPbfFIyUUGP2V5Cwah+e5GKw73j" ], + "priority" : [ "100" ] + } + }, { + "id" : "f69d1970-46ab-4efa-b4cd-1ce3273e6c7e", + "name" : "rsa-generated", + "providerId" : "rsa-generated", + "subComponents" : { }, + "config" : { + "privateKey" : [ "MIIEpAIBAAKCAQEAmDrcdVuG3KxXMVxKEzmlGreXK8mOBow7s7KE9wLsMzgcoPTxb5QMDnQdm5JFjxr6b0Bl3DUuQB4woSIqnX1LG7pF3bBkl6mCizXh2XGd0kFKhlV4EljsN4/1Evb99hr9Fv2yQsmCIL6e6nd1lX8TP7XNZq16EBYumeGk7jhx44nZfADfUC6DLPyV+XnN6bifbn8ld+XpDCGhBDr2L7mFWzhJflKAY2iJOg1JC6MeVuOfjMGWq4dhcSvP2rvEGNtTvjTW8gAmVF8RqXUdq+tqvJSqjRK1C99cpHcmr8T7630QS9G8M3XYR/iI32Sj0YuR6VyoFnVUnURzFRFU3t26HQIDAQABAoIBAEq4WY2hJ0kZrpKj4hgdq1S52JG9lODR5FwHvAwiex2I5UR79iX2XRSbGg1KdqoPa+0/hr/XuqPuLaBpzNEQttUdUT3HXxiyM0lxYTIB+p1BPvtA6HbY/tkm5/wvD+jExoWKcP0nO6Am8InVqPmALkqPSgqkC83plWYiw3nKatxsASrKO4R0Qp5RWUo8GNkDxXh3pHwlYjFvn4t4Nh1QjVTTljcN2gJqHS2D5dIfjVCWHgBZL5Scd9wu+BjysYd0DQRBC9Xh7v2dQzSAvaouaFvsdpiYnHsVgBrGvD1Scctg7wVO/PNtspKpcKgpaEP1rD4l6zN6FI5Ua9tt5CHkO2ECgYEA5gvWUjwtzFpQzmby4zRw8kqLFQuCl4UIJ5QThJD+Oqr7yXn0CZcNqDZ8tUZNcTxytS9YYyiU1RTghdXgGPEgSC1bSOWyxLMJu585aaxA8el9fSBCg17SbuG6THEJ1yOkWxDFfhqfXjQ6LGw2Ru268kITlA3POU9GGtMTBEVBUb8CgYEAqWeLViUhchtozmt1AJGG2EWn0RwG45YcNEXBLxvoumEHYO1acdSI+ekB8Hviovq1TcJkLBSE0Qz505nw6ckD6CpMubs1uPu0cjrXqr5wlF+P/rfBEJqipS31xwyi9S0NqKOKBzKqPrzfH2G4YwXUL/QMlcYDL4wPU3vqU8j5syMCgYEAoh7xeZ7jf8Kec/dlcO2CM56JCdnEvNeJ+aqHXsN4Bwx8yW5ip2eGvmc31+Clrwm0pS+qkKcGzGwcFvW1Kp6z62nbjTIjnC+4yjraETjNxC6Su13CwiZPEsmNq1V2Y+HAcFUPeWF1ssQHw0q3raDYQOaEObDJu0+8zia2ninYcK0CgYAjdY8O6xrDHcWkX43QHqYRIxNri+hNPyCMOIWlbLwcNy8qNMSXyxsY5JMJWYUpBD1rF2OMbocWkxbAGhr5dKAiuqfwwKUQIW+18WcvUEmUZSRo9uGsrhGZbbNihNyfYVzYjdLYitxj4Xj6wqOr5o5xsy3nM9l63GBg4zE7dHf/7QKBgQDcOa/VUvVuIeoD3iGIm/aavc7NVDlA0U4RD6Ehdlrcpm1s/SbRbX3UY2X6ANxEik867XBBeB8ViT/D0qKmT/FFd5z9cS3jcA+oHU3KaKwsFfC80ixCVhDrmX+Rt+5B8fuCw+zU8WRlo9rd/T4WVMctJju6gM8I4Mxk2VjKeRCPcA==" ], + "keyUse" : [ "sig" ], + "certificate" : [ "MIICpTCCAY0CBgGB2C/RqjANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtmZWFzaWJpbGl0eTAeFw0yMjA3MDcxMDIyMDFaFw0zMjA3MDcxMDIzNDFaMBYxFDASBgNVBAMMC2ZlYXNpYmlsaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmDrcdVuG3KxXMVxKEzmlGreXK8mOBow7s7KE9wLsMzgcoPTxb5QMDnQdm5JFjxr6b0Bl3DUuQB4woSIqnX1LG7pF3bBkl6mCizXh2XGd0kFKhlV4EljsN4/1Evb99hr9Fv2yQsmCIL6e6nd1lX8TP7XNZq16EBYumeGk7jhx44nZfADfUC6DLPyV+XnN6bifbn8ld+XpDCGhBDr2L7mFWzhJflKAY2iJOg1JC6MeVuOfjMGWq4dhcSvP2rvEGNtTvjTW8gAmVF8RqXUdq+tqvJSqjRK1C99cpHcmr8T7630QS9G8M3XYR/iI32Sj0YuR6VyoFnVUnURzFRFU3t26HQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAoqnsCV2hN7/osX5ebm7KiYg87bZ4HpydLj12oSAUUK0h6U4RvgBbuZLgaVP7I8Ozbq72F5Rt48m+fY30LxNgWuazI7axJdLrE/HeEo9mCjP3F9ci1lsAwlcXoFmtsGlmlDjFE1WChAwj9D8cwZG4bmv+mRsFP9iJx5n7RXiTdS/OyG44Ufv3XPqx/QVY7I4I+N50JC0mBlFm7GlQLAU9lkZRlnxcbh4uxe4MAY9R7t+CBLYILTCQCCz39U/7UFzfGBAV6Y4mSF/cq50LoqalN+g2ZxMwH5wQs9EpZHBOTQNf7FOf28jc/3wPL2bfkte0XuCAUxAulZAk+PskP6Rm7" ], + "priority" : [ "100" ] + } + }, { + "id" : "1bee6796-da7c-4373-a9fd-3e7f172ddf3e", + "name" : "aes-generated", + "providerId" : "aes-generated", + "subComponents" : { }, + "config" : { + "kid" : [ "9e3b56b9-9f51-453a-b725-a0a10dd44198" ], + "secret" : [ "CuIhnM65L38Oo0Eo8ZSi9w" ], + "priority" : [ "100" ] + } + }, { + "id" : "45eb7073-19e3-4c37-8f09-a509de9b77ba", + "name" : "hmac-generated", + "providerId" : "hmac-generated", + "subComponents" : { }, + "config" : { + "kid" : [ "4d297444-bd22-42d5-80f9-a0712035ae31" ], + "secret" : [ "S6tzdFt6stBKXSjVkYnIQhmNHhPdKnZsL-75MSV5pAgzIXIJxW3TWYYR2aETUgoiz_7zoAKAqw0b9gO7JhRuIw" ], + "priority" : [ "100" ], + "algorithm" : [ "HS256" ] + } + } ] + }, + "internationalizationEnabled" : false, + "supportedLocales" : [ ], + "authenticationFlows" : [ { + "id" : "1591c55b-b9ce-4f96-9b45-630c8c1daa90", + "alias" : "Account verification options", + "description" : "Method with which to verity the existing account", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "idp-email-verification", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "ALTERNATIVE", + "priority" : 20, + "flowAlias" : "Verify Existing Account by Re-authentication", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "25115f67-6dc3-426e-83a2-46d069b2a379", + "alias" : "Authentication Options", + "description" : "Authentication options.", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "basic-auth", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "basic-auth-otp", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "auth-spnego", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 30, + "userSetupAllowed" : false, + "autheticatorFlow" : false + } ] + }, { + "id" : "f1ef28be-073d-4c42-abfd-3dbc5bdd50d2", + "alias" : "Browser - Conditional OTP", + "description" : "Flow to determine if the OTP is required for the authentication", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "auth-otp-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + } ] + }, { + "id" : "e57adbb9-c56b-4ab1-a5a8-d0aeb6d89075", + "alias" : "Direct Grant - Conditional OTP", + "description" : "Flow to determine if the OTP is required for the authentication", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "direct-grant-validate-otp", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + } ] + }, { + "id" : "7447bc9f-50ce-44b9-888a-68899342f751", + "alias" : "First broker login - Conditional OTP", + "description" : "Flow to determine if the OTP is required for the authentication", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "auth-otp-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + } ] + }, { + "id" : "71def9c4-7877-488d-acab-4ada493fc0a2", + "alias" : "Handle Existing Account", + "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "idp-confirm-link", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 20, + "flowAlias" : "Account verification options", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "a6e2ed3e-cf82-415c-928f-403595ee2587", + "alias" : "Reset - Conditional OTP", + "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "reset-otp", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + } ] + }, { + "id" : "8ddb20e9-a1d1-48d9-836d-ba2ed0d4ee85", + "alias" : "User creation or linking", + "description" : "Flow for the existing/non-existing user alternatives", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticatorConfig" : "create unique user config", + "authenticator" : "idp-create-user-if-unique", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "ALTERNATIVE", + "priority" : 20, + "flowAlias" : "Handle Existing Account", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "4de10554-cd01-4817-bc60-e89f56ed786f", + "alias" : "Verify Existing Account by Re-authentication", + "description" : "Reauthentication of existing account", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "idp-username-password-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 20, + "flowAlias" : "First broker login - Conditional OTP", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "048dff4a-cdf8-4642-a12a-552d25566f71", + "alias" : "browser", + "description" : "browser based authentication", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "auth-cookie", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "auth-spnego", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "identity-provider-redirector", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 25, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "ALTERNATIVE", + "priority" : 30, + "flowAlias" : "forms", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "8f19d645-9b9f-4936-9512-e0009dfbb9c8", + "alias" : "clients", + "description" : "Base authentication for clients", + "providerId" : "client-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "client-secret", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "client-jwt", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "client-secret-jwt", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 30, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "client-x509", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 40, + "userSetupAllowed" : false, + "autheticatorFlow" : false + } ] + }, { + "id" : "403953bd-1c17-44c5-92b0-c0952c4b3763", + "alias" : "direct grant", + "description" : "OpenID Connect Resource Owner Grant", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "direct-grant-validate-username", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "direct-grant-validate-password", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 30, + "flowAlias" : "Direct Grant - Conditional OTP", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "b17452c1-b033-43d0-be9a-94ac47be16ae", + "alias" : "docker auth", + "description" : "Used by Docker clients to authenticate against the IDP", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "docker-http-basic-authenticator", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + } ] + }, { + "id" : "53d6fadb-64eb-48f1-9735-26a9b9eab6ac", + "alias" : "first broker login", + "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticatorConfig" : "review profile config", + "authenticator" : "idp-review-profile", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 20, + "flowAlias" : "User creation or linking", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "6de11df1-401d-429a-8829-1891fb438ba9", + "alias" : "forms", + "description" : "Username, password, otp and other auth forms.", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "auth-username-password-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 20, + "flowAlias" : "Browser - Conditional OTP", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "f024a9f0-a435-4529-bd2a-7b08b4629873", + "alias" : "http challenge", + "description" : "An authentication flow based on challenge-response HTTP Authentication Schemes", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "no-cookie-redirect", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 20, + "flowAlias" : "Authentication Options", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "7d41146f-09b5-47e1-a079-3d49731a5f5e", + "alias" : "registration", + "description" : "registration flow", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "registration-page-form", + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 10, + "flowAlias" : "registration form", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "057d65e7-1f44-4a36-9dfe-2adc8053f6ab", + "alias" : "registration form", + "description" : "registration form", + "providerId" : "form-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "registration-user-creation", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "registration-profile-action", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 40, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "registration-password-action", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 50, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "registration-recaptcha-action", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 60, + "userSetupAllowed" : false, + "autheticatorFlow" : false + } ] + }, { + "id" : "db258619-ca92-4ec7-872b-a2b43563d241", + "alias" : "reset credentials", + "description" : "Reset credentials for a user if they forgot their password or something", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "reset-credentials-choose-user", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "reset-credential-email", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticator" : "reset-password", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 30, + "userSetupAllowed" : false, + "autheticatorFlow" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 40, + "flowAlias" : "Reset - Conditional OTP", + "userSetupAllowed" : false, + "autheticatorFlow" : true + } ] + }, { + "id" : "632d34f5-f7ec-4efe-a843-2f88b17c517a", + "alias" : "saml ecp", + "description" : "SAML ECP Profile Authentication Flow", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "http-basic-authenticator", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "userSetupAllowed" : false, + "autheticatorFlow" : false + } ] + } ], + "authenticatorConfig" : [ { + "id" : "f2d03e45-79a1-40b1-bd11-2ac162e00adf", + "alias" : "create unique user config", + "config" : { + "require.password.update.after.registration" : "false" + } + }, { + "id" : "1289ed55-66fb-474b-a187-1e7addff574c", + "alias" : "review profile config", + "config" : { + "update.profile.on.first.login" : "missing" + } + } ], + "requiredActions" : [ { + "alias" : "CONFIGURE_TOTP", + "name" : "Configure OTP", + "providerId" : "CONFIGURE_TOTP", + "enabled" : true, + "defaultAction" : false, + "priority" : 10, + "config" : { } + }, { + "alias" : "terms_and_conditions", + "name" : "Terms and Conditions", + "providerId" : "terms_and_conditions", + "enabled" : false, + "defaultAction" : false, + "priority" : 20, + "config" : { } + }, { + "alias" : "UPDATE_PASSWORD", + "name" : "Update Password", + "providerId" : "UPDATE_PASSWORD", + "enabled" : true, + "defaultAction" : false, + "priority" : 30, + "config" : { } + }, { + "alias" : "UPDATE_PROFILE", + "name" : "Update Profile", + "providerId" : "UPDATE_PROFILE", + "enabled" : true, + "defaultAction" : false, + "priority" : 40, + "config" : { } + }, { + "alias" : "VERIFY_EMAIL", + "name" : "Verify Email", + "providerId" : "VERIFY_EMAIL", + "enabled" : true, + "defaultAction" : false, + "priority" : 50, + "config" : { } + }, { + "alias" : "delete_account", + "name" : "Delete Account", + "providerId" : "delete_account", + "enabled" : false, + "defaultAction" : false, + "priority" : 60, + "config" : { } + }, { + "alias" : "update_user_locale", + "name" : "Update User Locale", + "providerId" : "update_user_locale", + "enabled" : true, + "defaultAction" : false, + "priority" : 1000, + "config" : { } + } ], + "browserFlow" : "browser", + "registrationFlow" : "registration", + "directGrantFlow" : "direct grant", + "resetCredentialsFlow" : "reset credentials", + "clientAuthenticationFlow" : "clients", + "dockerAuthenticationFlow" : "docker auth", + "attributes" : { + "cibaBackchannelTokenDeliveryMode" : "poll", + "cibaExpiresIn" : "120", + "cibaAuthRequestedUserHint" : "login_hint", + "oauth2DeviceCodeLifespan" : "600", + "oauth2DevicePollingInterval" : "5", + "parRequestUriLifespan" : "60", + "cibaInterval" : "5" + }, + "keycloakVersion" : "15.0.2", + "userManagedAccessAllowed" : false, + "clientProfiles" : { + "profiles" : [ ] + }, + "clientPolicies" : { + "policies" : [ ] + } } \ No newline at end of file From 83ee55d52db9a96f926a01f090592c8db582e06b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 7 Jul 2022 13:18:21 +0200 Subject: [PATCH 029/118] update readme - remove keycloak url setting from local setup --- feasibility-portal/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 58e6b6c..2018fd4 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -60,7 +60,6 @@ If you use the default local feasibility portal setup you will only have to chan | file | environment variable | value for local setup | |--|--|--| -|keycloak/.env|FEASIBILITY_KEYCLOAK_BASE_URL| base-url-of-your-local-feasibility-portal/auth | |keycloak/.env|FEASIBILITY_KEYCLOAK_ADMIN_PW| choose a secure password here e.g. Ykc2PINWatNqL5Wq,OIxFz1Sv3dzmQ2| |backend/.env|FEASIBILITY_BACKEND_AKTIN_ENABLED|false| |backend/.env|FEASIBILITY_BACKEND_DIRECT_ENABLED|true| From d9d656b79006a45dbb4548cd213842d99910ac91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 8 Jul 2022 14:16:44 +0200 Subject: [PATCH 030/118] change obfuscation to +-5 and return 0 if < 5 after obfuscation --- .../aktin-client/client-exec-scripts/call-cql.sh | 10 ++++++++-- .../aktin-client/client-exec-scripts/call-flare.sh | 9 +++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh index 663a249..8024078 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh @@ -11,11 +11,17 @@ echo "----END REQUEST----" >> aktin-requests.log RESP=$(sh execute-cql.sh "$QUERY_INPUT") if [ $CLIENT_OBFUSCATE = true ]; then - if [ $RESP != 0 ];then - RESP=$(($RESP - ($RESP % 10) + 10)) + OBFUSCATION_INTEGER=$(grep -m1 -ao '[1-5]' /dev/random | head -n1) + OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) + RESP=$(($RESP $OBFUSCATION_SIGN $OBFUSCATION_INTEGER)) + + if [ $RESP -lt 5 ]; then + RESP=0 fi fi + +echo "Response after obfuscation $RESP" echo "----BEGIN RESPONSE----" >> aktin-requests.log echo $RESP >> aktin-requests.log echo "----END RESPONSE----" >> aktin-requests.log diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh index 1f0b5af..f6acbc0 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh @@ -15,11 +15,16 @@ RESP=$(curl --location --request POST "$FLARE_BASE_URL/query/execute" \ --data-raw "$QUERY_INPUT") if [ $CLIENT_OBFUSCATE = true ]; then - if [ $RESP != 0 ];then - RESP=$(($RESP - ($RESP % 10) + 10)) + OBFUSCATION_INTEGER=$(grep -m1 -ao '[1-5]' /dev/random | head -n1) + OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) + RESP=$(($RESP $OBFUSCATION_SIGN $OBFUSCATION_INTEGER)) + + if [ $RESP -lt 5 ]; then + RESP=0 fi fi + echo "----BEGIN RESPONSE----" >> aktin-requests.log echo $RESP >> aktin-requests.log echo "----END RESPONSE----" >> aktin-requests.log From 20b45502c96c90f3787295a0d7b886b22ba03fc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 8 Jul 2022 14:37:35 +0200 Subject: [PATCH 031/118] fix: remove incorrect log message to stdout --- .../aktin-client/client-exec-scripts/call-cql.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh index 8024078..af5f284 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh @@ -20,8 +20,6 @@ if [ $CLIENT_OBFUSCATE = true ]; then fi fi - -echo "Response after obfuscation $RESP" echo "----BEGIN RESPONSE----" >> aktin-requests.log echo $RESP >> aktin-requests.log echo "----END RESPONSE----" >> aktin-requests.log From daf66256b4f7372a990d86cc4463ab63568093c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 8 Jul 2022 14:57:45 +0200 Subject: [PATCH 032/118] inclue 0 in addition of random numbers and return 0 based if unobfuscated result < 5 --- .../aktin-client/client-exec-scripts/call-cql.sh | 8 ++++---- .../aktin-client/client-exec-scripts/call-flare.sh | 9 ++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh index af5f284..787665a 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh @@ -11,12 +11,12 @@ echo "----END REQUEST----" >> aktin-requests.log RESP=$(sh execute-cql.sh "$QUERY_INPUT") if [ $CLIENT_OBFUSCATE = true ]; then - OBFUSCATION_INTEGER=$(grep -m1 -ao '[1-5]' /dev/random | head -n1) - OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) - RESP=$(($RESP $OBFUSCATION_SIGN $OBFUSCATION_INTEGER)) - if [ $RESP -lt 5 ]; then RESP=0 + else + OBFUSCATION_INTEGER=$(grep -m1 -ao '[0-10]' /dev/random | head -n1) + OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) + RESP=$(($RESP $OBFUSCATION_SIGN $OBFUSCATION_INTEGER - 5)) fi fi diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh index f6acbc0..63e6c4b 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh @@ -15,16 +15,15 @@ RESP=$(curl --location --request POST "$FLARE_BASE_URL/query/execute" \ --data-raw "$QUERY_INPUT") if [ $CLIENT_OBFUSCATE = true ]; then - OBFUSCATION_INTEGER=$(grep -m1 -ao '[1-5]' /dev/random | head -n1) - OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) - RESP=$(($RESP $OBFUSCATION_SIGN $OBFUSCATION_INTEGER)) - if [ $RESP -lt 5 ]; then RESP=0 + else + OBFUSCATION_INTEGER=$(grep -m1 -ao '[0-10]' /dev/random | head -n1) + OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) + RESP=$(($RESP $OBFUSCATION_SIGN $OBFUSCATION_INTEGER - 5)) fi fi - echo "----BEGIN RESPONSE----" >> aktin-requests.log echo $RESP >> aktin-requests.log echo "----END RESPONSE----" >> aktin-requests.log From ac95a671123568e648a63820d61c68032d22b482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 11 Jul 2022 18:26:34 +0200 Subject: [PATCH 033/118] fix: add and subtract value between -5 and +5 correctly and move check for result <5 after obfuscation --- .../client-exec-scripts/call-cql.sh | 23 ++++++++++++++----- .../client-exec-scripts/call-flare.sh | 21 ++++++++++++----- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh index 787665a..d523db4 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh @@ -10,13 +10,24 @@ echo "----END REQUEST----" >> aktin-requests.log RESP=$(sh execute-cql.sh "$QUERY_INPUT") -if [ $CLIENT_OBFUSCATE = true ]; then +echo $RESP >> aktin-requests.log + +getObfuscatedResp() { + OBFUSCATION_INTEGER=$(grep -m1 -ao '[0-5]' /dev/random | head -n1) + OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) + + if [ $OBFUSCATION_INTEGER -eq 0 ] && [ $OBFUSCATION_SIGN == '-' ]; then + getObfuscatedResp $1 + else + echo $(($1 $OBFUSCATION_SIGN $OBFUSCATION_INTEGER)) + fi + +} + +if [ $CLIENT_OBFUSCATE == true ]; then + RESP=$(getObfuscatedResp ${RESP}) if [ $RESP -lt 5 ]; then - RESP=0 - else - OBFUSCATION_INTEGER=$(grep -m1 -ao '[0-10]' /dev/random | head -n1) - OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) - RESP=$(($RESP $OBFUSCATION_SIGN $OBFUSCATION_INTEGER - 5)) + RESP="" fi fi diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh index 63e6c4b..05f301c 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh @@ -14,13 +14,22 @@ RESP=$(curl --location --request POST "$FLARE_BASE_URL/query/execute" \ --header 'Content-Type: application/sq+json' \ --data-raw "$QUERY_INPUT") -if [ $CLIENT_OBFUSCATE = true ]; then +getObfuscatedResp() { + OBFUSCATION_INTEGER=$(grep -m1 -ao '[0-5]' /dev/random | head -n1) + OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) + + if [ $OBFUSCATION_INTEGER -eq 0 ] && [ $OBFUSCATION_SIGN == '-' ]; then + getObfuscatedResp $1 + else + echo $(($1 $OBFUSCATION_SIGN $OBFUSCATION_INTEGER)) + fi + +} + +if [ $CLIENT_OBFUSCATE == true ]; then + RESP=$(getObfuscatedResp ${RESP}) if [ $RESP -lt 5 ]; then - RESP=0 - else - OBFUSCATION_INTEGER=$(grep -m1 -ao '[0-10]' /dev/random | head -n1) - OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) - RESP=$(($RESP $OBFUSCATION_SIGN $OBFUSCATION_INTEGER - 5)) + RESP="" fi fi From 9cfbdeb709d5244d7ce6fc4433fe88ed9c74911b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 12 Jul 2022 12:31:07 +0200 Subject: [PATCH 034/118] change obfuscation to using RANDOM var --- .../client-exec-scripts/call-cql.sh | 21 ++++--------------- .../client-exec-scripts/call-flare.sh | 19 ++++------------- 2 files changed, 8 insertions(+), 32 deletions(-) diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh index d523db4..655e0fd 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh @@ -10,24 +10,11 @@ echo "----END REQUEST----" >> aktin-requests.log RESP=$(sh execute-cql.sh "$QUERY_INPUT") -echo $RESP >> aktin-requests.log - -getObfuscatedResp() { - OBFUSCATION_INTEGER=$(grep -m1 -ao '[0-5]' /dev/random | head -n1) - OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) - - if [ $OBFUSCATION_INTEGER -eq 0 ] && [ $OBFUSCATION_SIGN == '-' ]; then - getObfuscatedResp $1 - else - echo $(($1 $OBFUSCATION_SIGN $OBFUSCATION_INTEGER)) - fi - -} - -if [ $CLIENT_OBFUSCATE == true ]; then - RESP=$(getObfuscatedResp ${RESP}) +if [ "$CLIENT_OBFUSCATE" = true ]; then + OBFUSCATION_INTEGER=$(($RANDOM % 11 - 5)) + RESP=$(($RESP + $OBFUSCATION_INTEGER)) if [ $RESP -lt 5 ]; then - RESP="" + RESP=0 fi fi diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh index 05f301c..4ca75cf 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh @@ -14,22 +14,11 @@ RESP=$(curl --location --request POST "$FLARE_BASE_URL/query/execute" \ --header 'Content-Type: application/sq+json' \ --data-raw "$QUERY_INPUT") -getObfuscatedResp() { - OBFUSCATION_INTEGER=$(grep -m1 -ao '[0-5]' /dev/random | head -n1) - OBFUSCATION_SIGN=$(grep -m1 -ao '[-+]' /dev/random) - - if [ $OBFUSCATION_INTEGER -eq 0 ] && [ $OBFUSCATION_SIGN == '-' ]; then - getObfuscatedResp $1 - else - echo $(($1 $OBFUSCATION_SIGN $OBFUSCATION_INTEGER)) - fi - -} - -if [ $CLIENT_OBFUSCATE == true ]; then - RESP=$(getObfuscatedResp ${RESP}) +if [ "$CLIENT_OBFUSCATE" = true ]; then + OBFUSCATION_INTEGER=$(($RANDOM % 11 - 5)) + RESP=$(($RESP + $OBFUSCATION_INTEGER)) if [ $RESP -lt 5 ]; then - RESP="" + RESP=0 fi fi From 7c710d6ed0cb287e7f55ad6d34ba278fb31e909b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 12 Jul 2022 14:13:54 +0200 Subject: [PATCH 035/118] update aktin-client version --- feasibility-triangle/aktin-client/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 1f0d56c..597f538 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.3.5-RC4 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.4.0 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} From a3e7be7640fa8c2b528b48e67a275386b55f846b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 12 Aug 2022 13:45:43 +0200 Subject: [PATCH 036/118] fix: quote QUERY_INPUT when writing to log --- .../aktin-client/client-exec-scripts/call-cql.sh | 4 ++-- .../aktin-client/client-exec-scripts/call-flare.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh index 655e0fd..33e7591 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh @@ -5,7 +5,7 @@ CLIENT_OBFUSCATE=${CLIENT_OBFUSCATE:-true} echo "##### INCOMING REQUEST at $(date) #####" >> aktin-requests.log echo "----BEGIN REQUEST----" >> aktin-requests.log -echo $QUERY_INPUT >> aktin-requests.log +echo "$QUERY_INPUT" >> aktin-requests.log echo "----END REQUEST----" >> aktin-requests.log RESP=$(sh execute-cql.sh "$QUERY_INPUT") @@ -19,7 +19,7 @@ if [ "$CLIENT_OBFUSCATE" = true ]; then fi echo "----BEGIN RESPONSE----" >> aktin-requests.log -echo $RESP >> aktin-requests.log +echo "$RESP" >> aktin-requests.log echo "----END RESPONSE----" >> aktin-requests.log printf "$RESP" \ No newline at end of file diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh index 4ca75cf..95ba4fb 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh @@ -7,7 +7,7 @@ QUERY_INPUT=`cat` echo "##### INCOMING REQUEST at $(date) #####" >> aktin-requests.log echo "----BEGIN REQUEST----" >> aktin-requests.log -echo $QUERY_INPUT >> aktin-requests.log +echo "$QUERY_INPUT" >> aktin-requests.log echo "----END REQUEST----" >> aktin-requests.log RESP=$(curl --location --request POST "$FLARE_BASE_URL/query/execute" \ @@ -23,7 +23,7 @@ if [ "$CLIENT_OBFUSCATE" = true ]; then fi echo "----BEGIN RESPONSE----" >> aktin-requests.log -echo $RESP >> aktin-requests.log +echo "$RESP" >> aktin-requests.log echo "----END RESPONSE----" >> aktin-requests.log printf "$RESP" \ No newline at end of file From 0242bb186ca1e1fca8372125d202c5383988db15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 12 Aug 2022 13:51:50 +0200 Subject: [PATCH 037/118] update aktin client --- feasibility-triangle/aktin-client/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 597f538..bc6ab5f 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.4.0 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.5.0 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} From 53a7a6d3da5ff50d8d02912ce42e710b50bd6ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20R=C3=BChle?= Date: Mon, 15 Aug 2022 17:08:55 +0200 Subject: [PATCH 038/118] Add Shell Script Linter Job to CI --- .github/workflows/ci.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca61550..8c6e9c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,9 +18,22 @@ env: jobs: + lint: + runs-on: ubuntu-latest + + steps: + + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Check shell scripts + uses: ludeeus/action-shellcheck@master + test: runs-on: ubuntu-latest + needs: lint + steps: - name: Checkout Deploy Repo uses: actions/checkout@v2 From 42371eb8e3052908744ff029398a7443855abe14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20R=C3=BChle?= Date: Tue, 16 Aug 2022 13:20:45 +0200 Subject: [PATCH 039/118] Fix Shellcheck Warnings in Scripts --- feasibility-portal/down-feasibility-portal.sh | 12 ++++---- feasibility-portal/dsf-broker/down.sh | 4 +-- feasibility-portal/dsf-broker/start.sh | 12 ++++---- feasibility-portal/dsf-broker/stop.sh | 4 +-- .../initialise-portal-env-files.sh | 12 ++++---- feasibility-portal/setup-base-auth.sh | 6 ++-- .../start-feasibility-portal-local.sh | 12 ++++---- .../start-feasibility-portal.sh | 12 ++++---- feasibility-portal/stop-feasibility-portal.sh | 12 ++++---- .../client-exec-scripts/call-cql.sh | 30 +++++++++++-------- .../client-exec-scripts/call-flare.sh | 30 +++++++++++-------- .../aktin-client/client-exec-scripts/echo.sh | 4 +-- .../client-exec-scripts/execute-cql.sh | 21 +++++++------ feasibility-triangle/down-triangle.sh | 14 ++++----- feasibility-triangle/dsf-client/down.sh | 4 +-- feasibility-triangle/dsf-client/start.sh | 14 ++++----- feasibility-triangle/dsf-client/stop.sh | 4 +-- feasibility-triangle/get-mii-testdata.sh | 9 +++--- .../initialise-triangle-env-files.sh | 12 ++++---- feasibility-triangle/reset-fhir-server.sh | 6 ++-- .../rev-proxy/add-nginx-user.sh | 2 +- .../rev-proxy/generateCert.sh | 4 +-- .../rev-proxy/q_nginx_start.sh | 4 +-- feasibility-triangle/rev-proxy/reset-nginx.sh | 6 ++-- .../rev-proxy/setup-base-auth.sh | 7 ++--- feasibility-triangle/setup-base-auth.sh | 4 +-- feasibility-triangle/start-triangle.sh | 12 ++++---- feasibility-triangle/stop-triangle.sh | 14 ++++----- feasibility-triangle/upload-testdata.sh | 10 +++---- test/run_tests.sh | 25 ++++++++-------- troubleshooting/feasibility-test.sh | 26 ++++++++-------- 31 files changed, 176 insertions(+), 172 deletions(-) diff --git a/feasibility-portal/down-feasibility-portal.sh b/feasibility-portal/down-feasibility-portal.sh index 03b9f95..0d77c63 100755 --- a/feasibility-portal/down-feasibility-portal.sh +++ b/feasibility-portal/down-feasibility-portal.sh @@ -2,10 +2,10 @@ COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/keycloak/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/backend/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/gui/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-broker/docker-compose.yml down -sh $BASE_DIR/dsf-broker/down.sh $COMPOSE_PROJECT +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/keycloak/docker-compose.yml down +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/backend/docker-compose.yml down +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/gui/docker-compose.yml down +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-broker/docker-compose.yml down +sh "$BASE_DIR"/dsf-broker/down.sh "$COMPOSE_PROJECT" diff --git a/feasibility-portal/dsf-broker/down.sh b/feasibility-portal/dsf-broker/down.sh index 5f42f5b..93adcf5 100755 --- a/feasibility-portal/dsf-broker/down.sh +++ b/feasibility-portal/dsf-broker/down.sh @@ -3,6 +3,6 @@ # Arguments # 1: docker-compose project token -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $1 -f $BASE_DIR/docker-compose.yml down +docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml down diff --git a/feasibility-portal/dsf-broker/start.sh b/feasibility-portal/dsf-broker/start.sh index d54f0b7..595b592 100755 --- a/feasibility-portal/dsf-broker/start.sh +++ b/feasibility-portal/dsf-broker/start.sh @@ -1,16 +1,16 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash # Arguments # 1: docker-compose project token -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" # FHIR ------------------------------------------------------------------------ echo "Starting ZARS FHIR app..." -docker-compose -p $1 -f $BASE_DIR/docker-compose.yml up -d dsf-zars-fhir-proxy +docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml up -d dsf-zars-fhir-proxy echo -n "Waiting for full startup of the DSF ZARS FHIR app..." -( docker-compose -p $1 -f $BASE_DIR/docker-compose.yml logs -f dsf-zars-fhir-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' +( docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml logs -f dsf-zars-fhir-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' echo "DONE" # BPE ------------------------------------------------------------------------- @@ -20,7 +20,7 @@ chmod a+w -R bpe/app/last_event echo "DONE" echo "Starting ZARS BPE app..." -docker-compose -p $1 -f $BASE_DIR/docker-compose.yml up -d dsf-zars-bpe-app +docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml up -d dsf-zars-bpe-app echo -n "Waiting for full startup of the DSF ZARS BPE app..." -( docker-compose -p $1 -f $BASE_DIR/docker-compose.yml logs -f dsf-zars-bpe-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' +( docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml logs -f dsf-zars-bpe-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' echo "DONE" diff --git a/feasibility-portal/dsf-broker/stop.sh b/feasibility-portal/dsf-broker/stop.sh index 83b63c9..3a1f2ae 100755 --- a/feasibility-portal/dsf-broker/stop.sh +++ b/feasibility-portal/dsf-broker/stop.sh @@ -3,6 +3,6 @@ # Arguments # 1: docker-compose project token -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $1 -f $BASE_DIR/docker-compose.yml stop +docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml stop diff --git a/feasibility-portal/initialise-portal-env-files.sh b/feasibility-portal/initialise-portal-env-files.sh index 7ea720b..52c1b92 100644 --- a/feasibility-portal/initialise-portal-env-files.sh +++ b/feasibility-portal/initialise-portal-env-files.sh @@ -1,13 +1,13 @@ -#!/bin/sh +#!/bin/bash envfiles=( "gui/deploy-config.json" "backend/.env" "dsf-broker/.env" "keycloak/.env" "aktin-broker/.env") for file in "${envfiles[@]}" do if [[ -f "$file" ]]; then - printf ".env file $file already exists - not copying default env \n" - printf "Please check if your current env file $file is missing any params from the $file.default file and copy them as appropriate\n" - else - cp "$file.default" $file - fi + printf ".env file %s already exists - not copying default env \n" "$file" + printf "Please check if your current env file %s is missing any params from the %s file and copy them as appropriate\n" "$file" "$file.default" + else + cp "$file.default" "$file" + fi done diff --git a/feasibility-portal/setup-base-auth.sh b/feasibility-portal/setup-base-auth.sh index 0bdfb13..c797110 100755 --- a/feasibility-portal/setup-base-auth.sh +++ b/feasibility-portal/setup-base-auth.sh @@ -8,11 +8,11 @@ # #fi -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" echo "Generating default certificate..." -docker run --rm -v $BASE_DIR/auth:/export --entrypoint openssl alpine/openssl req -nodes -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout /export/key.pem -out /export/cert.pem -days 99999 -docker run --rm -v $BASE_DIR/auth:/export alpine chmod 655 /export/* +docker run --rm -v "$BASE_DIR"/auth:/export --entrypoint openssl alpine/openssl req -nodes -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout /export/key.pem -out /export/cert.pem -days 99999 +docker run --rm -v "$BASE_DIR"/auth:/export alpine chmod 655 /export/* #echo "generating user: $1 , with password: $2" #docker run --rm --entrypoint htpasswd registry:2.7.0 -nb $1 $2 > .htpasswd diff --git a/feasibility-portal/start-feasibility-portal-local.sh b/feasibility-portal/start-feasibility-portal-local.sh index 249c55f..18f1e71 100755 --- a/feasibility-portal/start-feasibility-portal-local.sh +++ b/feasibility-portal/start-feasibility-portal-local.sh @@ -4,21 +4,21 @@ COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} AKTIN_ENABLED=${AKTIN_ENABLED:-false} -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -if [ $AKTIN_ENABLED = true ]; then +if [ "$AKTIN_ENABLED" = true ]; then printf "Starting aktin broker for localhost ... \n" - docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-broker/docker-compose.yml up -d + docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-broker/docker-compose.yml up -d export CODEX_FEASIBILITY_BACKEND_DIRECT_ENABLED=false export CODEX_FEASIBILITY_BACKEND_AKTIN_ENABLED=true printf "Sleeping 20 seconds to allow aktin to start up before backend ... \n" sleep 20 fi -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/keycloak/docker-compose.yml up -d -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/backend/docker-compose.yml up -d -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/gui/docker-compose.yml up -d +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/keycloak/docker-compose.yml up -d +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/backend/docker-compose.yml up -d +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/gui/docker-compose.yml up -d diff --git a/feasibility-portal/start-feasibility-portal.sh b/feasibility-portal/start-feasibility-portal.sh index 7cbfa91..e865e08 100755 --- a/feasibility-portal/start-feasibility-portal.sh +++ b/feasibility-portal/start-feasibility-portal.sh @@ -2,10 +2,10 @@ COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/keycloak/docker-compose.yml up -d -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/backend/docker-compose.yml up -d -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/gui/docker-compose.yml up -d -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-broker/docker-compose.yml up -d -#sh $BASE_DIR/dsf-broker/start.sh $COMPOSE_PROJECT +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/keycloak/docker-compose.yml up -d +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/backend/docker-compose.yml up -d +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/gui/docker-compose.yml up -d +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-broker/docker-compose.yml up -d +#sh "$BASE_DIR"/dsf-broker/start.sh "$COMPOSE_PROJECT" diff --git a/feasibility-portal/stop-feasibility-portal.sh b/feasibility-portal/stop-feasibility-portal.sh index 5b9958a..692e873 100755 --- a/feasibility-portal/stop-feasibility-portal.sh +++ b/feasibility-portal/stop-feasibility-portal.sh @@ -2,10 +2,10 @@ COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/keycloak/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/backend/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/gui/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-broker/docker-compose.yml stop -sh $BASE_DIR/dsf-broker/stop.sh $COMPOSE_PROJECT +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/keycloak/docker-compose.yml stop +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/backend/docker-compose.yml stop +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/gui/docker-compose.yml stop +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-broker/docker-compose.yml stop +sh "$BASE_DIR"/dsf-broker/stop.sh "$COMPOSE_PROJECT" diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh index 33e7591..e2576c4 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh @@ -1,25 +1,29 @@ -#!/bin/sh +#!/bin/bash -QUERY_INPUT=`cat` +QUERY_INPUT=$(cat) CLIENT_OBFUSCATE=${CLIENT_OBFUSCATE:-true} -echo "##### INCOMING REQUEST at $(date) #####" >> aktin-requests.log -echo "----BEGIN REQUEST----" >> aktin-requests.log -echo "$QUERY_INPUT" >> aktin-requests.log -echo "----END REQUEST----" >> aktin-requests.log +{ + echo "##### INCOMING REQUEST at $(date) #####" + echo "----BEGIN REQUEST----" + echo "$QUERY_INPUT" + echo "----END REQUEST----" +} >> aktin-requests.log RESP=$(sh execute-cql.sh "$QUERY_INPUT") if [ "$CLIENT_OBFUSCATE" = true ]; then - OBFUSCATION_INTEGER=$(($RANDOM % 11 - 5)) - RESP=$(($RESP + $OBFUSCATION_INTEGER)) - if [ $RESP -lt 5 ]; then + OBFUSCATION_INTEGER=$((RANDOM % 11 - 5)) + RESP=$((RESP + OBFUSCATION_INTEGER)) + if [ "$RESP" -lt 5 ]; then RESP=0 fi fi -echo "----BEGIN RESPONSE----" >> aktin-requests.log -echo "$RESP" >> aktin-requests.log -echo "----END RESPONSE----" >> aktin-requests.log +{ + echo "----BEGIN RESPONSE----" + echo "$RESP" + echo "----END RESPONSE----" +} >> aktin-requests.log -printf "$RESP" \ No newline at end of file +echo -n "$RESP" diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh index 95ba4fb..231e708 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh @@ -1,29 +1,33 @@ -#!/bin/sh +#!/bin/bash FLARE_BASE_URL=${FLARE_BASE_URL:-"http://flare:8080"} CLIENT_OBFUSCATE=${CLIENT_OBFUSCATE:-true} -QUERY_INPUT=`cat` +QUERY_INPUT=$(cat) -echo "##### INCOMING REQUEST at $(date) #####" >> aktin-requests.log -echo "----BEGIN REQUEST----" >> aktin-requests.log -echo "$QUERY_INPUT" >> aktin-requests.log -echo "----END REQUEST----" >> aktin-requests.log +{ + echo "##### INCOMING REQUEST at $(date) #####" + echo "----BEGIN REQUEST----" + echo "$QUERY_INPUT" + echo "----END REQUEST----" +} >> aktin-requests.log RESP=$(curl --location --request POST "$FLARE_BASE_URL/query/execute" \ --header 'Content-Type: application/sq+json' \ --data-raw "$QUERY_INPUT") if [ "$CLIENT_OBFUSCATE" = true ]; then - OBFUSCATION_INTEGER=$(($RANDOM % 11 - 5)) - RESP=$(($RESP + $OBFUSCATION_INTEGER)) - if [ $RESP -lt 5 ]; then + OBFUSCATION_INTEGER=$((RANDOM % 11 - 5)) + RESP=$((RESP + OBFUSCATION_INTEGER)) + if [ "$RESP" -lt 5 ]; then RESP=0 fi fi -echo "----BEGIN RESPONSE----" >> aktin-requests.log -echo "$RESP" >> aktin-requests.log -echo "----END RESPONSE----" >> aktin-requests.log +{ + echo "----BEGIN RESPONSE----" + echo "$RESP" + echo "----END RESPONSE----" +} >> aktin-requests.log -printf "$RESP" \ No newline at end of file +echo -n "$RESP" diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh b/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh index ca54039..bb73d2b 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh @@ -1,3 +1,3 @@ - #/bin/bash +#!/bin/bash -echo "Connection works - this is a reponse from the a client" \ No newline at end of file +echo "Connection works - this is a reponse from the a client" diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh index cc73d15..fbd05c5 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh @@ -1,7 +1,7 @@ -#!/bin/sh +#!/bin/bash BASE=${FHIR_BASE_URL:-"http://fhir-server:8080/fhir"} -BASIC_AUTH_64=$(printf "$AUTH_USER:$AUTH_PW" | base64) +BASIC_AUTH_64=$(echo -n "$AUTH_USER:$AUTH_PW" | base64) BASIC_AUTH="Authorization: Basic $BASIC_AUTH_64" library() { @@ -80,22 +80,21 @@ createmeasure() { } post() { - if [[ ! -z "$AUTH_USER" && ! -z "$AUTH_PW" ]]; + if [[ -n "$AUTH_USER" && -n "$AUTH_PW" ]]; then curl -sH "Content-Type: application/fhir+json" -H "$BASIC_AUTH" -d @- "${BASE}/$1" - else + else curl -sH "Content-Type: application/fhir+json" -d @- "${BASE}/$1" fi } evaluatemeasure() { - if [[ ! -z "$AUTH_USER" && ! -z "$AUTH_PW" ]]; + if [[ -n "$AUTH_USER" && -n "$AUTH_PW" ]]; then curl -s -H "$BASIC_AUTH" "${BASE}/Measure/$1/\$evaluate-measure?periodStart=2000&periodEnd=2099" - else + else curl -s "${BASE}/Measure/$1/\$evaluate-measure?periodStart=2000&periodEnd=2099" fi - } TYPE="Patient" @@ -104,10 +103,10 @@ DATA=$( echo "$1" | base64 | tr -d '\n') LIBRARY_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') MEASURE_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') -createlibrary ${LIBRARY_URI} ${DATA} | post "Library" > /dev/null +createlibrary "${LIBRARY_URI}" "${DATA}" | post "Library" > /dev/null -MEASURE_ID=$(createmeasure ${MEASURE_URI} ${LIBRARY_URI} ${TYPE} | post "Measure" | jq -r .id) +MEASURE_ID=$(createmeasure "${MEASURE_URI}" "${LIBRARY_URI}" "${TYPE}" | post "Measure" | jq -r .id) -COUNT=$(evaluatemeasure ${MEASURE_ID} | jq ".group[0].population[0].count") +COUNT=$(evaluatemeasure "${MEASURE_ID}" | jq ".group[0].population[0].count") -printf "${COUNT}" +echo -n "${COUNT}" diff --git a/feasibility-triangle/down-triangle.sh b/feasibility-triangle/down-triangle.sh index 99548bb..51e7463 100755 --- a/feasibility-triangle/down-triangle.sh +++ b/feasibility-triangle/down-triangle.sh @@ -1,11 +1,11 @@ #!/usr/bin/env sh COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-client/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/flare/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/fhir-server/blaze-server/docker-compose.yml down -v -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/fhir-server/hapi-fhir-server/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/rev-proxy/docker-compose.yml down -sh $BASE_DIR/dsf-client/down.sh $COMPOSE_PROJECT +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-client/docker-compose.yml down +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/flare/docker-compose.yml down +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/blaze-server/docker-compose.yml down -v +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/hapi-fhir-server/docker-compose.yml down +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/rev-proxy/docker-compose.yml down +sh "$BASE_DIR"/dsf-client/down.sh "$COMPOSE_PROJECT" diff --git a/feasibility-triangle/dsf-client/down.sh b/feasibility-triangle/dsf-client/down.sh index 5f42f5b..93adcf5 100755 --- a/feasibility-triangle/dsf-client/down.sh +++ b/feasibility-triangle/dsf-client/down.sh @@ -3,6 +3,6 @@ # Arguments # 1: docker-compose project token -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $1 -f $BASE_DIR/docker-compose.yml down +docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml down diff --git a/feasibility-triangle/dsf-client/start.sh b/feasibility-triangle/dsf-client/start.sh index a8d5b54..d21c8f5 100755 --- a/feasibility-triangle/dsf-client/start.sh +++ b/feasibility-triangle/dsf-client/start.sh @@ -1,26 +1,26 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash # Arguments # 1: docker-compose project token -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" # FHIR ------------------------------------------------------------------------ echo "Starting ZARS FHIR app..." -docker-compose -p $1 -f $BASE_DIR/docker-compose.yml up -d dsf-dic-fhir-proxy +docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml up -d dsf-dic-fhir-proxy echo -n "Waiting for full startup of the DSF DIC FHIR app..." -( docker-compose -p $1 -f $BASE_DIR/docker-compose.yml logs -f dsf-dic-fhir-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' +( docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml logs -f dsf-dic-fhir-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' echo "DONE" # BPE ------------------------------------------------------------------------- echo -n "Setting permissions for ZARS BPE app..." -chmod a+w -R $BASE_DIR/bpe/app/last_event +chmod a+w -R "$BASE_DIR"/bpe/app/last_event echo "DONE" echo "Starting ZARS BPE app..." -docker-compose -p $1 -f $BASE_DIR/docker-compose.yml up -d dsf-dic-bpe-app +docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml up -d dsf-dic-bpe-app echo -n "Waiting for full startup of the DSF DIC BPE app..." -( docker-compose -p $1 -f $BASE_DIR/docker-compose.yml logs -f dsf-dic-bpe-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' +( docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml logs -f dsf-dic-bpe-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' echo "DONE" diff --git a/feasibility-triangle/dsf-client/stop.sh b/feasibility-triangle/dsf-client/stop.sh index 83b63c9..3a1f2ae 100755 --- a/feasibility-triangle/dsf-client/stop.sh +++ b/feasibility-triangle/dsf-client/stop.sh @@ -3,6 +3,6 @@ # Arguments # 1: docker-compose project token -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $1 -f $BASE_DIR/docker-compose.yml stop +docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml stop diff --git a/feasibility-triangle/get-mii-testdata.sh b/feasibility-triangle/get-mii-testdata.sh index d92c265..c93c64c 100755 --- a/feasibility-triangle/get-mii-testdata.sh +++ b/feasibility-triangle/get-mii-testdata.sh @@ -1,12 +1,11 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" MII_TESTDATA_BASE_URL=https://github.com/medizininformatik-initiative/kerndatensatz-testdaten/raw/master/Test_Data/Polar MII_TESTDATA_FILES=(POLAR_Testdaten_Original_UKB-UKB-0001-UKB-0015.json.zip POLAR_Testdaten_Original_UKE-UKE-0001-UKE-0020.json.zip POLAR_Testdaten_Original_UKFAU-UKFAU-0001-UKFAU-0011.json.zip POLAR_Testdaten_Original_UKFR-UKFR-0001-UKFR-0010.json.zip POLAR_Testdaten_Original_UKSH-UKSH-0001-UKSH-0005.json.zip) for file in "${MII_TESTDATA_FILES[@]}" do wget "$MII_TESTDATA_BASE_URL/$file" - unzip -o $file -d testdata - rm $file -done \ No newline at end of file + unzip -o "$file" -d testdata + rm "$file" +done diff --git a/feasibility-triangle/initialise-triangle-env-files.sh b/feasibility-triangle/initialise-triangle-env-files.sh index 352206a..812d56c 100644 --- a/feasibility-triangle/initialise-triangle-env-files.sh +++ b/feasibility-triangle/initialise-triangle-env-files.sh @@ -1,13 +1,13 @@ -#!/bin/sh +#!/bin/bash envfiles=( "aktin-client/.env" "dsf-client/.env" "fhir-server/blaze-server/.env" "flare/.env" "rev-proxy/.env") for file in "${envfiles[@]}" do if [[ -f "$file" ]]; then - printf ".env file $file already exists - not copying default env \n" - printf "Please check if your current env file $file is missing any params from the $file.default file and copy them as appropriate\n" - else - cp "$file.default" $file - fi + printf ".env file %s already exists - not copying default env \n" "$file" + printf "Please check if your current env file %s is missing any params from the %s file and copy them as appropriate\n" "$file" "$file.default" + else + cp "$file.default" "$file" + fi done diff --git a/feasibility-triangle/reset-fhir-server.sh b/feasibility-triangle/reset-fhir-server.sh index 64a02ae..638369e 100755 --- a/feasibility-triangle/reset-fhir-server.sh +++ b/feasibility-triangle/reset-fhir-server.sh @@ -2,6 +2,6 @@ COMPOSE_PROJECT=${COMPOSE_PROJECT:-feasibility-deploy} -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/docker-compose.yml down -v -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/docker-compose.yml up -d +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/docker-compose.yml down -v +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/docker-compose.yml up -d diff --git a/feasibility-triangle/rev-proxy/add-nginx-user.sh b/feasibility-triangle/rev-proxy/add-nginx-user.sh index e82eab8..f8986b8 100755 --- a/feasibility-triangle/rev-proxy/add-nginx-user.sh +++ b/feasibility-triangle/rev-proxy/add-nginx-user.sh @@ -1,3 +1,3 @@ #!/bin/sh echo "generating user and pw: $1 , $2" -docker run --rm --entrypoint htpasswd registry:2.7.0 -nb $1 $2 >> .htpasswd +docker run --rm --entrypoint htpasswd registry:2.7.0 -nb "$1" "$2" >> .htpasswd diff --git a/feasibility-triangle/rev-proxy/generateCert.sh b/feasibility-triangle/rev-proxy/generateCert.sh index dc5087a..7e908d1 100755 --- a/feasibility-triangle/rev-proxy/generateCert.sh +++ b/feasibility-triangle/rev-proxy/generateCert.sh @@ -1,5 +1,5 @@ #!/usr/bin/env sh -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker run --rm -v $BASE_DIR:/export --entrypoint openssl alpine/openssl req -nodes -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout /export/key.pem -out /export/cert.pem -days 99999 +docker run --rm -v "$BASE_DIR":/export --entrypoint openssl alpine/openssl req -nodes -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout /export/key.pem -out /export/cert.pem -days 99999 diff --git a/feasibility-triangle/rev-proxy/q_nginx_start.sh b/feasibility-triangle/rev-proxy/q_nginx_start.sh index 356c1b3..c746a8b 100755 --- a/feasibility-triangle/rev-proxy/q_nginx_start.sh +++ b/feasibility-triangle/rev-proxy/q_nginx_start.sh @@ -1,9 +1,9 @@ #!/bin/bash ALLOWED_IPS=${ALLOWED_IPS:-""} -echo $ALLOWED_IPS +echo "$ALLOWED_IPS" -ips=$(echo $ALLOWED_IPS | tr ",'" "\n") +ips=$(echo "$ALLOWED_IPS" | tr ",'" "\n") printf "" > /etc/nginx/conf.d/queue_allow_ips.conf diff --git a/feasibility-triangle/rev-proxy/reset-nginx.sh b/feasibility-triangle/rev-proxy/reset-nginx.sh index 5ccc2f6..ea4a749 100755 --- a/feasibility-triangle/rev-proxy/reset-nginx.sh +++ b/feasibility-triangle/rev-proxy/reset-nginx.sh @@ -3,7 +3,7 @@ export COMPOSE_IGNORE_ORPHANS=True COMPOSE_PROJECT=codex-deploy -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/docker-compose.yml down -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/docker-compose.yml up -d +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/docker-compose.yml down +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/docker-compose.yml up -d diff --git a/feasibility-triangle/rev-proxy/setup-base-auth.sh b/feasibility-triangle/rev-proxy/setup-base-auth.sh index b2ad89b..f6c4ea0 100755 --- a/feasibility-triangle/rev-proxy/setup-base-auth.sh +++ b/feasibility-triangle/rev-proxy/setup-base-auth.sh @@ -5,18 +5,17 @@ # echo "Creating longer Diffie-Hellman Prime for extra security... this may take a while \n\n" # docker run --rm -v $PWD/node-rev-proxy:/export --entrypoint openssl alpine/openssl dhparam -out /export/dhparam.pem 4096 # echo $FILE -# +# #fi -readlink "$0" >/dev/null -if [ $? -ne 0 ]; then +if ! readlink "$0" >/dev/null; then BASE_DIR=$(dirname "$0") else BASE_DIR=$(dirname "$(readlink "$0")") fi echo "Generating default certificate..." -docker run --rm -v $BASE_DIR/auth:/export --entrypoint openssl alpine/openssl req -nodes -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout /export/key.pem -out /export/cert.pem -days 99999 +docker run --rm -v "$BASE_DIR"/auth:/export --entrypoint openssl alpine/openssl req -nodes -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout /export/key.pem -out /export/cert.pem -days 99999 #echo "generating user: $1 , with password: $2" #docker run --rm --entrypoint htpasswd registry:2.7.0 -nb $1 $2 > .htpasswd diff --git a/feasibility-triangle/setup-base-auth.sh b/feasibility-triangle/setup-base-auth.sh index d7097f6..b013a23 100755 --- a/feasibility-triangle/setup-base-auth.sh +++ b/feasibility-triangle/setup-base-auth.sh @@ -8,7 +8,7 @@ # #fi if [ -z "$BASE_DIR" ]; then - BASE_DIR=$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P ) + BASE_DIR=$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P ) fi if [ -z "$1" ] && [ -z "$2" ]; then @@ -22,5 +22,5 @@ fi #docker run --rm -v $BASE_DIR/auth:/export alpine chmod 655 /export/* echo "generating user: $1 , with password: $2" -docker run --rm --entrypoint htpasswd registry:2.7.0 -nb $1 $2 > $BASE_DIR/auth/.htpasswd +docker run --rm --entrypoint htpasswd registry:2.7.0 -nb "$1" "$2" > "$BASE_DIR"/auth/.htpasswd diff --git a/feasibility-triangle/start-triangle.sh b/feasibility-triangle/start-triangle.sh index ea6bc88..39ebe0d 100755 --- a/feasibility-triangle/start-triangle.sh +++ b/feasibility-triangle/start-triangle.sh @@ -3,25 +3,25 @@ COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" FHIR_SERVER=${FHIR_SERVER:-blaze} CERT_FILE=${CERT_FILE:-$BASE_DIR/auth/cert.pem} KEY_FILE=${KEY_FILE:-$BASE_DIR/auth/key.pem} -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-client/docker-compose.yml up -d -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/flare/docker-compose.yml up -d +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-client/docker-compose.yml up -d +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/flare/docker-compose.yml up -d if [ "$FHIR_SERVER" = "blaze" ]; then echo "Starting up FHIR-Server: Blaze" - docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/fhir-server/blaze-server/docker-compose.yml up -d + docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/blaze-server/docker-compose.yml up -d elif [ "$FHIR_SERVER" = "hapi" ]; then echo "Starting up FHIR-Server: HAPI" - docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/fhir-server/hapi-fhir-server/docker-compose.yml up -d + docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/hapi-fhir-server/docker-compose.yml up -d fi if [ -f "$CERT_FILE" ] && [ -f "$KEY_FILE" ]; then echo "Auth files cert: $CERT_FILE and key: $KEY_FILE exist => starting NGINX reverse proxy on port $PORT_NUM_NODE_REV_PROXY" - docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/rev-proxy/docker-compose.yml up -d + docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/rev-proxy/docker-compose.yml up -d else echo "One of or both cert ($CERT_FILE) and key ($KEY_FILE) files missing => NOT starting NGINX reverse proxy on port $PORT_NUM_NODE_REV_PROXY" echo "Note that your feasibility triangle will still work, but will only be accessible from localhost" diff --git a/feasibility-triangle/stop-triangle.sh b/feasibility-triangle/stop-triangle.sh index 32e923a..3fcb3ee 100755 --- a/feasibility-triangle/stop-triangle.sh +++ b/feasibility-triangle/stop-triangle.sh @@ -2,11 +2,11 @@ COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/aktin-client/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/flare/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/fhir-server/blaze-server/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/fhir-server/hapi-fhir-server/docker-compose.yml stop -docker-compose -p $COMPOSE_PROJECT -f $BASE_DIR/rev-proxy/docker-compose.yml stop -sh $BASE_DIR/dsf-client/stop.sh $COMPOSE_PROJECT +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-client/docker-compose.yml stop +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/flare/docker-compose.yml stop +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/blaze-server/docker-compose.yml stop +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/hapi-fhir-server/docker-compose.yml stop +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/rev-proxy/docker-compose.yml stop +sh "$BASE_DIR"/dsf-client/stop.sh "$COMPOSE_PROJECT" diff --git a/feasibility-triangle/upload-testdata.sh b/feasibility-triangle/upload-testdata.sh index 72a50d6..cddfde6 100755 --- a/feasibility-triangle/upload-testdata.sh +++ b/feasibility-triangle/upload-testdata.sh @@ -1,10 +1,10 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" FHIR_BASE_URL=${FEASIBILITY_TESTDATA_UPLOAD_FHIR_BASE_URL:-http://localhost:8081/fhir} -FILES=$BASE_DIR/testdata/* -for fhirBundle in $FILES; do +FILES=("$BASE_DIR"/testdata/*) +for fhirBundle in "${FILES[@]}"; do echo "Sending Testdata bundle $fhirBundle ..." - curl -X POST -H "Content-Type: application/json" -d @$fhirBundle $FHIR_BASE_URL + curl -X POST -H "Content-Type: application/json" -d @"$fhirBundle" "$FHIR_BASE_URL" done diff --git a/test/run_tests.sh b/test/run_tests.sh index 61ae4d4..b45b962 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -51,9 +51,9 @@ if $missing; then exit 1 fi -files=$(ls $TEST_DATA_PATH/testCases/*.json) -ignored_files=$(cat $TEST_DATA_PATH/testCaseIgnoreList.txt) -case_total=$(ls $files | wc -l) +mapfile -t files < <(ls "$TEST_DATA_PATH"/testCases/*.json) +ignored_files=$(cat "$TEST_DATA_PATH"/testCaseIgnoreList.txt) +case_total="${#files[@]}" case_execute=0 case_fail=0 case_ignore=0 @@ -61,20 +61,20 @@ pad=${#case_total} delay=${TEST_RETRY_DELAY:-2} i=0 -for f in $files; do +for f in "${files[@]}"; do filename="$(basename "$f")" title="$(echo "$filename" | sed -r 's/\.json//')" - if check_ignored $filename; then + if check_ignored "$filename"; then continue fi case_execute=$((case_execute+1)) done -for f in $files; do +for f in "${files[@]}"; do filename="$(basename "$f")" title="$(echo "$filename" | sed -r 's/\.json//')" - if check_ignored $filename; then + if check_ignored "$filename"; then case_ignore=$((case_ignore+1)) continue fi @@ -95,7 +95,6 @@ for f in $files; do continue fi auth_token="$(jq -rn --argjson auth "$auth_token" '$auth | .access_token')" - query="$(jq -r "." $f)" result_location="$(curl -ksS --location --request POST\ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ @@ -103,16 +102,16 @@ for f in $files; do --data "@$f" \ "$QUERY_ENDPOINT_URL")" if ! jq -ne --argjson result "$result_location" '$result | .location != null' 1> /dev/null 2>&1; then - print_fail "Error" "${RED}Query response does not conform to expected format${RESET}" "Query" "$(jq '.' $t)" "Response" "$result_location" + print_fail "Error" "${RED}Query response does not conform to expected format${RESET}" "Query File" "$f" "Response" "$result_location" continue fi result_location="$(jq -rn --argjson result "$result_location" '$result | .location')" - print_success + print_success "Send Query" "Success" echo -n " Retrieving Result " retries=${TEST_RETRY_COUNT:-5} failed=true - while [ $retries -gt 0 ]; do + while [ "$retries" -gt 0 ]; do result="$(curl -ksS --location \ --header "Authorization: Bearer $auth_token" \ --header 'Accept: application/json' \ @@ -125,7 +124,7 @@ for f in $files; do failed=false break fi - sleep $delay + sleep "$delay" retries=$((retries-1)) done @@ -138,7 +137,7 @@ for f in $files; do print_fail "Expected Result" "1" "Actual Result" "$(jq -n --argjson result "$result" '$result | .totalNumberOfPatients')" continue else - print_success + print_success "Query Result" "Success" fi done diff --git a/troubleshooting/feasibility-test.sh b/troubleshooting/feasibility-test.sh index cf87b5e..a73bdcf 100644 --- a/troubleshooting/feasibility-test.sh +++ b/troubleshooting/feasibility-test.sh @@ -1,36 +1,36 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" # FHIR_SERVER_URL=${FEASIBILITY_TEST_FHIR_SERVER_URL:-"http://localhost:8081/fhir"} FLARE_SERVER_URL=${FEASIBILITY_TEST_FLARE_SERVER_URL:-"http://localhost:8084"} -TEST_FILES=$BASE_DIR/test-queries/* +TEST_FILES=("$BASE_DIR"/test-queries/*) PRINT_SQ=${FEASIBILITY_TEST_PRINT_SQ:-true} -for testQuery in $TEST_FILES; do - queryName=$(basename $testQuery) - printf "\n\nTest query = #################### $queryName ####################\n\n" +for testQuery in "${TEST_FILES[@]}"; do + queryName=$(basename "$testQuery") + printf "\n\nTest query = #################### %s ####################\n\n" "$queryName" - printf "### Structured-Query file is:\n$testQuery\n" + printf "### Structured-Query file is:\n%s\n" "$testQuery" if [[ $PRINT_SQ == true ]];then printf "\n### Query input structured query :\n" - printf "$(cat $testQuery)\n" + cat "$testQuery" fi printf "\n### FLARE FHIR Search translation for query is: \n" curl --location --request POST "$FLARE_SERVER_URL/query/translate" \ --header 'Content-Type: application/sq+json' \ - -d @$testQuery + -d @"$testQuery" printf "\n\n### FLARE result (number of patients) for query is: \n" patientsFound=$(curl -s --location --request POST "$FLARE_SERVER_URL/query/execute" \ --header 'Content-Type: application/sq+json' \ - -d @$testQuery) + -d @"$testQuery") - if [[ $patientsFound == 0 ]];then + if [[ "$patientsFound" == 0 ]];then printf "Found 0 patients, please check if this is correct for your server\n" else - printf "Number of patients found for the query $queryName is: $patientsFound" + printf "Number of patients found for the query %s is: %s" "$queryName" "$patientsFound" fi -done \ No newline at end of file +done From 966a84422a99f210345152f2d441047d5045bc8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20R=C3=BChle?= Date: Wed, 17 Aug 2022 19:16:06 +0200 Subject: [PATCH 040/118] Fix Base Auth Setup in CI --- .github/workflows/ci.yml | 2 +- feasibility-portal/setup-base-auth.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c6e9c9..65640ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,7 +62,7 @@ jobs: run: python main.py - name: Setup Base Auth - run: bash num-node/setup-base-auth.sh "${{ env.AUTH_USERNAME }}" "${{ env.AUTH_PASSWORD }}" + run: bash feasibility-portal/setup-base-auth.sh "${{ env.AUTH_USERNAME }}" "${{ env.AUTH_PASSWORD }}" - name: Build the stack env: diff --git a/feasibility-portal/setup-base-auth.sh b/feasibility-portal/setup-base-auth.sh index c797110..4d1fe50 100755 --- a/feasibility-portal/setup-base-auth.sh +++ b/feasibility-portal/setup-base-auth.sh @@ -12,7 +12,7 @@ BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" echo "Generating default certificate..." docker run --rm -v "$BASE_DIR"/auth:/export --entrypoint openssl alpine/openssl req -nodes -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout /export/key.pem -out /export/cert.pem -days 99999 -docker run --rm -v "$BASE_DIR"/auth:/export alpine chmod 655 /export/* +docker run --rm -v "$BASE_DIR"/auth:/export alpine chmod -R 655 /export #echo "generating user: $1 , with password: $2" #docker run --rm --entrypoint htpasswd registry:2.7.0 -nb $1 $2 > .htpasswd From f3a9a1ab459c851ee400c3b2c503f70d1e5ba698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 22 Aug 2022 15:05:12 +0200 Subject: [PATCH 041/118] update to new release --- feasibility-portal/backend/.env.default | 2 ++ feasibility-portal/backend/docker-compose.yml | 4 +++- feasibility-portal/gui/docker-compose.yml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index 626c5e4..8f7f378 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -5,9 +5,11 @@ FEASIBILITY_BACKEND_DATASOURCE_USERNAME=guidbuser FEASIBILITY_BACKEND_DATASOURCE_PASSWORD=guidbpw FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=true FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER +FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE=FEASIBILITY_ADMIN FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://auth:8080 FEASIBILITY_BACKEND_KEYCLOAK_REALM=feasibility FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID=feasibility-gui +FEASIBILITY_BACKEND_QUERY_VALIDATION_ENABLED=true FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=false FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED=false FEASIBILITY_BACKEND_API_BASE_URL=https://localhost/api/ diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 385a70d..9b82cc6 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.0.0-rc1 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.1.0-rc1 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -15,9 +15,11 @@ services: BROKER_CLIENT_TYPE: ${FEASIBILITY_BACKEND_BROKER_CLIENT_TYPE:-AKTIN} KEYCLOAK_ENABLED: ${FEASIBILITY_BACKEND_KEYCLOAK_ENABLED:-true} KEYCLOAK_ALLOWED_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} + KEYCLOAK_ADMIN_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE:-FEASIBILITY_ADMIN} KEYCLOAK_BASE_URL: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} KEYCLOAK_REALM: ${FEASIBILITY_BACKEND_KEYCLOAK_REALM:-codex-develop} KEYCLOAK_CLIENT_ID: ${FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID:-feasibility-gui} + QUERY_VALIDATION_ENABLED: ${FEASIBILITY_BACKEND_QUERY_VALIDATION_ENABLED:-true} CQL_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED:-true} FHIR_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED:-false} API_BASE_URL: ${FEASIBILITY_BACKEND_API_BASE_URL:-https://localhost/api/} diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 90e76e7..740d64a 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.2.0_RC12 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.3.0_rc2 ports: - "443:8443" restart: unless-stopped From 1b991b6d563bce52dc6cb78ff8f1ab129ada6af8 Mon Sep 17 00:00:00 2001 From: DiCanio Date: Fri, 3 Jun 2022 16:07:20 +0200 Subject: [PATCH 042/118] Add Support for New DSF Plugin Version --- .../codex-process-feasibility-0.1.0-RC6.jar | Bin 67703 -> 0 bytes assets/feasibility-dsf-process-0.3.0.jar | Bin 0 -> 92089 bytes feasibility-portal/README.md | 84 ++++++++-------- feasibility-portal/backend/docker-compose.yml | 2 +- feasibility-portal/dsf-broker/.env.default | 6 +- .../dsf-broker/bpe/cache/.gitkeep | 0 .../dsf-broker/docker-compose.yml | 33 +++++-- .../dsf-broker/fhir/app/conf/bundle.xml | 10 +- feasibility-triangle/README.md | 91 +++++++++++------- feasibility-triangle/dsf-client/.env.default | 10 +- .../dsf-client/bpe/cache/.gitkeep | 0 .../dsf-client/docker-compose.yml | 69 ++++++++++--- .../dsf-client/fhir/app/conf/bundle.xml | 8 +- 13 files changed, 197 insertions(+), 116 deletions(-) delete mode 100644 assets/codex-process-feasibility-0.1.0-RC6.jar create mode 100644 assets/feasibility-dsf-process-0.3.0.jar create mode 100644 feasibility-portal/dsf-broker/bpe/cache/.gitkeep create mode 100644 feasibility-triangle/dsf-client/bpe/cache/.gitkeep diff --git a/assets/codex-process-feasibility-0.1.0-RC6.jar b/assets/codex-process-feasibility-0.1.0-RC6.jar deleted file mode 100644 index 03075df17614116d36011deabe08cdcbd6faf86e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67703 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 - + - + - + @@ -218,7 +218,7 @@ - + @@ -256,7 +256,7 @@ - + diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index e3ffd23..8ea0d38 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -142,39 +142,58 @@ You can then load the data into your FHIR Server using the `upload-testdata.sh` ### Configurable environment variables -| Env Variable | Description | Default | Possible Values | Component | -|-------------|----------------------------------|------------------|------------------|------------------| -|FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE|The media type of the query you would like to handle|application/sq+json|application/sq+json, text/cql|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE|The media type of the query response you return|application/json|application/json|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI|The URL of the AKTIN broker endpoint|http://aktin-broker:8080/broker/|URL|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS|Type of authentication used by AKTIN|org.aktin.broker.client2.auth.ApiKeyAuthentication|org.aktin.broker.client2.auth.ApiKeyAuthentication|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM|The API key of your site|xxxApiKey123|API key token|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS|The time in which your AKTIN client pings the AKTIN broker to ensure idle websocket conections stay open|60|Integer (seconds)|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS||10|Integer (seconds)|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING||TRUE||AKTIN| -|FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS|The timeout within which a process has to return before the client sends a "failed" message to the AKTIN broker|60|Integer (seconds)|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND|The command to be executed on recieving a feasibility query. Allows one to switch between flare and cql execution|/opt/aktin/call-flare.sh|/opt/aktin/call-flare.sh, /opt/aktin/call-cql.sh|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS||10|Integer (seconds)|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL|the URL of the FLARE component if used|http://flare:8080|URL|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_OBFUSCATE|Sets whether the AKTIN Client should obfuscate the results (response) of a feasibility query|TRUE|true or false|AKTIN| -|FEASIBILITY_AKTIN_JAVA_OPTS|Provides Java options to the AKTIN client - can be used to configure proxy use. For example : " Dhttps.proxyHost=squid -Dhttps.proxyPort=3128"||valid java options|AKTIN| -|FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER|basic auth user to connect to FHIR server if CQL is used|||AKTIN| -|FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW|basic auth password to connect to FHIR server if CQL is used|||AKTIN| -|FEASIBILITY_AKTIN_FHIR_BASE_URL|FHIR server base url the AKTIN client is to use to connect to the FHIR server|http://fhir-server:8080/fhir||AKTIN| -|FHIR_SERVER_BASE_URL|The base URL of the FHIR server the fhir server uses to generate next links|http://fhir-server:8080||BLAZE| -|FHIR_SERVER_LOG_LEVEL|log level of the FHIR server|debug|debug, info, error|BLAZE| -|BLAZE_JVM_ARGS|see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md|-Xmx4g||BLAZE| -|BLAZE_BLOCK_CACHE_SIZE|see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md|256||BLAZE| -|BLAZE_DB_RESOURCE_CACHE_SIZE|see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md|2000000||BLAZE| -|BLAZE_DB_RESOURCE_HANDLE_CACHE_SIZE|see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md|100000||BLAZE| -|PORT_FHIR_SERVER_LOCALHOST|The exposed docker port of the FHIR server|127.0.0.1:8081|should always include 127.0.0.1|BLAZE| -|FEASIBILITY_FLARE_PORT|The exposed docker port of the FLARE componenet|127.0.0.1:8084|should always include 127.0.0.1|FLARE| -|FLARE_FHIR_SERVER_URL|The Url of the FHIR server FLARE uses to connect to the FHIR server|http://fhir-server:8080/fhir/|URL|FLARE| -|FLARE_FHIR_USER|basic auth user to connect to FHIR server|||FLARE| -|FLARE_FHIR_PW|basic auth password to connect to FHIR server if CQL is used|||FLARE| -|FLARE_FHIR_PAGE_COUNT|The number of resources per page FLARE asks for from the FHIR server|500||FLARE| -|FLARE_EXEC_CORE_POOL_SIZE|The core thread pool size|4|Integer|FLARE| -|FLARE_EXEC_MAX_POOL_SIZE|The max thread pool size|16|Integer|FLARE| -|FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS|The time threads are kept alive|10|Integer|FLARE| -|FLARE_LOG_LEVEL|log level of flare|debug|off, fatal, error, warn, info, debug, trace|FLARE| -|FEASIBILITY_TRIANGLE_REV_PROXY_PORT|The exposed docker port of the reverse proxy - set to 443 if you want to use standard https and you only have the feasibility triangle installed on your server|444|Integer (valid port)|REV Proxy| +| Env Variable | Description | Default | Possible Values | Component | +|-----------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------|----------------------------------------------------|-----------| +| FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE | The media type of the query you would like to handle | application/sq+json | application/sq+json, text/cql | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE | The media type of the query response you return | application/json | application/json | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI | The URL of the AKTIN broker endpoint | http://aktin-broker:8080/broker/ | URL | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS | Type of authentication used by AKTIN | org.aktin.broker.client2.auth.ApiKeyAuthentication | org.aktin.broker.client2.auth.ApiKeyAuthentication | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM | The API key of your site | xxxApiKey123 | API key token | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS | The time in which your AKTIN client pings the AKTIN broker to ensure idle websocket conections stay open | 60 | Integer (seconds) | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS || 10 | Integer (seconds) | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING || TRUE || AKTIN | +| FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS | The timeout within which a process has to return before the client sends a "failed" message to the AKTIN broker | 60 | Integer (seconds) | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND | The command to be executed on recieving a feasibility query. Allows one to switch between flare and cql execution | /opt/aktin/call-flare.sh | /opt/aktin/call-flare.sh, /opt/aktin/call-cql.sh | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS || 10 | Integer (seconds) | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL | the URL of the FLARE component if used | http://flare:8080 | URL | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_OBFUSCATE | Sets whether the AKTIN Client should obfuscate the results (response) of a feasibility query | TRUE | true or false | AKTIN | +| FEASIBILITY_AKTIN_JAVA_OPTS | Provides Java options to the AKTIN client - can be used to configure proxy use. For example : " Dhttps.proxyHost=squid -Dhttps.proxyPort=3128" || valid java options | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER | basic auth user to connect to FHIR server if CQL is used ||| AKTIN | +| FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW | basic auth password to connect to FHIR server if CQL is used ||| AKTIN | +| FEASIBILITY_AKTIN_FHIR_BASE_URL | FHIR server base url the AKTIN client is to use to connect to the FHIR server | http://fhir-server:8080/fhir || AKTIN | +| FHIR_SERVER_BASE_URL | The base URL of the FHIR server the fhir server uses to generate next links | http://fhir-server:8080 || BLAZE | +| FHIR_SERVER_LOG_LEVEL | log level of the FHIR server | debug | debug, info, error | BLAZE | +| BLAZE_JVM_ARGS | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | -Xmx4g || BLAZE | +| BLAZE_BLOCK_CACHE_SIZE | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | 256 || BLAZE | +| BLAZE_DB_RESOURCE_CACHE_SIZE | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | 2000000 || BLAZE | +| BLAZE_DB_RESOURCE_HANDLE_CACHE_SIZE | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | 100000 || BLAZE | +| PORT_FHIR_SERVER_LOCALHOST | The exposed docker port of the FHIR server | 127.0.0.1:8081 | should always include 127.0.0.1 | BLAZE | +| FEASIBILITY_FLARE_PORT | The exposed docker port of the FLARE componenet | 127.0.0.1:8084 | should always include 127.0.0.1 | FLARE | +| FLARE_FHIR_SERVER_URL | The Url of the FHIR server FLARE uses to connect to the FHIR server | http://fhir-server:8080/fhir/ | URL | FLARE | +| FLARE_FHIR_USER | basic auth user to connect to FHIR server ||| FLARE | +| FLARE_FHIR_PW | basic auth password to connect to FHIR server if CQL is used ||| FLARE | +| FLARE_FHIR_PAGE_COUNT | The number of resources per page FLARE asks for from the FHIR server | 500 || FLARE | +| FLARE_EXEC_CORE_POOL_SIZE | The core thread pool size | 4 | Integer | FLARE | +| FLARE_EXEC_MAX_POOL_SIZE | The max thread pool size | 16 | Integer | FLARE | +| FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS | The time threads are kept alive | 10 | Integer | FLARE | +| FLARE_LOG_LEVEL | log level of flare | debug | off, fatal, error, warn, info, debug, trace | FLARE | +| FEASIBILITY_TRIANGLE_REV_PROXY_PORT | The exposed docker port of the reverse proxy - set to 443 if you want to use standard https and you only have the feasibility triangle installed on your server | 444 | Integer (valid port) | REV Proxy | +| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_HOST | Forward proxy host. | | FQDN | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PORT | Forward proxy port. | | Integer | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_USERNAME | Username for a forward proxy if it requires one. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PASSWORD | Password for a forward proxy if it requires one. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BEARER_AUTH_TOKEN | Bearer token used for authentication against a client target. Do not prefix this with `Bearer `! | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_USERNAME | Username for basic authentication against a FHIR server client target. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_PASSWORD | Password for basic authentication against a FHIR server client target. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_TIMEOUT | Timeout for establishing a connection to a FHIR server client target in `ms`. | 2000 | Integer | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_REQUEST_TIMEOUT | Timeout for requesting a connection to a FHIR server client target in `ms`. | 20000 | Integer | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_NETWORK_OPS_TIMEOUT | Timeout for blocking a read / write network operation to a FHIR server without failing in `ms`. | 20000 | Integer | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PATH | Path to a trust store used for connecting to a FHIR server. Necessary when using self-signed certificates. | /opt/bpe/truststore.p12 | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PASSWORD | Password for opening the trust store used for connecting to a FHIR server. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PATH | Path to a key store used for authenticating against a FHIR server or proxy using a client certificate. | /opt/bpe/keystore | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PASSWORD | Password for opening the key store used for authenticating against a FHIR server or proxy. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASE_URL | Base URL to a FHIR server or proxy for feasibility evaluation. This can also be the base URL of a reverse proxy if used. Only required if evaluation strategy is set to cql. | | URL | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY | Defines whether the feasibility shall be evaluated using cql or structured-query. Using the latter requires a FLARE instance. | | `structured-query`, `cql` | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE | Defines whether the feasibility evaluation result shall be obfuscated. | | Boolean | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER | Identifier of this organization. | Test_DIC_1 | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL | Base URL to a FLARE instance. Only required if evaluation strategy is set to structured-query. | http://node-flare:5000/ | URL | DSF | diff --git a/feasibility-triangle/dsf-client/.env.default b/feasibility-triangle/dsf-client/.env.default index 8a9f5a4..fba08fd 100644 --- a/feasibility-triangle/dsf-client/.env.default +++ b/feasibility-triangle/dsf-client/.env.default @@ -1,2 +1,8 @@ -DIC_1_USER_THUMBPRINTS=e2b39f27f51553a9f51a4dbda11cf7ac36339778af0d38a51cc85538dfde8b04837acc1dc8ec0a401cbe7867dbc9e1ba82e950fea4ca304aa3909541ad49fd16,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202 -DIC_1_USER_THUMBPRINTS_PERMANENT_DELETE=e2b39f27f51553a9f51a4dbda11cf7ac36339778af0d38a51cc85538dfde8b04837acc1dc8ec0a401cbe7867dbc9e1ba82e950fea4ca304aa3909541ad49fd16,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202 +FEASIBILITY_DSF_CLIENT_PROCESS_USER_THUMBPRINTS=e2b39f27f51553a9f51a4dbda11cf7ac36339778af0d38a51cc85538dfde8b04837acc1dc8ec0a401cbe7867dbc9e1ba82e950fea4ca304aa3909541ad49fd16,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202 +FEASIBILITY_DSF_CLIENT_PROCESS_USER_THUMBPRINTS_PERMANENT_DELETE=e2b39f27f51553a9f51a4dbda11cf7ac36339778af0d38a51cc85538dfde8b04837acc1dc8ec0a401cbe7867dbc9e1ba82e950fea4ca304aa3909541ad49fd16,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202 +FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER=Test_DIC_1 +FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY=structured-query +FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE=true +FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL=http://node-flare:5000/ +FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PATH=/opt/bpe/truststore.p12 +FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PATH=/opt/bpe/keystore diff --git a/feasibility-triangle/dsf-client/bpe/cache/.gitkeep b/feasibility-triangle/dsf-client/bpe/cache/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/feasibility-triangle/dsf-client/docker-compose.yml b/feasibility-triangle/dsf-client/docker-compose.yml index cffedcc..02b0ded 100644 --- a/feasibility-triangle/dsf-client/docker-compose.yml +++ b/feasibility-triangle/dsf-client/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.7' services: - # ---- Proxy ---------------------------------------------------------------- + # ---- Proxy ---------------------------------------------------------------- dsf-dic-fhir-proxy: image: nginx:1.21 restart: on-failure @@ -21,8 +21,13 @@ services: - dsf-dic-fhir-app dsf-dic-fhir-app: - image: ghcr.io/highmed/fhir:0.5.2 + image: ghcr.io/highmed/fhir:0.7.0 restart: on-failure + healthcheck: + test: [ "CMD", "java", "-cp", "dsf_fhir.jar", "org.highmed.dsf.fhir.StatusClient" ] + interval: 10s + timeout: 15s + retries: 5 volumes: - type: bind source: ./fhir/app/conf/bundle.xml @@ -49,13 +54,11 @@ services: ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP: dic_1_fhir_permanent_delete_users ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME: dic_1_fhir_server_permanent_delete_user ORG_HIGHMED_DSF_FHIR_SERVER_BASE_URL: https://dsf-dic-fhir-proxy/fhir - ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: Test_DIC_1 - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS: "e2b39f27f51553a9f51a4dbda11cf7ac36339778af0d38a51cc85538dfde8b04837acc1dc8ec0a401cbe7867dbc9e1ba82e950fea4ca304aa3909541ad49fd16,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202" - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE: "e2b39f27f51553a9f51a4dbda11cf7ac36339778af0d38a51cc85538dfde8b04837acc1dc8ec0a401cbe7867dbc9e1ba82e950fea4ca304aa3909541ad49fd16,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202" + ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: ${FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER} + ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS: ${FEASIBILITY_DSF_CLIENT_PROCESS_USER_THUMBPRINTS} + ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE: ${FEASIBILITY_DSF_CLIENT_PROCESS_USER_THUMBPRINTS_PERMANENT_DELETE} EXTRA_JVM_ARGS: ${CODEX_DSF_ZARS_FHIR_APP_JVM_ARGS} TZ: Europe/Berlin - #CORS_ORIGINS: "http://dsf-zars-bpe-app" - # ORGANIZATION_TYPE: "MeDIC" - needs to be put into the fhir resource organisation depends_on: - dsf-dic-fhir-db @@ -79,20 +82,37 @@ services: - db_liquibase.password dsf-dic-bpe-app: - image: ghcr.io/highmed/bpe:0.5.2 + image: ghcr.io/highmed/bpe:0.7.0 restart: on-failure + healthcheck: + test: [ "CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient" ] + interval: 10s + timeout: 15s + retries: 5 volumes: - type: bind - source: ../../assets/codex-process-feasibility-0.1.0-RC6.jar - target: /opt/bpe/process/codex-process-feasibility-0.1.0-RC6.jar + source: ../../assets/feasibility-dsf-process-0.3.0.jar + target: /opt/bpe/process/feasibility-dsf-process-0.3.0.jar read_only: true - type: bind source: ./bpe/app/last_event target: /opt/bpe/last_event + - type: bind + source: ./bpe/cache + target: /opt/bpe/cache - type: bind source: ../../assets/hapi-fhir-client-5.1.0.jar target: /opt/bpe/plugin/hapi-fhir-client-5.1.0.jar read_only: true + # Use the following settings if you need to. + # - type: bind + # source: + # target: ${DSF_CLIENT_PROCESS_TRUST_STORE_PATH} + # read_only: true + # - type: bind + # source: + # target: ${DSF_CLIENT_PROCESS_KEY_STORE_PATH} + # read_only: true secrets: - db_liquibase.password - db_dic_1_bpe_user.password @@ -114,12 +134,29 @@ services: ORG_HIGHMED_DSF_BPE_DB_USER_USERNAME: dic_1_bpe_server_user ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_GROUP: dic_1_camunda_users ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_USERNAME: dic_1_camunda_server_user - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: Test_DIC_1 + ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: ${FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER} ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf-dic-fhir-proxy/fhir - DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_FLARE_WEBSERVICE_BASEURL: http://node-flare:5000/ - DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_FLARE_WEBSERVICE_CONNECTTIMEOUT: 2000 - DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_EVALUATION_STRATEGY: ${CODEX_FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY:-"structured-query"} - DE_NETZWERK_UNIVERSITAETSMEDIZIN_CODEX_PROCESSES_FEASIBILITY_EVALUATION_OBFUSCATE: ${CODEX_FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE:-"true"} + DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_FLARE_WEBSERVICE_BASE_URL: ${FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL} + DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_FLARE_WEBSERVICE_CONNECT_TIMEOUT: 2000 + DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_EVALUATION_STRATEGY: ${FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY} + DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_EVALUATION_OBFUSCATE: ${FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE} + # Use the following settings if you need to. + # For more information see: https://github.com/medizininformatik-initiative/feasibility-dsf-process/tree/develop/feasibility-dsf-process#configuration + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_PROXY_HOST: ${FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_HOST} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_PROXY_PORT: ${FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PORT} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_PROXY_USERNAME: ${FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_USERNAME} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_PROXY_PASSWORD: ${FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PASSWORD} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_AUTH_BEARER_TOKEN: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BEARER_AUTH_TOKEN} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_AUTH_BASIC_USERNAME: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_USERNAME} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_AUTH_BASIC_PASSWORD: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_PASSWORD} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TIMEOUT_CONNECT: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_TIMEOUT} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TIMEOUT_CONNECT_REQUEST: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_REQUEST_TIMEOUT} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TIMEOUT_SOCKET: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_NETWORK_OPS_TIMEOUT} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TRUST_STORE_PATH: ${FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PATH} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TRUST_STORE_PASSWORD: ${FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PASSWORD} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_KEY_STORE_PATH: ${FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PATH} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_KEY_STORE_PASSWORD: ${FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PASSWORD} + # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_BASE_URL: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASE_URL} EXTRA_JVM_ARGS: ${CODEX_DSF_ZARS_BPE_APP_JVM_ARGS} TZ: "Europe/Berlin" depends_on: @@ -174,6 +211,8 @@ secrets: db_fhir_dic_1_user_permanent_delete.password: file: ../../secrets/db_fhir_dic_1_user_permanent_delete.password + + volumes: dsf-dic-fhir-db-data: name: "dsf-dic-fhir-db-data" diff --git a/feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml b/feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml index 00a41ef..d560421 100644 --- a/feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml +++ b/feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml @@ -171,7 +171,7 @@ - + @@ -180,7 +180,7 @@ - + @@ -218,7 +218,7 @@ - + @@ -256,7 +256,7 @@ - + From 680b22ee7e1a3c19ea3446f716db1fb59319cc8d Mon Sep 17 00:00:00 2001 From: DiCanio Date: Wed, 29 Jun 2022 11:51:44 +0200 Subject: [PATCH 043/118] Revise Overview Structure in Triangle Docs Structures the overview part of the Triangle docs into smaller sections. This helps the reader to grasp important information more easily without the need for reading a lot of text. --- feasibility-triangle/README.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 8ea0d38..27b65bd 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -6,25 +6,31 @@ The Feasibility Triangle part of this Repository provides a site (data integrati ## Overview -The Feasibility Triangle is composed of three components: +The Feasibility Triangle is composed of four components: 1. A Middleware Client (AKTIN or DSF) 2. A Feasibility Analysis Request Executor (FLARE) 3. A FHIR Server (Blaze) 4. Reverse Proxy (NGINX) -The Feasibility Triangle also comes with a reverse proxy, which provides a basic auth for the FHIR Server and the FLARE component, so that they can be integrated into a sites multi server infrastructure. -The triangle can be set up in different ways depending on which components and whether FHIR Search or CQL is to be used. -This leads to the following setup Options: +The reverse proxy allows for integration into a site's multi-server infrastructure. It also provides basic auth capability for FHIR server and FLARE components. -AKTIN - FLARE (FHIR Search) - FHIR Server (not CQL ready) -AKTIN - FHIR Server (CQL ready) -DSF - FLARE (FHIR Search) - FHIR Server (not CQL ready) -DSF - FHIR Server (CQL ready) +### CQL Support -The components all work with defined interfaces and can be exchanged if a component with equivalent capabilities is provided by the site. -In this manner the FHIR Server provided here (Blaze) can be exchanged for a FHIR server of choice, which either offers CQL or the required FHIR Search capabilities. +[CQL](https://cql.hl7.org) is supported. If your FHIR server **does not** support CQL itself then the FLARE component must be used as a kind of translation mediator. +### Component Interchangeability + +All components work with well-defined interfaces making them interchangeable. Thus, there are different middleware clients and FHIR servers to chose from. + +This leads to the following setup options: + +- AKTIN - FLARE (FHIR Search) - FHIR Server (not CQL ready) +- AKTIN - FHIR Server (CQL ready) +- DSF - FLARE (FHIR Search) - FHIR Server (not CQL ready) +- DSF - FHIR Server (CQL ready) + +**_When choosing a FHIR server, make sure it supports either CQL or the required FHIR search capabilities._** ## Setting up the Feasibility Triangle From 0a6cfeb030120cab073d803fa2691e8309494988 Mon Sep 17 00:00:00 2001 From: DiCanio Date: Mon, 8 Aug 2022 10:09:35 +0200 Subject: [PATCH 044/118] Add Basic DSF Check Utility Adds a simple script to check connectivity of a DSF instance against other participants. Also allows to check results based on an event ID. --- util/checks/dsf-check.sh | 253 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100755 util/checks/dsf-check.sh diff --git a/util/checks/dsf-check.sh b/util/checks/dsf-check.sh new file mode 100755 index 0000000..af6eceb --- /dev/null +++ b/util/checks/dsf-check.sh @@ -0,0 +1,253 @@ +#!/usr/bin/env bash + +function fdpg_connection { +read -d '' USAGE << EOF +Checks whether the connection to the FDPG can be established. + +Usage: ./dsf-check fdpg-connection --cacert --cert --key --connect-to +Flags: + --cacert Path to a PEM formatted file containing trusted CA certificates. Necessary when trying to connect to an FDPG instance serving a self-signed certificate. + --cert Path to a PEM formatted client certificate to authenticate yourself against the FDPG instance. + --key Path to a private key file associated with the client certificate to authenticate yourself against the FDPG instance. + --connect-to URL to an FDPG instance to run the check against. (Default: https://dsf.forschen-fuer-gesundheit.de/fhir) +EOF + +CACERT='' +CERT='' +KEY='' +CONNECT_TO="https://dsf.forschen-fuer-gesundheit.de/fhir" + +while test $# -gt 0; do + case "$1" in + --cacert) + shift + if test $# -gt 0; then + export CACERT=$1 + else + echo "No path to a file containing trusted CA certificates specified." + echo "${USAGE}" + exit 1 + fi + shift + ;; + --cert) + shift + if test $# -gt 0; then + export CERT=$1 + else + echo "No path to a client certificate specified." + echo "${USAGE}" + exit 1 + fi + shift + ;; + --key) + shift + if test $# -gt 0; then + export KEY=$1 + else + echo "No path to the private key, associated with the client certificate, specified." + echo "${USAGE}" + exit 1 + fi + shift + ;; + --connect-to) + shift + if test $# -gt 0; then + CONNECT_TO=$1 + else + echo "No URL target specified." + echo "${USAGE}" + exit 1 + fi + shift + ;; + *) echo "${USAGE}"; exit 1;; + help|--help|-h) echo "${USAGE}";; + esac +done + +COMMAND_FLAGS="" +if [[ ! -z "${CACERT}" ]]; then + COMMAND_FLAGS="${COMMAND_FLAGS} --cacert ${CACERT}" +fi +if [[ ! -z "${CERT}" ]]; then + COMMAND_FLAGS="${COMMAND_FLAGS} --cert ${CERT}" +fi +if [[ ! -z "${KEY}" ]]; then + COMMAND_FLAGS="${COMMAND_FLAGS} --key ${KEY}" +fi +if [[ ! "${CONNECT_TO}" == */ ]]; then + CONNECT_TO="${CONNECT_TO}/" +fi + +STATUS_CODE=$(curl -s --write-out "%{http_code}" -H "Accept: application/fhir+json" ${COMMAND_FLAGS} ${CONNECT_TO}metadata) +if [[ ${STATUS_CODE} -ne 200 ]]; then + echo "FAILED" + exit 1 +else + echo "SUCCESS" +fi +} + + +function result { +read -d '' USAGE << EOF +Gets the result of a specific query run from the FHIR inbox of a site (DIC). The query is uniquely identified by +the specified business key. + +Usage: ./dsf-check result --cacert --cert --key --connect-to --dic-identifier business-key +Flags: + --cacert Path to a PEM formatted file containing trusted CA certificates. Necessary when trying to connect to an FDPG instance serving a self-signed certificate. + --cert Path to a PEM formatted client certificate to authenticate yourself against the FDPG instance. + --key Path to a private key file associated with the client certificate to authenticate yourself against the FDPG instance. + --connect-to URL to an FDPG instance to run the check against. (Default: https://dsf.forschen-fuer-gesundheit.de/fhir) + --dic-identifier DSF specific string for identifying a participating site (DIC). +EOF + +CACERT='' +CERT='' +KEY='' +DIC_IDENTIFIER='' +CONNECT_TO="https://dsf.forschen-fuer-gesundheit.de/fhir" + +while test $# -gt 0; do + case "$1" in + --cacert) + shift + if test $# -gt 0; then + export CACERT=$1 + else + echo "No path to a file containing trusted CA certificates specified." + echo "${USAGE}" + exit 1 + fi + shift + ;; + --cert) + shift + if test $# -gt 0; then + export CERT=$1 + else + echo "No path to a client certificate specified." + echo "${USAGE}" + exit 1 + fi + shift + ;; + --key) + shift + if test $# -gt 0; then + export KEY=$1 + else + echo "No path to the private key, associated with the client certificate, specified." + echo "${USAGE}" + exit 1 + fi + shift + ;; + --connect-to) + shift + if test $# -gt 0; then + CONNECT_TO=$1 + else + echo "No URL target specified." + echo "${USAGE}" + exit 1 + fi + shift + ;; + --dic-identifier) + shift + if test $# -gt 0; then + DIC_IDENTIFIER=$1 + else + echo "No DIC identifier specified." + echo "${USAGE}" + exit 1 + fi + shift + ;; + --*) echo "${USAGE}"; exit 1;; + *) + BUSINESS_KEY=$1 + shift + ;; + help|--help|-h) echo "${USAGE}";; + esac +done + +if [[ -z "${DIC_IDENTIFIER}" ]]; then + echo "No DIC identifier specified." + echo "${USAGE}" + exit 1 +fi + +COMMAND_FLAGS="" +if [[ ! -z "${CACERT}" ]]; then + COMMAND_FLAGS="${COMMAND_FLAGS} --cacert ${CACERT}" +fi +if [[ ! -z "${CERT}" ]]; then + COMMAND_FLAGS="${COMMAND_FLAGS} --cert ${CERT}" +fi +if [[ ! -z "${KEY}" ]]; then + COMMAND_FLAGS="${COMMAND_FLAGS} --key ${KEY}" +fi +if [[ ! "${CONNECT_TO}" == */ ]]; then + CONNECT_TO="${CONNECT_TO}/" +fi + +CORRELATING_TASK_URL=$(curl -s -H "Accept: application/fhir+json" ${COMMAND_FLAGS} ${CONNECT_TO}Task?_sort=-_lastUpdated | jq --arg bkey "${BUSINESS_KEY}" --arg dicid "${DIC_IDENTIFIER}" -r '.entry[] | select(.resource | .input[] | .type.coding[0].code == "business-key" and .valueString == $bkey) | select(.resource.requester.identifier.value == $dicid) | .fullUrl') + +if [[ -z "${CORRELATING_TASK_URL}" ]]; then + echo "Could not find a corresponding task." + exit 2 +fi + +CORRELATING_TASK=$(curl -s -H "Accept: application/fhir+json" ${COMMAND_FLAGS} ${CORRELATING_TASK_URL}) +TASK_ID=$(echo ${CORRELATING_TASK} | jq -r .id) +TASK_STATUS=$(echo ${CORRELATING_TASK} | jq -r .status) +MEASURE_REPORT_REF=$(echo ${CORRELATING_TASK} | jq -r 'select(.input[] | .type.coding[0].code == "message-name" and .valueString == "feasibilitySingleDicResultMessage") | .input[] | select(.type.coding[0].code == "measure-report-reference") | .valueReference.reference') + +if [[ -z "${MEASURE_REPORT_REF}" ]]; then + echo "Could not find a corresponding measure report." + exit 2 +fi + +MEASURE_REPORT=$(curl -s -H "Accept: application/fhir+json" ${COMMAND_FLAGS} ${MEASURE_REPORT_REF}) +MEASURE_REPORT_ID=$(echo ${MEASURE_REPORT} | jq -r .id) +MEASURE_REPORT_POPULATION_COUNT=$(echo ${MEASURE_REPORT} | jq -r '.group[] | select(has("population")) | .population[] | select(.code.coding[0].code == "initial-population") | .count') + +echo -e "Task ID: \t\t${TASK_ID}" +echo -e "Task Status: \t\t${TASK_STATUS}" +echo -e "Business Key: \t\t${BUSINESS_KEY}" +echo -e "Measure Report ID: \t${MEASURE_REPORT_ID}" +echo -e "Population Count: \t${MEASURE_REPORT_POPULATION_COUNT}" +} + +# The main entrypoint of this script. +function entrypoint() { +read -d '' USAGE << EOF +Command line utility to check a DSF installation. + +Dependencies: + curl For running the actual requests. See https://github.com/curl/curl + jq For operating on data in JSON format. See https://github.com/stedolan/jq + +Usage: ./dsf-check [command] +Commands are + fdpg-connection Checks whether the connection to the FDPG can be established. + result Checks results from a distributed query run for your site (DIC). + help Shows help for commands. +EOF + + case "$1" in + fdpg-connection) fdpg_connection ${@:2};; + result) result ${@:2};; + *) echo "${USAGE}"; exit 1;; + help|--help|-h) echo "${USAGE}";; + esac +} + +entrypoint ${@:1} From db49e6bab9c75d3dc35ce1855bb37d9fd11ddbda Mon Sep 17 00:00:00 2001 From: DiCanio Date: Mon, 8 Aug 2022 10:14:41 +0200 Subject: [PATCH 045/118] Add Trust Store Utility A simple Docker based utility to build a Java trust store as potentially needed for the latest DSF plugin version (0.2.0). This should only be of concern if self-signed certificates are being used. --- util/certs/Dockerfile | 7 +++++ util/certs/add_cert_to_truststore.sh | 27 +++++++++++++++++++ ...create_trust_store_with_additional_cert.sh | 9 +++++++ util/certs/trust_store_output/.gitkeep | 0 util/certs/your_certs/.gitkeep | 0 5 files changed, 43 insertions(+) create mode 100644 util/certs/Dockerfile create mode 100755 util/certs/add_cert_to_truststore.sh create mode 100755 util/certs/create_trust_store_with_additional_cert.sh create mode 100644 util/certs/trust_store_output/.gitkeep create mode 100644 util/certs/your_certs/.gitkeep diff --git a/util/certs/Dockerfile b/util/certs/Dockerfile new file mode 100644 index 0000000..b850ede --- /dev/null +++ b/util/certs/Dockerfile @@ -0,0 +1,7 @@ +FROM eclipse-temurin:17-jre-focal + + +WORKDIR /opt/certs +COPY add_cert_to_truststore.sh /opt/certs/add_cert_to_truststore.sh + +ENTRYPOINT ["./add_cert_to_truststore.sh"] diff --git a/util/certs/add_cert_to_truststore.sh b/util/certs/add_cert_to_truststore.sh new file mode 100755 index 0000000..5433079 --- /dev/null +++ b/util/certs/add_cert_to_truststore.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +i=0 +for f in /opt/certs/your_certs/*.pem; do + if [ -f "$f" ]; then + echo "Importing additional certificate at $f into truststore." + + keytool -importcert -file "${f}" -alias "additional-cert-${i}" -storepass changeit -noprompt \ + -cacerts + + if [[ $? -ne 0 ]]; then + echo "Importing additional certificate at $f into truststore failed." + exit 1 + fi + + i=$((i+1)) + fi +done + +echo -n "Copying truststore to output directory..." +cp $JAVA_HOME/lib/security/cacerts /opt/certs/output/ + +if [[ $? -ne 0 ]]; then + echo "FAILED" +else + echo "OK" +fi diff --git a/util/certs/create_trust_store_with_additional_cert.sh b/util/certs/create_trust_store_with_additional_cert.sh new file mode 100755 index 0000000..7b9a352 --- /dev/null +++ b/util/certs/create_trust_store_with_additional_cert.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" + +docker build -t feasibility-deploy-create-trust-store ${BASE_DIR}/ +docker run --name create-trust-store --rm \ + -v "${BASE_DIR}/your_certs":/opt/certs/your_certs \ + -v "${BASE_DIR}/trust_store_output":/opt/certs/output \ + feasibility-deploy-create-trust-store diff --git a/util/certs/trust_store_output/.gitkeep b/util/certs/trust_store_output/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/util/certs/your_certs/.gitkeep b/util/certs/your_certs/.gitkeep new file mode 100644 index 0000000..e69de29 From 1f8b47e633af4210cd22c57f52483039a3cfef7b Mon Sep 17 00:00:00 2001 From: DiCanio Date: Thu, 25 Aug 2022 12:16:19 +0200 Subject: [PATCH 046/118] Add Link to DSF Configuration Wiki Trying to squeeze this information into the existing README is not possible due to explanatory branching issues. It would cause a lot of mental pressure on the reader's side. Thus, a link to a separate wiki entry is added within the README. --- feasibility-triangle/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 27b65bd..c40bdaa 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -90,6 +90,8 @@ cp * /opt/feasibility-deploy/feasibility-triangle/ontology If you use the default triangle setup you only have to configure the AKTIN client to connect to the central feasibility portal as the rest of the setup will already be correctly configured for you. +Follow the [DSF configuration wiki](https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup) if you want to use the DSF middleware instead. + To configure the AKTIN client in the default setup, change the following environment variables in the file `/opt/feasibility-deploy/feasibility-triangle/aktin-client/.env` according to the paragraph **Configurable environment variables** of this README: - FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI From d03b501c0d20ee6b9a693ab30f93ad7c26ed4336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 5 Sep 2022 15:54:25 +0200 Subject: [PATCH 047/118] bump versions flare, blaze and nginx --- .../fhir-server/blaze-server/docker-compose.yml | 2 +- feasibility-triangle/flare/docker-compose.yml | 2 +- feasibility-triangle/rev-proxy/docker-compose.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml b/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml index c6aaf4d..3e4b79e 100644 --- a/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml +++ b/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: fhir-server: - image: ghcr.io/medizininformatik-initiative/blaze:0.16 + image: ghcr.io/medizininformatik-initiative/blaze:0.17 environment: BASE_URL: ${FHIR_SERVER_BASE_URL:-http://fhir-server:8080} LOG_LEVEL: ${FHIR_SERVER_LOG_LEVEL:-error} diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index 661dfd4..a74015d 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: flare: - image: ghcr.io/rwth-imi/flare-query:1.0-rc11 + image: ghcr.io/rwth-imi/flare-query:1.0-rc15 ports: - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: diff --git a/feasibility-triangle/rev-proxy/docker-compose.yml b/feasibility-triangle/rev-proxy/docker-compose.yml index 3874aa9..eb2f84e 100644 --- a/feasibility-triangle/rev-proxy/docker-compose.yml +++ b/feasibility-triangle/rev-proxy/docker-compose.yml @@ -3,7 +3,7 @@ version: '2.0' services: feasibility-triangle-nginx: restart: unless-stopped - image: nginxinc/nginx-unprivileged:1.20-alpine + image: nginxinc/nginx-unprivileged:1.22-alpine ports: - ${FEASIBILITY_TRIANGLE_REV_PROXY_PORT:-444}:8443 volumes: From fb1fc23844e7c8b1c6c8af8334e8cebee60f4fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 5 Sep 2022 16:09:56 +0200 Subject: [PATCH 048/118] add new flare env vars --- feasibility-triangle/flare/.env.default | 7 ++++++- feasibility-triangle/flare/docker-compose.yml | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/feasibility-triangle/flare/.env.default b/feasibility-triangle/flare/.env.default index d9d1fb7..ab74d57 100644 --- a/feasibility-triangle/flare/.env.default +++ b/feasibility-triangle/flare/.env.default @@ -6,4 +6,9 @@ FLARE_FHIR_PAGE_COUNT=500 FLARE_EXEC_CORE_POOL_SIZE=4 FLARE_EXEC_MAX_POOL_SIZE=16 FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS=10 -FLARE_LOG_LEVEL=info \ No newline at end of file +FLARE_LOG_LEVEL=info +FLARE_CACHE_CLEAN_CYCLE_MINUTES= +FLARE_CACHE_ENTRY_LIFETIME_HOURS=168 +FLARE_CACHE_SIZE_THOUSANDS_ENTRIES=1 +FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS= +FLARE_CACHE_COMPLETE_DELETE_ON_CLEAN= \ No newline at end of file diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index a74015d..605b85f 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -16,6 +16,11 @@ services: LOG_LEVEL: ${FLARE_LOG_LEVEL:-warn} MAPPINGS_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json CONCEPT_TREE_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json + FLARE_CACHE_CLEAN_CYCLE_MINUTES: ${FLARE_CACHE_CLEAN_CYCLE_MINUTES:-1440} + FLARE_CACHE_ENTRY_LIFETIME_HOURS: ${FLARE_CACHE_ENTRY_LIFETIME_HOURS:-168} + FLARE_CACHE_SIZE_THOUSANDS_ENTRIES: ${FLARE_CACHE_SIZE_THOUSANDS_ENTRIES:-8} + FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS: ${FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS:-true} + FLARE_CACHE_COMPLETE_DELETE_ON_CLEAN: ${FLARE_CACHE_COMPLETE_DELETE_ON_CLEAN:-false} restart: unless-stopped volumes: - ${FLARE_LOCAL_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json From 07a389b612e3aa652cdbb3599e44ca159ff96318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Mon, 5 Sep 2022 16:55:15 +0200 Subject: [PATCH 049/118] bump versions, add env vars and flyway migration --- feasibility-portal/.gitignore | 1 + feasibility-portal/backend/.env.default | 1 + feasibility-portal/backend/docker-compose.yml | 4 ++-- feasibility-portal/gui/deploy-config.json.default | 2 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-portal/keycloak/docker-compose.yml | 2 +- feasibility-portal/ontology/migration/.gitkeep | 0 7 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 feasibility-portal/ontology/migration/.gitkeep diff --git a/feasibility-portal/.gitignore b/feasibility-portal/.gitignore index 2b3f625..782034e 100644 --- a/feasibility-portal/.gitignore +++ b/feasibility-portal/.gitignore @@ -5,3 +5,4 @@ keycloak/data /ontology/*.json /ontology/ui_profiles/*.json +/ontology/migration/*.sql diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index 8f7f378..6ec871b 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -31,4 +31,5 @@ FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID=Test_ZARS FEASIBILITY_BACKEND_UI_PROFILES_PATH=../ontology/ui_profiles FEASIBILITY_BACKEND_CONCEPT_TREE_PATH=../ontology/codex-code-tree.json FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH=../ontology/codex-term-code-mapping.json +FEASIBILITY_BACKEND_MIGRATION_PATH=../ontology/migration/R__Load_latest_ui_profile.sql FEASIBILITY_BACKEND_CERTS_PATH=../dsf-broker/certs \ No newline at end of file diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 9b82cc6..21c5da2 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.1.0-rc1 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.1.0-rc8 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -12,7 +12,6 @@ services: FEASIBILITY_DATABASE_PORT: ${FEASIBILITY_BACKEND_DATASOURCE_PORT:-5432} FEASIBILITY_DATABASE_USER: ${FEASIBILITY_BACKEND_DATASOURCE_USERNAME:-guidbuser} FEASIBILITY_DATABASE_PASSWORD: ${FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-guidbpw} - BROKER_CLIENT_TYPE: ${FEASIBILITY_BACKEND_BROKER_CLIENT_TYPE:-AKTIN} KEYCLOAK_ENABLED: ${FEASIBILITY_BACKEND_KEYCLOAK_ENABLED:-true} KEYCLOAK_ALLOWED_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} KEYCLOAK_ADMIN_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE:-FEASIBILITY_ADMIN} @@ -43,6 +42,7 @@ services: - ${FEASIBILITY_BACKEND_UI_PROFILES_PATH:-../ontology/ui_profiles}:/opt/codex-feasibility-backend/ontology/ui_profiles - ${FEASIBILITY_BACKEND_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:/opt/codex-feasibility-backend/ontology/codex-code-tree.json - ${FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:/opt/codex-feasibility-backend/ontology/codex-term-code-mapping.json + - ${FEASIBILITY_BACKEND_MIGRATION_PATH:-../ontology/migration/R__Load_latest_ui_profile.sql}:/opt/codex-feasibility-backend/ontology/migration/R__Load_latest_ui_profile.sql - ${FEASIBILITY_BACKEND_CERTS_PATH:-../dsf-broker/certs}:/opt/codex-feasibility-security feasibility-gui-backend-db: diff --git a/feasibility-portal/gui/deploy-config.json.default b/feasibility-portal/gui/deploy-config.json.default index 46d0d97..c76e378 100644 --- a/feasibility-portal/gui/deploy-config.json.default +++ b/feasibility-portal/gui/deploy-config.json.default @@ -6,7 +6,7 @@ "baseUrl": "/api" }, "uiBackendApi": { - "baseUrl": "https://localhost/api/v1" + "baseUrl": "https://localhost/api/v2" }, "auth": { "baseUrl": "https://localhost", diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 740d64a..91df968 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.3.0_rc2 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.3.0_rc4 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-portal/keycloak/docker-compose.yml b/feasibility-portal/keycloak/docker-compose.yml index 8424dd2..3792378 100644 --- a/feasibility-portal/keycloak/docker-compose.yml +++ b/feasibility-portal/keycloak/docker-compose.yml @@ -12,7 +12,7 @@ services: - "feasibility-auth-db:/var/lib/postgresql/data" auth: - image: jboss/keycloak:15.0.2 + image: jboss/keycloak:16.1.1 restart: unless-stopped environment: DB_VENDOR: POSTGRES diff --git a/feasibility-portal/ontology/migration/.gitkeep b/feasibility-portal/ontology/migration/.gitkeep new file mode 100644 index 0000000..e69de29 From 9e75c7fca4724c4718d48a54ee2abfab80007c1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 7 Sep 2022 19:23:56 +0200 Subject: [PATCH 050/118] add dsf and update vesrions --- feasibility-triangle/dsf-client/.env.default | 1 + feasibility-triangle/dsf-client/docker-compose.yml | 1 + feasibility-triangle/flare/docker-compose.yml | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/feasibility-triangle/dsf-client/.env.default b/feasibility-triangle/dsf-client/.env.default index fba08fd..f1936ae 100644 --- a/feasibility-triangle/dsf-client/.env.default +++ b/feasibility-triangle/dsf-client/.env.default @@ -6,3 +6,4 @@ FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE=true FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL=http://node-flare:5000/ FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PATH=/opt/bpe/truststore.p12 FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PATH=/opt/bpe/keystore +FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASE_URL=http://fhir-server:8080/fhir/ diff --git a/feasibility-triangle/dsf-client/docker-compose.yml b/feasibility-triangle/dsf-client/docker-compose.yml index 02b0ded..2c19724 100644 --- a/feasibility-triangle/dsf-client/docker-compose.yml +++ b/feasibility-triangle/dsf-client/docker-compose.yml @@ -140,6 +140,7 @@ services: DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_FLARE_WEBSERVICE_CONNECT_TIMEOUT: 2000 DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_EVALUATION_STRATEGY: ${FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY} DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_EVALUATION_OBFUSCATE: ${FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE} + DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_BASE_URL: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASE_URL} # Use the following settings if you need to. # For more information see: https://github.com/medizininformatik-initiative/feasibility-dsf-process/tree/develop/feasibility-dsf-process#configuration # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_PROXY_HOST: ${FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_HOST} diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index 605b85f..4e116f3 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -19,7 +19,7 @@ services: FLARE_CACHE_CLEAN_CYCLE_MINUTES: ${FLARE_CACHE_CLEAN_CYCLE_MINUTES:-1440} FLARE_CACHE_ENTRY_LIFETIME_HOURS: ${FLARE_CACHE_ENTRY_LIFETIME_HOURS:-168} FLARE_CACHE_SIZE_THOUSANDS_ENTRIES: ${FLARE_CACHE_SIZE_THOUSANDS_ENTRIES:-8} - FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS: ${FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS:-true} + FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS: ${FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS:-false} FLARE_CACHE_COMPLETE_DELETE_ON_CLEAN: ${FLARE_CACHE_COMPLETE_DELETE_ON_CLEAN:-false} restart: unless-stopped volumes: From bff652bf9da6bbc274b78b0be18694c0402a6ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 7 Sep 2022 19:25:33 +0200 Subject: [PATCH 051/118] bump portal versions --- feasibility-portal/backend/docker-compose.yml | 2 +- feasibility-portal/dsf-broker/docker-compose.yml | 2 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-portal/start-feasibility-portal.sh | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 21c5da2..dd477dd 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.1.0-rc8 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.0.0-rc7 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: diff --git a/feasibility-portal/dsf-broker/docker-compose.yml b/feasibility-portal/dsf-broker/docker-compose.yml index ed91f19..3937d13 100644 --- a/feasibility-portal/dsf-broker/docker-compose.yml +++ b/feasibility-portal/dsf-broker/docker-compose.yml @@ -7,7 +7,7 @@ services: image: nginx:1.21 restart: on-failure ports: - - "127.0.0.1:443:443" + - "127.0.0.1:445:443" secrets: - proxy_certificate_and_int_cas.pem - proxy_certificate_private_key.pem diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 91df968..7d7fe05 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.3.0_rc4 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.3.0_rc5 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-portal/start-feasibility-portal.sh b/feasibility-portal/start-feasibility-portal.sh index e865e08..cebfbd8 100755 --- a/feasibility-portal/start-feasibility-portal.sh +++ b/feasibility-portal/start-feasibility-portal.sh @@ -4,8 +4,9 @@ COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" +sh "$BASE_DIR"/dsf-broker/start.sh "$COMPOSE_PROJECT" docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/keycloak/docker-compose.yml up -d docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/backend/docker-compose.yml up -d docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/gui/docker-compose.yml up -d docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-broker/docker-compose.yml up -d -#sh "$BASE_DIR"/dsf-broker/start.sh "$COMPOSE_PROJECT" + From c94e32cb4391b338d5aa6fe11e9dcf5a96f05518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 7 Sep 2022 20:43:14 +0200 Subject: [PATCH 052/118] bump aktin version and add aktin n threads to config --- feasibility-portal/start-feasibility-portal.sh | 2 +- feasibility-triangle/aktin-client/.env.default | 3 ++- .../aktin-client/client-exec-scripts/call-cql.sh | 2 +- .../aktin-client/client-exec-scripts/call-flare.sh | 2 +- feasibility-triangle/aktin-client/client-exec-scripts/echo.sh | 2 +- .../aktin-client/client-exec-scripts/execute-cql.sh | 2 +- feasibility-triangle/aktin-client/docker-compose.yml | 3 ++- 7 files changed, 9 insertions(+), 7 deletions(-) diff --git a/feasibility-portal/start-feasibility-portal.sh b/feasibility-portal/start-feasibility-portal.sh index cebfbd8..ad3ea49 100755 --- a/feasibility-portal/start-feasibility-portal.sh +++ b/feasibility-portal/start-feasibility-portal.sh @@ -4,7 +4,7 @@ COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -sh "$BASE_DIR"/dsf-broker/start.sh "$COMPOSE_PROJECT" +#sh "$BASE_DIR"/dsf-broker/start.sh "$COMPOSE_PROJECT" docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/keycloak/docker-compose.yml up -d docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/backend/docker-compose.yml up -d docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/gui/docker-compose.yml up -d diff --git a/feasibility-triangle/aktin-client/.env.default b/feasibility-triangle/aktin-client/.env.default index d92afaa..b3f706c 100644 --- a/feasibility-triangle/aktin-client/.env.default +++ b/feasibility-triangle/aktin-client/.env.default @@ -14,4 +14,5 @@ FEASIBILITY_AKTIN_CLIENT_OBFUSCATE=true FEASIBILITY_AKTIN_JAVA_OPTS= FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER= FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW= -FEASIBILITY_AKTIN_FHIR_BASE_URL=http://fhir-server:8080/fhir \ No newline at end of file +FEASIBILITY_AKTIN_FHIR_BASE_URL=http://fhir-server:8080/fhir +FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS=2 \ No newline at end of file diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh index e2576c4..1c5df95 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh QUERY_INPUT=$(cat) CLIENT_OBFUSCATE=${CLIENT_OBFUSCATE:-true} diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh index 231e708..c55ad1f 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh FLARE_BASE_URL=${FLARE_BASE_URL:-"http://flare:8080"} CLIENT_OBFUSCATE=${CLIENT_OBFUSCATE:-true} diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh b/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh index bb73d2b..b19cc01 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh @@ -1,3 +1,3 @@ -#!/bin/bash +#!/bin/sh echo "Connection works - this is a reponse from the a client" diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh index fbd05c5..85a74c9 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh BASE=${FHIR_BASE_URL:-"http://fhir-server:8080/fhir"} BASIC_AUTH_64=$(echo -n "$AUTH_USER:$AUTH_PW" | base64) diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index bc6ab5f..5042fa6 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.5.0 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.6.0 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} @@ -20,6 +20,7 @@ services: AUTH_USER: ${FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER:-} AUTH_PW: ${FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW:-} FHIR_BASE_URL: ${FEASIBILITY_AKTIN_FHIR_BASE_URL:-http://fhir-server:8080/fhir} + PROCESS_EXECUTOR_THREADS: ${FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS:-2} volumes: - ./client-exec-scripts/echo.sh:/opt/aktin/echo.sh - ./client-exec-scripts/call-cql.sh:/opt/aktin/call-cql.sh From 59899c10d18d1cfaf25bf7da85f90147c0663fef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 11:31:34 +0200 Subject: [PATCH 053/118] bump backend version --- feasibility-portal/backend/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index dd477dd..11fe4f7 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.0.0-rc7 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.0.0-rc9 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: From 894f20968f3f71ffcd12aff752001edd2f95f55f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 13:32:30 +0200 Subject: [PATCH 054/118] update readmes to be compatible with new version --- feasibility-portal/README.md | 6 +++++- feasibility-triangle/README.md | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 917d25c..66dc1ba 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -48,10 +48,13 @@ mkdir ///// cd ///// unzip mapping_*.zip unzip ui_profiles_*.zip +unzip db_migration_*.zip cd mapping cp * /opt/feasibility-deploy/feasibility-portal/ontology cd ../ui_profiles cp * /opt/feasibility-deploy/feasibility-portal/ontology/ui_profiles +cd ../db_migration +cp * /opt/feasibility-deploy/feasibility-portal/ontology/migration ``` ### Step 6 - Configure your feasibility portal @@ -60,13 +63,14 @@ If you use the default local feasibility portal setup you will only have to chan | file | environment variable | value for local setup | |--|--|--| +|keycloak/.env|FEASIBILITY_KEYCLOAK_BASE_URL| base-url-of-your-local-feasibility-portal/auth | |keycloak/.env|FEASIBILITY_KEYCLOAK_ADMIN_PW| choose a secure password here e.g. Ykc2PINWatNqL5Wq,OIxFz1Sv3dzmQ2| |backend/.env|FEASIBILITY_BACKEND_AKTIN_ENABLED|false| |backend/.env|FEASIBILITY_BACKEND_DIRECT_ENABLED|true| |backend/.env|FEASIBILITY_BACKEND_API_BASE_URL|base-url-of-your-local-feasibility-portal/api| |backend/.env|FLARE_WEBSERVICE_BASE_URL|http://flare:8080| |backend/.env|FEASIBILITY_BACKEND_ALLOWED_ORIGINS|base-url-of-your-local-feasibility-portal| -|gui/deploy-config.json|uiBackendApi > baseUrl |base-url-of-your-local-feasibility-portal/api/v1| +|gui/deploy-config.json|uiBackendApi > baseUrl |base-url-of-your-local-feasibility-portal/api/v2| |gui/deploy-config.json|auth > baseUrl |base-url-of-your-local-feasibility-portal| For more details on the environment variables see the paragraph **Configurable environment variables** of this README. diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index c40bdaa..275f52f 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -97,6 +97,7 @@ To configure the AKTIN client in the default setup, change the following environ - FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI - FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM - FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS +- FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS If you are using AKTIN, as in the default setup you have to adjust the rights of the aktin-requests.log file to allow the AKTIN container user to write the logs as follows: `chown 10001:10001 /opt/feasibility-deploy/feasibility-triangle/aktin-client/aktin-requests.log` @@ -163,6 +164,7 @@ You can then load the data into your FHIR Server using the `upload-testdata.sh` | FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS | The timeout within which a process has to return before the client sends a "failed" message to the AKTIN broker | 60 | Integer (seconds) | AKTIN | | FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND | The command to be executed on recieving a feasibility query. Allows one to switch between flare and cql execution | /opt/aktin/call-flare.sh | /opt/aktin/call-flare.sh, /opt/aktin/call-cql.sh | AKTIN | | FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS || 10 | Integer (seconds) | AKTIN | +| FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS |configures how many parallel threads AKTIN will use to process requests simultaniously| 2 | Integer (number of threads) | AKTIN | | FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL | the URL of the FLARE component if used | http://flare:8080 | URL | AKTIN | | FEASIBILITY_AKTIN_CLIENT_OBFUSCATE | Sets whether the AKTIN Client should obfuscate the results (response) of a feasibility query | TRUE | true or false | AKTIN | | FEASIBILITY_AKTIN_JAVA_OPTS | Provides Java options to the AKTIN client - can be used to configure proxy use. For example : " Dhttps.proxyHost=squid -Dhttps.proxyPort=3128" || valid java options | AKTIN | From 1da251673617e220948ca4af0a2783a0c29a7b5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 13:52:24 +0200 Subject: [PATCH 055/118] add info about update for triangle --- feasibility-triangle/README.md | 80 +++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 275f52f..b9d3b97 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -75,7 +75,7 @@ Set the rights for all files of the auth folder to 655 `chmod 655 /opt/feasibili If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie -Upload the ontology .zip files to your server, unpack them and copy the ontology files to your +Upload the mapping_*.zip file to your server, unpack it and copy the ontology files to your triangle ontology folder ```bash sudo -s @@ -207,3 +207,81 @@ You can then load the data into your FHIR Server using the `upload-testdata.sh` | FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE | Defines whether the feasibility evaluation result shall be obfuscated. | | Boolean | DSF | | FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER | Identifier of this organization. | Test_DIC_1 | String | DSF | | FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL | Base URL to a FLARE instance. Only required if evaluation strategy is set to structured-query. | http://node-flare:5000/ | URL | DSF | + + + +## Updating the Feasibility Triangle + +If you have already installed the feasibility triangle and just want to update it, follow these steps: + + +### Step 1 - Stop your triangle + +`cd /opt/feasibility-deploy && bash stop-triangle.sh` + +### Step 2 - Update repository and check out new tag + +`cd /opt/feasibility-deploy && git pull` +`git checkout ` + +### Step 3 - transfer the new env variables + +Compare the .env and .env.default files for each component and add any new variables from the .env.default file to the .env file. +Keep the existing configuration as is. + +### Step 4 - Update your ontology + +If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. +Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie. + +Make sure that you use the newest version. + +Upload the mapping_*.zip file to your server, unpack it and copy the ontology files to your triangle ontology folder. + +```bash +sudo -s +mkdir ///// +cd ///// +unzip mapping_*.zip +cd mapping +cp * /opt/feasibility-deploy/feasibility-triangle/ontology +``` + +Existing mapping files should be replaced. + +### Step 5 - Start your triangle + +To start the triangle navigate to `/opt/feasibility-deploy/feasibility-triangle` and +execute `bash start-triangle.sh`. + +### Step 6 - Log in to the central feasibility portal and test your connection + +Ask for the Url of the central portal at the FDPG or check Confluence for the correct address. + +Log in to the portal and send a request with the Inclusion Criterion chosen from the Inclusion criteria tree (folder sign under Inclusion Criteria) +"Person > PatientIn > Geschlecht: Female,Male" + +and press "send". + +Check your triangle aktin client logs: +`cat /opt/feasibility-deploy/feasibility-triangle/aktin-client/aktin-requests.log` + +you should see output similar to: +``` +##### INCOMING REQUEST at Thu Sep 8 11:49:08 UTC 2022 ##### +----BEGIN REQUEST---- +{"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"gender","system":"mii.abide","display":"Geschlecht"}],"attributeFilters":[{"type":"concept","selectedConcepts":[{"code":"female","system":"http://hl7.org/fhir/administrative-gender","display":"Female"},{"code":"male","system":"http://hl7.org/fhir/administrative-gender","display":"Male"}],"attributeCode":{"code":"gender","system":"mii.abide","display":"Geschlecht"}}]}]]} +----END REQUEST---- +----BEGIN RESPONSE---- +65 +----END RESPONSE---- +``` + + + + + + + + + From 19c2a3e1058ff746b96fb69083214d7c1c8ba2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 14:19:18 +0200 Subject: [PATCH 056/118] add dsf update info to readme --- feasibility-triangle/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index b9d3b97..ef07955 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -254,7 +254,12 @@ Existing mapping files should be replaced. To start the triangle navigate to `/opt/feasibility-deploy/feasibility-triangle` and execute `bash start-triangle.sh`. -### Step 6 - Log in to the central feasibility portal and test your connection +### Step 6 - Update your DSF + +If you are using the DSF to connect to the central feasibility portal, plese follow the instructions here: +https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup + +### Step 7 - Log in to the central feasibility portal and test your connection Ask for the Url of the central portal at the FDPG or check Confluence for the correct address. From b9d7a7d15804d08165d7f2d7c4fae5aca24f0046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 14:25:33 +0200 Subject: [PATCH 057/118] update readme --- feasibility-portal/README.md | 61 +++++++++++++++++++++++++++++++++- feasibility-triangle/README.md | 4 +-- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 66dc1ba..c17b516 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -164,4 +164,63 @@ After a few moments you should see the results to your query in the **Number of | FEASIBILITY_KEYCLOAK_PROXY_ADDR_FORWARDING | enables proxy forwarding in keyloak, which is required if a proxy like nginx is used | true | | KEYCLOAK | | FEASIBILITY_KEYCLOAK_BASE_URL | the base url used by keyloak. This has to be configured to the nginx url which forwards to keycloak if an nginx is used | https://localhost/auth | | KEYCLOAK | | FEASIBILITY_DSF_BROKER_PROCESS_ORGANIZATION_IDENTIFIER | Identifier of this organization. | Test_ZARS | String | DSF | -| FEASIBILITY_DSF_BROKER_PROCESS_FHIR_SERVER_BASE_URL | Base URL to a FHIR server or proxy for feasibility evaluation. This can also be the base URL of a reverse proxy if used. Only required if evaluation strategy is set to cql. | https://dsf-zars-fhir-proxy/fhir | URL | DSF | \ No newline at end of file +| FEASIBILITY_DSF_BROKER_PROCESS_FHIR_SERVER_BASE_URL | Base URL to a FHIR server or proxy for feasibility evaluation. This can also be the base URL of a reverse proxy if used. Only required if evaluation strategy is set to cql. | https://dsf-zars-fhir-proxy/fhir | URL | DSF | + + + +## Updating your local feasibility portal + +If you have already installed the local feasibility portal and just want to update it, follow these steps: + + +### Step 1 - Stop your portal + +`cd /opt/feasibility-deploy/feasibility-triangle && bash stop-feasibility-portal.sh` + +### Step 2 - Update repository and check out new tag + +`cd /opt/feasibility-deploy && git pull` +`git checkout ` + +### Step 3 - transfer the new env variables + +Compare the .env and .env.default files for each component and add any new variables from the .env.default file to the .env file. +Keep the existing configuration as is. + +### Step 4 - Update your ontology + +If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. +Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie + +Upload the ontology .zip files to your server, unpack them and copy the ontology files to your feasibility portal ontology folder. + +```bash +sudo -s +mkdir ///// +cd ///// +unzip mapping_*.zip +unzip ui_profiles_*.zip +unzip db_migration_*.zip +cd mapping +cp * /opt/feasibility-deploy/feasibility-portal/ontology +cd ../ui_profiles +cp * /opt/feasibility-deploy/feasibility-portal/ontology/ui_profiles +cd ../db_migration +cp * /opt/feasibility-deploy/feasibility-portal/ontology/migration +``` + +Existing files should be replaced. + +### Step 5 - Start your triangle + +To start the portal navigate to `/opt/feasibility-deploy/feasibility-portal` and +execute `bash start-feasibility-portal-local.sh`. + +### Step 6 - Log in to the local feasibility portal and test your connection + +Ask for the Url of the central portal at the FDPG or check Confluence for the correct address. + +Log in to the portal and send a request with the Inclusion Criterion chosen from the Inclusion criteria tree (folder sign under Inclusion Criteria) +"Person > PatientIn > Geschlecht: Female,Male" + +and press "send". \ No newline at end of file diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index ef07955..e728d01 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -217,11 +217,11 @@ If you have already installed the feasibility triangle and just want to update i ### Step 1 - Stop your triangle -`cd /opt/feasibility-deploy && bash stop-triangle.sh` +`cd /opt/feasibility-deploy/feasibility-triangle && bash stop-triangle.sh` ### Step 2 - Update repository and check out new tag -`cd /opt/feasibility-deploy && git pull` +`cd /opt/feasibility-deploy/feasibility-triangle && git pull` `git checkout ` ### Step 3 - transfer the new env variables From 5c043ee60f5b03e999e4bb74a99761de671c2a10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 16:43:46 +0200 Subject: [PATCH 058/118] bump component versions --- feasibility-portal/backend/docker-compose.yml | 2 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-triangle/flare/docker-compose.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 11fe4f7..7fe2e69 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.0.0-rc9 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.0.0 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 7d7fe05..5d543e3 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.3.0_rc5 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.3.0 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index 4e116f3..8ffab14 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: flare: - image: ghcr.io/rwth-imi/flare-query:1.0-rc15 + image: ghcr.io/rwth-imi/flare-query:1.0.0 ports: - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: From 55088882aecff158b6335181e0f9393ba85b4a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 17:08:25 +0200 Subject: [PATCH 059/118] fix dsf-checks.sh according to linter --- util/checks/dsf-check.sh | 42 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/util/checks/dsf-check.sh b/util/checks/dsf-check.sh index af6eceb..747c880 100755 --- a/util/checks/dsf-check.sh +++ b/util/checks/dsf-check.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash function fdpg_connection { -read -d '' USAGE << EOF +read -dr '' USAGE << EOF Checks whether the connection to the FDPG can be established. Usage: ./dsf-check fdpg-connection --cacert --cert --key --connect-to @@ -69,20 +69,20 @@ while test $# -gt 0; do done COMMAND_FLAGS="" -if [[ ! -z "${CACERT}" ]]; then +if [[ -n "${CACERT}" ]]; then COMMAND_FLAGS="${COMMAND_FLAGS} --cacert ${CACERT}" fi -if [[ ! -z "${CERT}" ]]; then +if [[ -n "${CERT}" ]]; then COMMAND_FLAGS="${COMMAND_FLAGS} --cert ${CERT}" fi -if [[ ! -z "${KEY}" ]]; then +if [[ -n "${KEY}" ]]; then COMMAND_FLAGS="${COMMAND_FLAGS} --key ${KEY}" fi if [[ ! "${CONNECT_TO}" == */ ]]; then CONNECT_TO="${CONNECT_TO}/" fi -STATUS_CODE=$(curl -s --write-out "%{http_code}" -H "Accept: application/fhir+json" ${COMMAND_FLAGS} ${CONNECT_TO}metadata) +STATUS_CODE=$(curl -s --write-out "%{http_code}" -H "Accept: application/fhir+json" "${COMMAND_FLAGS}" "${CONNECT_TO}"metadata) if [[ ${STATUS_CODE} -ne 200 ]]; then echo "FAILED" exit 1 @@ -93,7 +93,7 @@ fi function result { -read -d '' USAGE << EOF +read -dr '' USAGE << EOF Gets the result of a specific query run from the FHIR inbox of a site (DIC). The query is uniquely identified by the specified business key. @@ -185,39 +185,39 @@ if [[ -z "${DIC_IDENTIFIER}" ]]; then fi COMMAND_FLAGS="" -if [[ ! -z "${CACERT}" ]]; then +if [[ -n "${CACERT}" ]]; then COMMAND_FLAGS="${COMMAND_FLAGS} --cacert ${CACERT}" fi -if [[ ! -z "${CERT}" ]]; then +if [[ -n "${CERT}" ]]; then COMMAND_FLAGS="${COMMAND_FLAGS} --cert ${CERT}" fi -if [[ ! -z "${KEY}" ]]; then +if [[ -n "${KEY}" ]]; then COMMAND_FLAGS="${COMMAND_FLAGS} --key ${KEY}" fi if [[ ! "${CONNECT_TO}" == */ ]]; then CONNECT_TO="${CONNECT_TO}/" fi -CORRELATING_TASK_URL=$(curl -s -H "Accept: application/fhir+json" ${COMMAND_FLAGS} ${CONNECT_TO}Task?_sort=-_lastUpdated | jq --arg bkey "${BUSINESS_KEY}" --arg dicid "${DIC_IDENTIFIER}" -r '.entry[] | select(.resource | .input[] | .type.coding[0].code == "business-key" and .valueString == $bkey) | select(.resource.requester.identifier.value == $dicid) | .fullUrl') +CORRELATING_TASK_URL=$(curl -s -H "Accept: application/fhir+json" "${COMMAND_FLAGS}" "${CONNECT_TO}Task?_sort=-_lastUpdated" | jq --arg bkey "${BUSINESS_KEY}" --arg dicid "${DIC_IDENTIFIER}" -r '.entry[] | select(.resource | .input[] | .type.coding[0].code == "business-key" and .valueString == $bkey) | select(.resource.requester.identifier.value == $dicid) | .fullUrl') if [[ -z "${CORRELATING_TASK_URL}" ]]; then echo "Could not find a corresponding task." exit 2 fi -CORRELATING_TASK=$(curl -s -H "Accept: application/fhir+json" ${COMMAND_FLAGS} ${CORRELATING_TASK_URL}) -TASK_ID=$(echo ${CORRELATING_TASK} | jq -r .id) -TASK_STATUS=$(echo ${CORRELATING_TASK} | jq -r .status) -MEASURE_REPORT_REF=$(echo ${CORRELATING_TASK} | jq -r 'select(.input[] | .type.coding[0].code == "message-name" and .valueString == "feasibilitySingleDicResultMessage") | .input[] | select(.type.coding[0].code == "measure-report-reference") | .valueReference.reference') +CORRELATING_TASK=$(curl -s -H "Accept: application/fhir+json" "${COMMAND_FLAGS}" "${CORRELATING_TASK_URL}") +TASK_ID=$(echo "${CORRELATING_TASK}" | jq -r .id) +TASK_STATUS=$(echo "${CORRELATING_TASK}" | jq -r .status) +MEASURE_REPORT_REF=$(echo "${CORRELATING_TASK}" | jq -r 'select(.input[] | .type.coding[0].code == "message-name" and .valueString == "feasibilitySingleDicResultMessage") | .input[] | select(.type.coding[0].code == "measure-report-reference") | .valueReference.reference') if [[ -z "${MEASURE_REPORT_REF}" ]]; then echo "Could not find a corresponding measure report." exit 2 fi -MEASURE_REPORT=$(curl -s -H "Accept: application/fhir+json" ${COMMAND_FLAGS} ${MEASURE_REPORT_REF}) -MEASURE_REPORT_ID=$(echo ${MEASURE_REPORT} | jq -r .id) -MEASURE_REPORT_POPULATION_COUNT=$(echo ${MEASURE_REPORT} | jq -r '.group[] | select(has("population")) | .population[] | select(.code.coding[0].code == "initial-population") | .count') +MEASURE_REPORT=$(curl -s -H "Accept: application/fhir+json" "${COMMAND_FLAGS}" "${MEASURE_REPORT_REF}") +MEASURE_REPORT_ID=$(echo "${MEASURE_REPORT}" | jq -r .id) +MEASURE_REPORT_POPULATION_COUNT=$(echo "${MEASURE_REPORT}" | jq -r '.group[] | select(has("population")) | .population[] | select(.code.coding[0].code == "initial-population") | .count') echo -e "Task ID: \t\t${TASK_ID}" echo -e "Task Status: \t\t${TASK_STATUS}" @@ -228,7 +228,7 @@ echo -e "Population Count: \t${MEASURE_REPORT_POPULATION_COUNT}" # The main entrypoint of this script. function entrypoint() { -read -d '' USAGE << EOF +read -rd '' USAGE << EOF Command line utility to check a DSF installation. Dependencies: @@ -243,11 +243,11 @@ Commands are EOF case "$1" in - fdpg-connection) fdpg_connection ${@:2};; - result) result ${@:2};; + fdpg-connection) fdpg_connection "${@:2}";; + result) result "${@:2}";; *) echo "${USAGE}"; exit 1;; help|--help|-h) echo "${USAGE}";; esac } -entrypoint ${@:1} +entrypoint "${@:1}" From f57ccf8ed72a3944a26942030f7d0750a2ff5e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 17:31:30 +0200 Subject: [PATCH 060/118] update aktin-client to version with bash and change exec scripts back to bash scripts --- .../aktin-client/client-exec-scripts/call-cql.sh | 2 +- .../aktin-client/client-exec-scripts/call-flare.sh | 2 +- feasibility-triangle/aktin-client/client-exec-scripts/echo.sh | 2 +- .../aktin-client/client-exec-scripts/execute-cql.sh | 2 +- feasibility-triangle/aktin-client/docker-compose.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh index 1c5df95..e2576c4 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash QUERY_INPUT=$(cat) CLIENT_OBFUSCATE=${CLIENT_OBFUSCATE:-true} diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh index c55ad1f..231e708 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash FLARE_BASE_URL=${FLARE_BASE_URL:-"http://flare:8080"} CLIENT_OBFUSCATE=${CLIENT_OBFUSCATE:-true} diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh b/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh index b19cc01..bb73d2b 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh @@ -1,3 +1,3 @@ -#!/bin/sh +#!/bin/bash echo "Connection works - this is a reponse from the a client" diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh index 85a74c9..fbd05c5 100755 --- a/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh +++ b/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash BASE=${FHIR_BASE_URL:-"http://fhir-server:8080/fhir"} BASIC_AUTH_64=$(echo -n "$AUTH_USER:$AUTH_PW" | base64) diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 5042fa6..62abae5 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.6.0 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.7.0 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} From 459dd6cd351dee8a497f21a130cafdcea92cfd23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 17:37:40 +0200 Subject: [PATCH 061/118] change check according to lint --- util/certs/add_cert_to_truststore.sh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/util/certs/add_cert_to_truststore.sh b/util/certs/add_cert_to_truststore.sh index 5433079..b44f6ec 100755 --- a/util/certs/add_cert_to_truststore.sh +++ b/util/certs/add_cert_to_truststore.sh @@ -5,10 +5,9 @@ for f in /opt/certs/your_certs/*.pem; do if [ -f "$f" ]; then echo "Importing additional certificate at $f into truststore." - keytool -importcert -file "${f}" -alias "additional-cert-${i}" -storepass changeit -noprompt \ + if ! keytool -importcert -file "${f}" -alias "additional-cert-${i}" -storepass changeit -noprompt \ -cacerts - - if [[ $? -ne 0 ]]; then + then echo "Importing additional certificate at $f into truststore failed." exit 1 fi @@ -18,9 +17,8 @@ for f in /opt/certs/your_certs/*.pem; do done echo -n "Copying truststore to output directory..." -cp $JAVA_HOME/lib/security/cacerts /opt/certs/output/ - -if [[ $? -ne 0 ]]; then +if ! cp "$JAVA_HOME"/lib/security/cacerts /opt/certs/output/ +then echo "FAILED" else echo "OK" From bff8500333331d48db8bcb7701e0274b1807bed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 17:39:07 +0200 Subject: [PATCH 062/118] change to lint --- util/certs/create_trust_store_with_additional_cert.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/certs/create_trust_store_with_additional_cert.sh b/util/certs/create_trust_store_with_additional_cert.sh index 7b9a352..4ef652b 100755 --- a/util/certs/create_trust_store_with_additional_cert.sh +++ b/util/certs/create_trust_store_with_additional_cert.sh @@ -2,7 +2,7 @@ BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" -docker build -t feasibility-deploy-create-trust-store ${BASE_DIR}/ +docker build -t feasibility-deploy-create-trust-store "${BASE_DIR}"/ docker run --name create-trust-store --rm \ -v "${BASE_DIR}/your_certs":/opt/certs/your_certs \ -v "${BASE_DIR}/trust_store_output":/opt/certs/output \ From 1a0ac539f24201ca08a62811c190a8ecd2fbdd29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 17:44:44 +0200 Subject: [PATCH 063/118] fix dsf-check according to lint --- util/checks/dsf-check.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/util/checks/dsf-check.sh b/util/checks/dsf-check.sh index 747c880..25d1145 100755 --- a/util/checks/dsf-check.sh +++ b/util/checks/dsf-check.sh @@ -63,8 +63,9 @@ while test $# -gt 0; do fi shift ;; - *) echo "${USAGE}"; exit 1;; help|--help|-h) echo "${USAGE}";; + *) echo "${USAGE}"; exit 1;; + esac done @@ -169,12 +170,13 @@ while test $# -gt 0; do fi shift ;; + help|--help|-h) echo "${USAGE}";; --*) echo "${USAGE}"; exit 1;; *) BUSINESS_KEY=$1 shift ;; - help|--help|-h) echo "${USAGE}";; + esac done @@ -245,8 +247,8 @@ EOF case "$1" in fdpg-connection) fdpg_connection "${@:2}";; result) result "${@:2}";; - *) echo "${USAGE}"; exit 1;; help|--help|-h) echo "${USAGE}";; + *) echo "${USAGE}"; exit 1;; esac } From bb61257bbd61e9083ff3e72862d9af7daff30e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 8 Sep 2022 17:47:42 +0200 Subject: [PATCH 064/118] fix sh according to lint --- util/certs/create_trust_store_with_additional_cert.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/certs/create_trust_store_with_additional_cert.sh b/util/certs/create_trust_store_with_additional_cert.sh index 4ef652b..5ff8f82 100755 --- a/util/certs/create_trust_store_with_additional_cert.sh +++ b/util/certs/create_trust_store_with_additional_cert.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || pwd -P )" docker build -t feasibility-deploy-create-trust-store "${BASE_DIR}"/ docker run --name create-trust-store --rm \ From 448a6295122710c913bac9598d115ff697065d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 13 Sep 2022 13:46:51 +0200 Subject: [PATCH 065/118] update Readme - add mapper groups realm roles --- feasibility-portal/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index c17b516..7ebe87c 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -111,6 +111,10 @@ Save the changes by clicking the "save" button. Click on `Users > Add User` and fill in the field **Username** with a username of your choice and add the user under **Groups** to the group **/codex-develop** and save the user by clicking on `save`. Click on **Credentials** and fill the `Password` and `Password Confirmation` fields with a password of your choice and save the changes by clicking `set password` +3. Add Mapper from Realm-Role to Group for UI + +Click on `Clients > feasibility-gui > Mappers` then click on `Add Builtin` select the mapper with name `groups` and click `Add selected` + ### Step 9 - Access the user interface and send first query Access your user interface under and log in with the user set in step 8. From 1dd51ef365a32d7e0f78045af24669d58ee655a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 1 Mar 2023 18:41:08 +0100 Subject: [PATCH 066/118] update to new aktin client version with feasibility plugin --- .../aktin-client/.env.default | 16 +-- .../aktin-client/aktin-requests.log | 0 .../client-exec-scripts/call-cql.sh | 29 ----- .../client-exec-scripts/call-flare.sh | 33 ------ .../aktin-client/client-exec-scripts/echo.sh | 3 - .../client-exec-scripts/execute-cql.sh | 112 ------------------ .../aktin-client/docker-compose.yml | 26 ++-- 7 files changed, 20 insertions(+), 199 deletions(-) delete mode 100644 feasibility-triangle/aktin-client/aktin-requests.log delete mode 100755 feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh delete mode 100755 feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh delete mode 100755 feasibility-triangle/aktin-client/client-exec-scripts/echo.sh delete mode 100755 feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh diff --git a/feasibility-triangle/aktin-client/.env.default b/feasibility-triangle/aktin-client/.env.default index b3f706c..ceee703 100644 --- a/feasibility-triangle/aktin-client/.env.default +++ b/feasibility-triangle/aktin-client/.env.default @@ -7,12 +7,14 @@ FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS=60 FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS=10 FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING=true FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS=60 -FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND=/opt/aktin/call-flare.sh -FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS=10 -FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL=http://flare:8080 FEASIBILITY_AKTIN_CLIENT_OBFUSCATE=true FEASIBILITY_AKTIN_JAVA_OPTS= -FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER= -FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW= -FEASIBILITY_AKTIN_FHIR_BASE_URL=http://fhir-server:8080/fhir -FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS=2 \ No newline at end of file +FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS=2 +FEASIBILITY_AKTIN_CQL_FHIR_BASE_URL= +FEASIBILITY_AKTIN_CQL_FHIR_USER= +FEASIBILITY_AKTIN_CQL_FHIR_PW= +FEASIBILITY_AKTIN_FLARE_URL=http://flare:8080/query/execute +FEASIBILITY_AKTIN_FLARE_USER= +FEASIBILITY_AKTIN_FLARE_PW= +FEASIBILITY_AKTIN_LOG_LEVEL= +FEASIBILITY_AKTIN_LOG_LEVEL_FEASIBILITY= \ No newline at end of file diff --git a/feasibility-triangle/aktin-client/aktin-requests.log b/feasibility-triangle/aktin-client/aktin-requests.log deleted file mode 100644 index e69de29..0000000 diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh deleted file mode 100755 index e2576c4..0000000 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-cql.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -QUERY_INPUT=$(cat) -CLIENT_OBFUSCATE=${CLIENT_OBFUSCATE:-true} - -{ - echo "##### INCOMING REQUEST at $(date) #####" - echo "----BEGIN REQUEST----" - echo "$QUERY_INPUT" - echo "----END REQUEST----" -} >> aktin-requests.log - -RESP=$(sh execute-cql.sh "$QUERY_INPUT") - -if [ "$CLIENT_OBFUSCATE" = true ]; then - OBFUSCATION_INTEGER=$((RANDOM % 11 - 5)) - RESP=$((RESP + OBFUSCATION_INTEGER)) - if [ "$RESP" -lt 5 ]; then - RESP=0 - fi -fi - -{ - echo "----BEGIN RESPONSE----" - echo "$RESP" - echo "----END RESPONSE----" -} >> aktin-requests.log - -echo -n "$RESP" diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh b/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh deleted file mode 100755 index 231e708..0000000 --- a/feasibility-triangle/aktin-client/client-exec-scripts/call-flare.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -FLARE_BASE_URL=${FLARE_BASE_URL:-"http://flare:8080"} -CLIENT_OBFUSCATE=${CLIENT_OBFUSCATE:-true} - -QUERY_INPUT=$(cat) - -{ - echo "##### INCOMING REQUEST at $(date) #####" - echo "----BEGIN REQUEST----" - echo "$QUERY_INPUT" - echo "----END REQUEST----" -} >> aktin-requests.log - -RESP=$(curl --location --request POST "$FLARE_BASE_URL/query/execute" \ ---header 'Content-Type: application/sq+json' \ ---data-raw "$QUERY_INPUT") - -if [ "$CLIENT_OBFUSCATE" = true ]; then - OBFUSCATION_INTEGER=$((RANDOM % 11 - 5)) - RESP=$((RESP + OBFUSCATION_INTEGER)) - if [ "$RESP" -lt 5 ]; then - RESP=0 - fi -fi - -{ - echo "----BEGIN RESPONSE----" - echo "$RESP" - echo "----END RESPONSE----" -} >> aktin-requests.log - -echo -n "$RESP" diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh b/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh deleted file mode 100755 index bb73d2b..0000000 --- a/feasibility-triangle/aktin-client/client-exec-scripts/echo.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo "Connection works - this is a reponse from the a client" diff --git a/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh b/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh deleted file mode 100755 index fbd05c5..0000000 --- a/feasibility-triangle/aktin-client/client-exec-scripts/execute-cql.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/bin/bash - -BASE=${FHIR_BASE_URL:-"http://fhir-server:8080/fhir"} -BASIC_AUTH_64=$(echo -n "$AUTH_USER:$AUTH_PW" | base64) -BASIC_AUTH="Authorization: Basic $BASIC_AUTH_64" - -library() { -cat < /dev/null - -MEASURE_ID=$(createmeasure "${MEASURE_URI}" "${LIBRARY_URI}" "${TYPE}" | post "Measure" | jq -r .id) - -COUNT=$(evaluatemeasure "${MEASURE_ID}" | jq ".group[0].population[0].count") - -echo -n "${COUNT}" diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 62abae5..740b53e 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.7.0 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.4-RC4 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} @@ -12,18 +12,14 @@ services: CLIENT_WEBSOCKET_RECONNECT_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS:-10} CLIENT_WEBSOCKET_RECONNECT_POLLING: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING:-true} PROCESS_TIMEOUT_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS:-60} - PROCESS_COMMAND: ${FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND:-/opt/aktin/call-flare.sh} - PROCESS_ARGS: ${FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS:-10} - FLARE_BASE_URL: ${FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL:-http://node-flare:8080} CLIENT_OBFUSCATE: ${FEASIBILITY_AKTIN_CLIENT_OBFUSCATE:-true} - JAVA_OPTS: $FEASIBILITY_AKTIN_JAVA_OPTS - AUTH_USER: ${FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER:-} - AUTH_PW: ${FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW:-} - FHIR_BASE_URL: ${FEASIBILITY_AKTIN_FHIR_BASE_URL:-http://fhir-server:8080/fhir} - PROCESS_EXECUTOR_THREADS: ${FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS:-2} - volumes: - - ./client-exec-scripts/echo.sh:/opt/aktin/echo.sh - - ./client-exec-scripts/call-cql.sh:/opt/aktin/call-cql.sh - - ./client-exec-scripts/execute-cql.sh:/opt/aktin/execute-cql.sh - - ./client-exec-scripts/call-flare.sh:/opt/aktin/call-flare.sh - - ./aktin-requests.log:/opt/aktin/aktin-requests.log + JAVA_OPTS: ${FEASIBILITY_AKTIN_JAVA_OPTS} + PROCESS_EXECUTOR_THREADS: ${FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS:-1} + CQL_FHIR_BASE_URL: ${FEASIBILITY_AKTIN_CQL_FHIR_BASE_URL} + CQL_FHIR_USER: ${FEASIBILITY_AKTIN_CQL_FHIR_USER} + CQL_FHIR_PW: ${FEASIBILITY_AKTIN_CQL_FHIR_PW} + FLARE_URL: ${FEASIBILITY_AKTIN_FLARE_URL:-http://flare:8080/query/execute} + FLARE_USER: ${FEASIBILITY_AKTIN_FLARE_USER} + FLARE_PW: ${FEASIBILITY_AKTIN_FLARE_PW} + LOG_LEVEL: ${FEASIBILITY_AKTIN_LOG_LEVEL:-INFO} + LOG_LEVEL_FEASIBILITY: ${FEASIBILITY_AKTIN_LOG_LEVEL_FEASIBILITY:-FINE} From f917f57003af8c18bb782965c985992f4864c63a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 1 Mar 2023 18:59:24 +0100 Subject: [PATCH 067/118] update readme for new aktin client version --- feasibility-triangle/README.md | 16 +++--- feasibility-triangle/aktin-client/README.md | 63 --------------------- 2 files changed, 9 insertions(+), 70 deletions(-) delete mode 100644 feasibility-triangle/aktin-client/README.md diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index e728d01..f1d3bf8 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -99,8 +99,7 @@ To configure the AKTIN client in the default setup, change the following environ - FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS - FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS -If you are using AKTIN, as in the default setup you have to adjust the rights of the aktin-requests.log file to allow the AKTIN container user to write the logs as follows: -`chown 10001:10001 /opt/feasibility-deploy/feasibility-triangle/aktin-client/aktin-requests.log` +If you are using AKTIN, the new version of the AKTIN client logs to the STDOUT of the container. You will be responsible for persisting these container logs beyond the stopping and starting of the container. ### Step 8 - Start the feasibility triangle @@ -165,12 +164,15 @@ You can then load the data into your FHIR Server using the `upload-testdata.sh` | FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND | The command to be executed on recieving a feasibility query. Allows one to switch between flare and cql execution | /opt/aktin/call-flare.sh | /opt/aktin/call-flare.sh, /opt/aktin/call-cql.sh | AKTIN | | FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS || 10 | Integer (seconds) | AKTIN | | FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS |configures how many parallel threads AKTIN will use to process requests simultaniously| 2 | Integer (number of threads) | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_FLARE_BASE_URL | the URL of the FLARE component if used | http://flare:8080 | URL | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_OBFUSCATE | Sets whether the AKTIN Client should obfuscate the results (response) of a feasibility query | TRUE | true or false | AKTIN | +| FEASIBILITY_AKTIN_FLARE_URL | the URL of the FLARE component if used | http://flare:8080/query/execute | URL | AKTIN | +| FEASIBILITY_AKTIN_FLARE_USER | the basic auth user for flare if needed | | | AKTIN | +| FEASIBILITY_AKTIN_FLARE_PW | the basic auth password for flare if needed | | | AKTIN | +| FEASIBILITY_AKTIN_LOG_LEVEL | the general log level for the AKTIN client | INFO | ALL, FINEST, FINER, FINE, CONFIG, INFO, SEVERE, OFF | AKTIN | +| FEASIBILITY_AKTIN_LOG_LEVEL_FEASIBILITY | the log level of the feasibility plugin for the AKTIN client - note that on FINE above all incoming queries are logged - on FINEST and above it also logs the obfuscated result to each query | FINE | ALL, FINEST, FINER, FINE, CONFIG, INFO, SEVERE, OFF | AKTIN | | FEASIBILITY_AKTIN_JAVA_OPTS | Provides Java options to the AKTIN client - can be used to configure proxy use. For example : " Dhttps.proxyHost=squid -Dhttps.proxyPort=3128" || valid java options | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_USER | basic auth user to connect to FHIR server if CQL is used ||| AKTIN | -| FEASIBILITY_AKTIN_CLIENT_FHIR_AUTH_PW | basic auth password to connect to FHIR server if CQL is used ||| AKTIN | -| FEASIBILITY_AKTIN_FHIR_BASE_URL | FHIR server base url the AKTIN client is to use to connect to the FHIR server | http://fhir-server:8080/fhir || AKTIN | +| FEASIBILITY_AKTIN_CQL_FHIR_USER | basic auth user to connect to FHIR server if CQL is used ||| AKTIN | +| FEASIBILITY_AKTIN_CQL_FHIR_PW | basic auth password to connect to FHIR server if CQL is used ||| AKTIN | +| FEASIBILITY_AKTIN_CQL_FHIR_BASE_UR | FHIR server base url the AKTIN client is to use to connect to the FHIR server | http://fhir-server:8080/fhir || AKTIN | | FHIR_SERVER_BASE_URL | The base URL of the FHIR server the fhir server uses to generate next links | http://fhir-server:8080 || BLAZE | | FHIR_SERVER_LOG_LEVEL | log level of the FHIR server | debug | debug, info, error | BLAZE | | BLAZE_JVM_ARGS | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | -Xmx4g || BLAZE | diff --git a/feasibility-triangle/aktin-client/README.md b/feasibility-triangle/aktin-client/README.md deleted file mode 100644 index 2a7fb33..0000000 --- a/feasibility-triangle/aktin-client/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Docker Version of the AKTIN broker and client - - -## Broker Configuration - -| EnvVar | Description | Example | Default | -|--------|-------------|---------|---------| -|AKTIN_BROKER_PORT| Host and port the aktin broker is exposed on externally (outside the docker container) | | 127.0.0.1:8080| -|PASSWORD| admin password for local admin http://localhost:8080/admin/html/login.html | |changeme| - -The `api-key.properties` file can be used to add your own api keys for clients to allow them to connect to the broker. -When deploying your own version of the broker, please make sure to remove the example api keys and replace them with your own. - -To add an api key for an admin client (a client which is allowed to submit requests to the broker) the api key needs to contain `OU=admin`, see example in this folder - -## Client Configuration - -The client has to be configured through the sysproc.properties file, which is mounted into the docker container. - -| Sysproc var | Description | Example | Default | -|--------|-------------|---------|---------| -|broker.request.mediatype| | the mediatype the client expects from the broker (note the broker has stored multiple mediatypes for a request this will chose the mediatype to pick)|text | -|broker.result.mediatype | | the mediatype the client is sending back to the broker |application/json | -|broker.endpoint.uri | | |http://aktin-broker:8080/broker/ | -|client.auth.class | | | | -|client.auth.param | | | | -|client.websocket.reconnect.seconds | | | | -|client.websocket.reconnect.polling | | | | -|process.timeout.seconds | | | | -|process.command | |the path to the sh file which is to be executed by the client when the client recieves the request |/opt/codex-aktin/return-request.sh| -|process.command.mapenv | | | | -|process.args | | | | - -Note that the client passes the request to the chosen script file (process.command) on stdin. -The easiest way therefore to access the request from within your script is to use the following command `REQUEST_INPUT=$(cat)` - -To use your own script file, mount it into the docker container (see example `docker-compose.broker.yml`) - - -## Run docker setup - -To run the docker setup on one local machine execute the following commands: - -```bash -export COMPOSE_PROJECT=codex-develop - -cd aktin-broker -docker-compose -p $COMPOSE_PROJECT up -d -sleep 10 -cd ../aktin-client -docker-compose -p $COMPOSE_PROJECT up -d -``` - -If you would like to deploy the broker and client individually copy the respective folder to the respective virtual machine -and execute `docker-compose -p $COMPOSE_PROJECT up -d`. - - -Once started visit the admin at: - -http://localhost:8080/admin/html/login.html - -user: admin -password: from AKTIN_ADMIN_PW environment variable - see above \ No newline at end of file From 9ac82c16f7d31db356d892f5e4bdcffeef820240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 2 Mar 2023 11:05:08 +0100 Subject: [PATCH 068/118] update docker image to image based on official aktin image --- feasibility-triangle/aktin-client/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 740b53e..0d32912 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.4-RC4 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.4.0 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} From 0238afad324faee73a1edbbf0691bf516910567c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Sun, 19 Mar 2023 19:24:49 +0100 Subject: [PATCH 069/118] update gui, backend, aktin, flare --- feasibility-portal/backend/.env.default | 13 ++++++++++--- feasibility-portal/backend/docker-compose.yml | 15 ++++++++++++--- feasibility-portal/gui/deploy-config.json.default | 2 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-portal/gui/nginx.conf | 2 +- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index 6ec871b..4b8f956 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -6,9 +6,8 @@ FEASIBILITY_BACKEND_DATASOURCE_PASSWORD=guidbpw FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=true FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE=FEASIBILITY_ADMIN -FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://auth:8080 +FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://auth:8080/auth FEASIBILITY_BACKEND_KEYCLOAK_REALM=feasibility -FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID=feasibility-gui FEASIBILITY_BACKEND_QUERY_VALIDATION_ENABLED=true FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=false FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED=false @@ -32,4 +31,12 @@ FEASIBILITY_BACKEND_UI_PROFILES_PATH=../ontology/ui_profiles FEASIBILITY_BACKEND_CONCEPT_TREE_PATH=../ontology/codex-code-tree.json FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH=../ontology/codex-term-code-mapping.json FEASIBILITY_BACKEND_MIGRATION_PATH=../ontology/migration/R__Load_latest_ui_profile.sql -FEASIBILITY_BACKEND_CERTS_PATH=../dsf-broker/certs \ No newline at end of file +FEASIBILITY_BACKEND_CERTS_PATH=../dsf-broker/certs +# ---- privacy +FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_AMOUNT=3 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_INTERVALMINUTES=1 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_ANY_POLLINGINTERVALSECONDS=10 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT=3 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS=7200 +FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=20 +FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=3 \ No newline at end of file diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 7fe2e69..95399ed 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:2.0.0 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0-rc1 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -12,12 +12,13 @@ services: FEASIBILITY_DATABASE_PORT: ${FEASIBILITY_BACKEND_DATASOURCE_PORT:-5432} FEASIBILITY_DATABASE_USER: ${FEASIBILITY_BACKEND_DATASOURCE_USERNAME:-guidbuser} FEASIBILITY_DATABASE_PASSWORD: ${FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-guidbpw} + # ---- auth KEYCLOAK_ENABLED: ${FEASIBILITY_BACKEND_KEYCLOAK_ENABLED:-true} KEYCLOAK_ALLOWED_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} KEYCLOAK_ADMIN_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE:-FEASIBILITY_ADMIN} KEYCLOAK_BASE_URL: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} KEYCLOAK_REALM: ${FEASIBILITY_BACKEND_KEYCLOAK_REALM:-codex-develop} - KEYCLOAK_CLIENT_ID: ${FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID:-feasibility-gui} + # ----- translation QUERY_VALIDATION_ENABLED: ${FEASIBILITY_BACKEND_QUERY_VALIDATION_ENABLED:-true} CQL_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED:-true} FHIR_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED:-false} @@ -37,12 +38,20 @@ services: DSF_WEBSERVICE_BASE_URL: ${FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL:-https://dsf-zars-fhir-proxy/fhir} DSF_WEBSOCKET_URL: ${FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL:-wss://dsf-zars-fhir-proxy:443/fhir/ws} DSF_ORGANIZATION_ID: ${FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID:-Test_ZARS} + # ---- privacy + PRIVACY_QUOTA_CREATE_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_AMOUNT:-3} + PRIVACY_QUOTA_CREATE_INTERVALMINUTES: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_INTERVALMINUTES:-1} + PRIVACY_QUOTA_READ_ANY_POLLINGINTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_ANY_POLLINGINTERVALSECONDS:-10} + PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT:-3} + PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS:-7200} + PRIVACY_THRESHOLD_RESULTS: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS:-20} + PRIVACY_THRESHOLD_SITES: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES:-3} restart: unless-stopped volumes: - ${FEASIBILITY_BACKEND_UI_PROFILES_PATH:-../ontology/ui_profiles}:/opt/codex-feasibility-backend/ontology/ui_profiles - ${FEASIBILITY_BACKEND_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:/opt/codex-feasibility-backend/ontology/codex-code-tree.json - ${FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:/opt/codex-feasibility-backend/ontology/codex-term-code-mapping.json - - ${FEASIBILITY_BACKEND_MIGRATION_PATH:-../ontology/migration/R__Load_latest_ui_profile.sql}:/opt/codex-feasibility-backend/ontology/migration/R__Load_latest_ui_profile.sql + - ${FEASIBILITY_BACKEND_MIGRATION_PATH:-../ontology/migration/R_Load_latest_ui_profile.sql}:/opt/codex-feasibility-backend/ontology/migration/R__Load_latest_ui_profile.sql - ${FEASIBILITY_BACKEND_CERTS_PATH:-../dsf-broker/certs}:/opt/codex-feasibility-security feasibility-gui-backend-db: diff --git a/feasibility-portal/gui/deploy-config.json.default b/feasibility-portal/gui/deploy-config.json.default index c76e378..603bbe4 100644 --- a/feasibility-portal/gui/deploy-config.json.default +++ b/feasibility-portal/gui/deploy-config.json.default @@ -43,7 +43,7 @@ "result": false, "loadnsave": false }, - "stylesheet": "abideTheme", + "stylesheet": "FDPGTheme", "fhirport": "8082", "dataset": "codex", "queryVersion": "v2" diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 5d543e3..8e789f8 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.3.0 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc1 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-portal/gui/nginx.conf b/feasibility-portal/gui/nginx.conf index 8fc3b8a..d8c6956 100644 --- a/feasibility-portal/gui/nginx.conf +++ b/feasibility-portal/gui/nginx.conf @@ -73,7 +73,7 @@ gzip_disable "MSIE [1-6]\."; proxy_buffers 4 128k; proxy_busy_buffers_size 128k; proxy_buffer_size 64k; - proxy_pass https://auth:8443; + proxy_pass http://auth:8080; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; From 10b4f3fc9a8e11d70b29ea7977cc729e3b0c38f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Sun, 19 Mar 2023 19:25:14 +0100 Subject: [PATCH 070/118] add flare and aktin update --- feasibility-triangle/README.md | 6 ++++- .../aktin-client/.env.default | 4 ++++ .../aktin-client/docker-compose.yml | 6 ++++- feasibility-triangle/flare/.env.default | 10 ++++---- feasibility-triangle/flare/docker-compose.yml | 23 ++++++++----------- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index f1d3bf8..c6916f5 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -157,6 +157,7 @@ You can then load the data into your FHIR Server using the `upload-testdata.sh` | FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI | The URL of the AKTIN broker endpoint | http://aktin-broker:8080/broker/ | URL | AKTIN | | FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS | Type of authentication used by AKTIN | org.aktin.broker.client2.auth.ApiKeyAuthentication | org.aktin.broker.client2.auth.ApiKeyAuthentication | AKTIN | | FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM | The API key of your site | xxxApiKey123 | API key token | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_DISABLED | enables or disables the websocket - if websocket is disabled the client will poll requests instead - the polling interval is then configured using the env var FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS | false | boolean | AKTIN | | FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS | The time in which your AKTIN client pings the AKTIN broker to ensure idle websocket conections stay open | 60 | Integer (seconds) | AKTIN | | FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS || 10 | Integer (seconds) | AKTIN | | FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING || TRUE || AKTIN | @@ -172,7 +173,10 @@ You can then load the data into your FHIR Server using the `upload-testdata.sh` | FEASIBILITY_AKTIN_JAVA_OPTS | Provides Java options to the AKTIN client - can be used to configure proxy use. For example : " Dhttps.proxyHost=squid -Dhttps.proxyPort=3128" || valid java options | AKTIN | | FEASIBILITY_AKTIN_CQL_FHIR_USER | basic auth user to connect to FHIR server if CQL is used ||| AKTIN | | FEASIBILITY_AKTIN_CQL_FHIR_PW | basic auth password to connect to FHIR server if CQL is used ||| AKTIN | -| FEASIBILITY_AKTIN_CQL_FHIR_BASE_UR | FHIR server base url the AKTIN client is to use to connect to the FHIR server | http://fhir-server:8080/fhir || AKTIN | +| FEASIBILITY_AKTIN_CQL_FHIR_BASE_URL | FHIR server base url the AKTIN client is to use to connect to the FHIR server | http://fhir-server:8080/fhir || AKTIN | +| FEASIBILITY_AKTIN_HARD_RATE_LIMIT_NREQUESTS | Hard Rate limit - if this is breached the application will reject all future requests until it is restarted | 300 | integer| AKTIN | +| FEASIBILITY_AKTIN_HARD_RATE_LIMIT_RESET_MINUTES | Time after which the rate limit configured in FEASIBILITY_AKTIN_HARD_RATE_LIMIT_NREQUESTS is reset | 60 |integer| AKTIN | +| FEASIBILITY_AKTIN_OBFUSCATOR_EPSILON | Epsilon used in the Result obfuscator to obfuscate the results using a Laplace function | 0.28 |double| AKTIN | | FHIR_SERVER_BASE_URL | The base URL of the FHIR server the fhir server uses to generate next links | http://fhir-server:8080 || BLAZE | | FHIR_SERVER_LOG_LEVEL | log level of the FHIR server | debug | debug, info, error | BLAZE | | BLAZE_JVM_ARGS | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | -Xmx4g || BLAZE | diff --git a/feasibility-triangle/aktin-client/.env.default b/feasibility-triangle/aktin-client/.env.default index ceee703..1162bb5 100644 --- a/feasibility-triangle/aktin-client/.env.default +++ b/feasibility-triangle/aktin-client/.env.default @@ -3,6 +3,7 @@ FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE=application/json FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI=http://aktin-broker:8080/broker/ FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS=org.aktin.broker.client2.auth.ApiKeyAuthentication FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM=xxxApiKey123 +FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_DISABLED=false FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS=60 FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS=10 FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING=true @@ -16,5 +17,8 @@ FEASIBILITY_AKTIN_CQL_FHIR_PW= FEASIBILITY_AKTIN_FLARE_URL=http://flare:8080/query/execute FEASIBILITY_AKTIN_FLARE_USER= FEASIBILITY_AKTIN_FLARE_PW= +FEASIBILITY_AKTIN_HARD_RATE_LIMIT_NREQUESTS=300 +FEASIBILITY_AKTIN_HARD_RATE_LIMIT_RESET_MINUTES=60 +FEASIBILITY_AKTIN_OBFUSCATOR_EPSILON=0.28 FEASIBILITY_AKTIN_LOG_LEVEL= FEASIBILITY_AKTIN_LOG_LEVEL_FEASIBILITY= \ No newline at end of file diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 0d32912..89e55cf 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,13 +1,14 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.4.0 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.5.0-RC2 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} BROKER_ENDPOINT_URI: ${FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI:-http://aktin-broker:8080/broker/} CLIENT_AUTH_CLASS: ${FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS:-org.aktin.broker.client2.auth.ApiKeyAuthentication} CLIENT_AUTH_PARAM: ${FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM:-xxxApiKey123} + CLIENT_WEBSOCKET_DISABLED: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_DISABLED:-false} CLIENT_WEBSOCKET_PING_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS:-60} CLIENT_WEBSOCKET_RECONNECT_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS:-10} CLIENT_WEBSOCKET_RECONNECT_POLLING: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING:-true} @@ -21,5 +22,8 @@ services: FLARE_URL: ${FEASIBILITY_AKTIN_FLARE_URL:-http://flare:8080/query/execute} FLARE_USER: ${FEASIBILITY_AKTIN_FLARE_USER} FLARE_PW: ${FEASIBILITY_AKTIN_FLARE_PW} + HARD_RATE_LIMIT_NREQUESTS: ${FEASIBILITY_AKTIN_HARD_RATE_LIMIT_NREQUESTS:-300} + HARD_RATE_LIMIT_RESET_MINUTES: ${FEASIBILITY_AKTIN_HARD_RATE_LIMIT_RESET_MINUTES:-60} + OBFUSCATOR_EPSILON: ${FEASIBILITY_AKTIN_OBFUSCATOR_EPSILON:-0.28} LOG_LEVEL: ${FEASIBILITY_AKTIN_LOG_LEVEL:-INFO} LOG_LEVEL_FEASIBILITY: ${FEASIBILITY_AKTIN_LOG_LEVEL_FEASIBILITY:-FINE} diff --git a/feasibility-triangle/flare/.env.default b/feasibility-triangle/flare/.env.default index ab74d57..f5a253c 100644 --- a/feasibility-triangle/flare/.env.default +++ b/feasibility-triangle/flare/.env.default @@ -7,8 +7,8 @@ FLARE_EXEC_CORE_POOL_SIZE=4 FLARE_EXEC_MAX_POOL_SIZE=16 FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS=10 FLARE_LOG_LEVEL=info -FLARE_CACHE_CLEAN_CYCLE_MINUTES= -FLARE_CACHE_ENTRY_LIFETIME_HOURS=168 -FLARE_CACHE_SIZE_THOUSANDS_ENTRIES=1 -FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS= -FLARE_CACHE_COMPLETE_DELETE_ON_CLEAN= \ No newline at end of file +FLARE_CACHE_MEM_SIZE_MB=1024 +FLARE_CACHE_MEM_EXPIRE=PT48H +FLARE_CACHE_MEM_REFRESH=PT24H +FLARE_CACHE_DISK_PATH=cache +FLARE_CACHE_DISK_EXPIRE=P7D \ No newline at end of file diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index 8ffab14..f82913d 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,25 +2,22 @@ version: "3.7" services: flare: - image: ghcr.io/rwth-imi/flare-query:1.0.0 + image: ghcr.io/medizininformatik-initiative/flare:main ports: - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: - FLARE_FHIR_SERVER_URL: ${FLARE_FHIR_SERVER_URL:-http://fhir-server:8080/fhir/} + FLARE_FHIR_SERVER: ${FLARE_FHIR_SERVER_URL:-http://fhir-server:8080/fhir/} FLARE_FHIR_USER: ${FLARE_FHIR_USER:-} - FLARE_FHIR_PW: ${FLARE_FHIR_PW:-} + FLARE_FHIR_PASSWORD: ${FLARE_FHIR_PW:-} FLARE_FHIR_PAGE_COUNT: ${FLARE_FHIR_PAGE_COUNT:-500} - FLARE_EXEC_CORE_POOL_SIZE: ${FLARE_EXEC_CORE_POOL_SIZE:-4} - FLARE_EXEC_MAX_POOL_SIZE: ${FLARE_EXEC_MAX_POOL_SIZE:-16} - FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS: ${FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS:-10} LOG_LEVEL: ${FLARE_LOG_LEVEL:-warn} - MAPPINGS_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json - CONCEPT_TREE_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json - FLARE_CACHE_CLEAN_CYCLE_MINUTES: ${FLARE_CACHE_CLEAN_CYCLE_MINUTES:-1440} - FLARE_CACHE_ENTRY_LIFETIME_HOURS: ${FLARE_CACHE_ENTRY_LIFETIME_HOURS:-168} - FLARE_CACHE_SIZE_THOUSANDS_ENTRIES: ${FLARE_CACHE_SIZE_THOUSANDS_ENTRIES:-8} - FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS: ${FLARE_CACHE_ENTRY_EXPIRATION_UPDATED_AT_ACCESS:-false} - FLARE_CACHE_COMPLETE_DELETE_ON_CLEAN: ${FLARE_CACHE_COMPLETE_DELETE_ON_CLEAN:-false} + FLARE_MAPPING_MAPPINGSFILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json + FLARE_MAPPING_CONCEPTTREEFILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json + FLARE_CACHE_MEM_SIZE_MB: ${FLARE_CACHE_MEM_SIZE_MB:-1024} + FLARE_CACHE_MEM_EXPIRE: ${FLARE_CACHE_MEM_EXPIRE:-PT48H} + FLARE_CACHE_MEM_REFRESH: ${FLARE_CACHE_MEM_REFRESH:-PT24H} + FLARE_CACHE_DISK_PATH: ${FLARE_CACHE_DISK_PATH:-cache} + FLARE_CACHE_DISK_EXPIRE: ${FLARE_CACHE_DISK_EXPIRE:-P7D} restart: unless-stopped volumes: - ${FLARE_LOCAL_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json From 0b9e693badd0dfae5b5425721fe30a1494eeffee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Sun, 19 Mar 2023 19:30:30 +0100 Subject: [PATCH 071/118] add header port forwarding to triangle rev proxy --- feasibility-triangle/rev-proxy/nginx.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/feasibility-triangle/rev-proxy/nginx.conf b/feasibility-triangle/rev-proxy/nginx.conf index 22c79f3..e1a0154 100644 --- a/feasibility-triangle/rev-proxy/nginx.conf +++ b/feasibility-triangle/rev-proxy/nginx.conf @@ -60,6 +60,7 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; } location /flare { From fa72856dfb8d898036f395d48a97a9d19c10fefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 22 Mar 2023 21:33:35 +0100 Subject: [PATCH 072/118] update lang files, update version gui, blaze and flare --- feasibility-portal/gui/docker-compose.yml | 4 +- feasibility-portal/gui/language/de.json | 237 ++++++++++++++++++ feasibility-portal/gui/language/en.json | 237 ++++++++++++++++++ .../blaze-server/docker-compose.yml | 2 +- feasibility-triangle/flare/.env.default | 4 +- feasibility-triangle/flare/docker-compose.yml | 4 +- 6 files changed, 484 insertions(+), 4 deletions(-) create mode 100644 feasibility-portal/gui/language/de.json create mode 100644 feasibility-portal/gui/language/en.json diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 8e789f8..4f762d4 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc1 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc2 ports: - "443:8443" restart: unless-stopped @@ -10,3 +10,5 @@ services: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./mime.types:/etc/nginx/conf.d/mime.types - ./deploy-config.json:/usr/share/nginx/html/assets/config/config.deploy.json + - ./language/de.json:/usr/share/nginx/html/assets/i18n/de.json + - ./language/en.json:/usr/share/nginx/html/assets/i18n/en.json diff --git a/feasibility-portal/gui/language/de.json b/feasibility-portal/gui/language/de.json new file mode 100644 index 0000000..eeaa95a --- /dev/null +++ b/feasibility-portal/gui/language/de.json @@ -0,0 +1,237 @@ +{ + "DASHBOARD": { + "CODEXTHEME": { + "HEADLINE": "Willkommen auf der CODEX Feasibility Plattform!", + "PARAGRAPH1": "Die CODEX Feasibility Plattform ist ein Angebot für Wissenschaftler:innen, die für ihre Forschung nach COVID-19 spezifischen Daten suchen.", + "PARAGRAPH2": "Auf dieser Plattform steht hierfür ein frei zugängliches Suchtool zur Verfügung, das eine erste, unverbindliche Machbarkeitsabfrage ermöglicht. Auf diesem Weg kann festgestellt werden, wie viele Daten an den angeschlossenen CODEX-Standorten zur Verfügung stehen.", + "PARAGRAPH3_1": "Anhand dieser Information können dann in einem nächsten Schritt konkrete Anfragen an die entsprechenden Standorte gestellt werden.", + "PARAGRAPH3_2":"", + "PARAGRAPH3_3":"", + "PARAGRAPH3_4":"", + "PARAGRAPH3_LINK":"", + "PARAGRAPH4_1":"", + "PARAGRAPH4_2":"", + "PARAGRAPH4_3":"", + "PARAGRAPH5_1": "", + "PARAGRAPH5_2": "", + "PARAGRAPH5_3":"" + }, + "ABIDETHEME": { + "HEADLINE": "Willkommen auf der ABIDE Feasibility Plattform!", + "PARAGRAPH1": "Die ABIDE Feasibility Plattform ist ein Unterstützungsangebot für Wissenschaftler und Wissenschaftlerinnen bei der Umsetzung ihrer Forschungsvorhaben.", + "PARAGRAPH2": "Mit einer Machbarkeitsanfrage (Feasibility) erfahren Forschende, wie viele Fälle für ihre Suchkriterien (Ein- und Ausschlusskriterien) in den Datenintegrationszentren der universitätsmedizinischen Standorte bundesweit vorhanden sind und für medizinische Forschungszwecke beantragt werden können.", + "PARAGRAPH3_1": "Zur Formulierung der Abfrage stehen aktuell der Kerndatensatz der Medizininformatikinitiative und der COVID-19 spezifische Datensatz GECCO zur Verfügung.", + "PARAGRAPH3_2":"", + "PARAGRAPH3_3":"", + "PARAGRAPH3_4":"", + "PARAGRAPH3_LINK":"", + "PARAGRAPH4_1":"", + "PARAGRAPH4_2":"", + "PARAGRAPH4_3":"", + "PARAGRAPH5_1": "", + "PARAGRAPH5_2": "", + "PARAGRAPH5_3":"" + }, + "FDPGTHEME": { + "HEADLINE": "Willkommen im Bereich „Daten und Bioproben finden“ des Forschungsdatenportals für Gesundheit", + "PARAGRAPH1": "Hier finden Sie ein Unterstützungsangebot für Wissenschaftlerinnen und Wissenschaftler zur Umsetzung Ihres Forschungsvorhabens.", + "PARAGRAPH2": "Mit einer Machbarkeitsanfrage erfahren Sie, wie viele Datensätze für Ihre Suchkriterien in den Universitätskliniken bundesweit vorhanden sind. Anhand von Ein- und Ausschlusskriterien kann die Verfügbarkeit von Gesundheitsdaten für medizinische Forschungszwecke abgeschätzt werden.", + "PARAGRAPH3_1": "Über ", + "PARAGRAPH3_2": "Neue Abfrage", + "PARAGRAPH3_3": " haben Sie die Möglichkeit, eine neue Suchanfrage auf Basis des ", + "PARAGRAPH3_4": " zu formulieren und abzuschicken, um einen Überblick über die verfügbaren Datensätze zu erhalten.", + "PARAGRAPH3_LINK": "Kerndatensatzes der MII", + "PARAGRAPH4_1":"Gespeicherte Abfragen oder gespeicherte Entwürfe können Sie über ", + "PARAGRAPH4_2":"Meine Abfragen", + "PARAGRAPH4_3": " einsehen und weiter bearbeiten.", + "PARAGRAPH5_1": "Sobald Ihnen alle relevanten Informationen für Ihr Forschungsvorhaben zur Verfügung stehen, können Sie über ", + "PARAGRAPH5_2": "Antrag stellen", + "PARAGRAPH5_3": " einen Antrag zur Datennutzung im Antragsportal des Forschungsdatenportals für Gesundheit stellen." + }, + "NEWQUERY": { + "HEADLINE": "Neue Abfrage", + "TEXT": "Führen Sie eine Suche anhand Ihrer Ein- und Ausschlusskriterien durch" + }, + "MYQUERY": { + "HEADLINE": "Meine Abfragen", + "TEXT": "Erhalten Sie eine Übersicht über Ihre bereits durchgeführten Suchanfragen" + }, + "FEASPORTAL": { + "HEADLINE": "Antrag stellen", + "TEXT": "Stellen Sie einen Antrag zur Datennutzung im Antragsportal" + } + }, + "LANGUAGE": { + "GERMAN": "Deutsch", + "ENGLISH": "Englisch", + "LABEL": "Sprache auswählen" + }, + "APPLAYOUT": { + "SIDENAV": { + "LABEL": "Seitennavigation" + }, + "TOGGLE": { + "LABEL": "Seitennavigation umschalten" + } + }, + "NAVIGATION": { + "DASHBOARD": "Startseite", + "QUERYBUILDER_EDITOR": "Neue Abfrage", + "QUERYBUILDER_OVERVIEW": "Meine Abfragen", + "OPTIONS": "Einstellungen", + "SIGNOUT": "Abmelden" + }, + "OPTIONSPAGE": { + "MULTIPLEVALUEDEFINITIONS": "mehrere Einschränkungen pro Kriterium", + "MULTIPLEGROUPS": "mehrere Gruppen", + "DEPENDENTGROUPS": "abhängige Gruppen", + "TIMERESTRICTION": "zeitabhängige Kriterien", + "DISPLAYVALUEFILTERICON": "nutze Icons für Vergleichsoperatoren", + "POLLINGTIME": "Polling Time", + "POLLINGINTERVALL": "Polling Intervall", + "FHIRPORT": "FHIR Port" + }, + "QUERYBUILDER": { + "SEARCH": { + "INCLUSION": "Einschlusskriterien", + "EXCLUSION": "Ausschlusskriterien", + "LABEL": "Code oder Suchbegriff eingeben", + "ALL": "Alle", + "CATEGORY_FILTER": "Filtern nach", + "CONSENT_HEADER": "Art der Datennutzung", + "CONSENT_CENTRAL": " voraussetzen (Daten können zentral zusammengeführt werden)", + "CONSENT_CENTRAL_LINK": "„Broad Consent“ der MII", + "CONSENT_DISTRIBUTED": "Kein „Broad Consent“ voraussetzen (Daten stehen nur für „Verteilte Analysen“ zur Verfügung)" + }, + "SWITCH": { + "LABEL_AND": "UND", + "LABEL_OR": "ODER" + }, + "DISPLAY": { + "LABEL": "Ausgewählte Merkmale", + "ONE_OF": "", + "MORE": "weitere", + "BETWEEN": "zwischen {{ min }} und {{ max }} {{ unit }}", + "COMPARATOR": "{{ comparator }} {{ value }} {{ unit }}", + "TIMERESTRICTION": { + "LATEST": "(aktuellstes)", + "BOTH": "zwischen {{ from }} und {{ to }}", + "FROM": "nach {{ from }}", + "TO": "vor {{ to }}", + "NONE": "keine zeitliche Einschränkung" + }, + "GROUPS": { + "LINKEDGROUPS": "Gruppen sind verbunden", + "SHOW_CONNECTION": "Beziehung anzeigen", + "NEW_GROUP": "Neue Gruppe", + "HINT_NOT_MOVED": "Gruppe konnte nicht verschoben werden", + "HINT_NOT_DELETABLE_LINKED_GROUP": "Gruppen mit verbundener Untergruppe können nicht gelöscht werden" + } + }, + "OVERVIEW": { + "TITLE_LABEL": "Titel", + "COMMENT_LABEL": "Kommentar", + "SAVE_HEADER": "Abspeichern der aktuellen Suchanfrage", + "LOAD_HEADER": "Bisherige Suchanfragen", + "IMPORT_HEADER": "Suchanfragen importieren", + "SAVE_WITH_QUERY": "für Machbarkeitsanfrage speichern", + "SAVE_TEMPLATE": "als Vorlage speichern", + "DOWNLOAD_SQ": "als Datei speichern", + "FILENAME": "Dateiname", + "SAVED_QUERIES": "Gespeicherte Abfragen (mit Ergebnis)", + "SAVED_TEMPLATES": "Gespeicherte Vorlagen" + }, + "EDIT": { + "HEADER": "Einschränkungen der ausgewählten Merkmale", + "HEADER_FILTER_QUANTITY": "Geben Sie einen Wertebereich ein:", + "HEADER_FILTER_QUANTITY_FOR_DISPLAY": "Geben Sie einen Wertebereich ein ({{ label }}):", + "HEADER_FILTER_CONCEPT_OPTIONAL": "Wählen Sie einen oder mehrere zulässige Werte:", + "HEADER_FILTER_CONCEPT_MANDATORY": "Geben Sie einen oder mehrere zulässige Werte an:", + "HEADER_FILTER_CONCEPT_FOR_DISPLAY": "Geben Sie einen oder mehrere zulässige Werte an ({{ label }}):", + "CHOOSE_GROUP":"Gruppe auswählen", + "MANDATORY_HINT": "Pflichtfeld", + "UNIT": "Einheit", + "MIN": "Min", + "MAX": "Max", + "VALUE": "Wert", + "OPERATOR": "Operator", + "AND": "und", + "EQUAL": "gleich", + "LESS_THAN": "kleiner", + "GREATER_THAN": "größer", + "BETWEEN": "zwischen", + "TIMERESTRICTION": { + "LABEL": "Datum", + "EVER": "Alle Ereignisse liegen im Zeitraum", + "LATEST": "Aktuellstes Ereignis liegt im Zeitraum", + "FROM": "von", + "TO": "bis", + "AT": "am", + "NOT_AT": "nicht am", + "BEFORE": "vor", + "BEFORE_OR_AT": "vor oder am", + "AFTER": "nach", + "AFTER_OR_AT": "nach oder am", + "BETWEEN": "zwischen", + "TITLE": "Zeitraum (optional)" + }, + "GROUPS": { + "HEADER_LINKED_GROUPS": "Beziehung zwischen Gruppen", + "OPTION_PARENT_EVER": "Jedes Merkmal", + "OPTION_PARENT_FIRST": "Erstes Merkmal", + "OPTION_PARENT_LATEST": "Aktuellstes Merkmal", + "GROUP_PARENT_1": "der Gruppe", + "GROUP_PARENT_2": "fand", + "OPTION_DEPENDENT_EVER": "jedem Merkmal", + "OPTION_DEPENDENT_FIRST": "dem ersten Merkmal", + "OPTION_DEPENDENT_LATEST": "dem aktuellsten Merkmal", + "GROUP_DEPENDENT_1": "der Gruppe", + "GROUP_DEPENDENT_2": "statt", + "TILL": "bis", + "FROM": "von", + "BEFORE": "vor", + "AFTER": "nach", + "DAY": "Tag(e)", + "MONTH": "Monat(e)", + "YEAR": "Jahr(e)", + "LABEL_UNIT": "Einheit", + "LABEL_VALUE": "Wert", + "LABEL_PREPOSITION": "Präposition" + } + }, + "HINT": { + "NO_VALUE_SELECTED": "Wählen Sie mindestens einen Wert", + "MINIMUM_GREATER_MAXIMUM": "Der minimale Wert muss kleiner als der maximale Wert sein", + "MINIMUM_EXCEEDED": "Wert muss mindestens {{ min }} sein", + "MAXIMUM_EXCEEDED": "Wert darf höchstens {{ max }} sein", + "SEARCH_TEXT_NO_INPUT": "Geben Sie ein Suchkriterium ein oder öffnen sie die Übersicht der Kategorien", + "NO_CRITERIA_SELECTED": "es muss mindestens ein Einschlusskriterium ausgewählt sein" + } + }, + "RESULT": { + "PATIENT_NUMBER": "Anzahl der Patienten", + "TOTAL": "Gesamt", + "SITE": "Standort", + "MESSAGE429": "Sie haben die maximale Anzahl an Abrufen für die Standortaufschlüsselung erreicht.", + "DETAILS_TOOLTIP": "Die Zahl zeigt Ihnen wieviele Ihrere Detailergebnisaufrufe Sie verbraucht haben - wird täglich zurückgesetzt" + }, + "LEGAL": { + "DISCLOSURE": "Impressum", + "DATAPROTECTION": "Datenschutz" + }, + "BUTTON": { + "SAVE": "Speichern", + "CANCEL": "Abbrechen", + "CLOSE": "Schließen", + "ADD": "Auswählen", + "ADD_TOOLTIP": "Merkmal einschränken", + "ADDALL": "Alle hinzufügen", + "SEND": "Abfrage starten", + "RESET": "Zurücksetzen", + "RESULTDETAILS": "Details", + "SAVEQUERY": "Abfrage speichern", + "VALIDATE": "Validieren", + "IMPORT": "Query laden", + "IMPORT_FROM_FILE": "Datei auswählen" + } +} diff --git a/feasibility-portal/gui/language/en.json b/feasibility-portal/gui/language/en.json new file mode 100644 index 0000000..f197a96 --- /dev/null +++ b/feasibility-portal/gui/language/en.json @@ -0,0 +1,237 @@ +{ + "DASHBOARD": { + "CODEXTHEME": { + "HEADLINE": "Welcome to the CODEX Feasibility Platform!", + "PARAGRAPH1": "Die CODEX Feasibility Plattform ist ein Angebot für Wissenschaftler:innen, die für ihre Forschung nach COVID-19 spezifischen Daten suchen.", + "PARAGRAPH2": "Auf dieser Plattform steht hierfür ein frei zugängliches Suchtool zur Verfügung, das eine erste, unverbindliche Machbarkeitsabfrage ermöglicht. Auf diesem Weg kann festgestellt werden, wie viele Daten an den angeschlossenen CODEX-Standorten zur Verfügung stehen.", + "PARAGRAPH3_1": "Anhand dieser Information können dann in einem nächsten Schritt konkrete Anfragen an die entsprechenden Standorte gestellt werden.", + "PARAGRAPH3_2":"", + "PARAGRAPH3_3": "", + "PARAGRAPH3_4": "", + "PARAGRAPH3_LINK":"", + "PARAGRAPH4_1":"", + "PARAGRAPH4_2":"", + "PARAGRAPH4_3": "", + "PARAGRAPH5_1": "", + "PARAGRAPH5_2": "", + "PARAGRAPH5_3": "" + }, + "ABIDETHEME": { + "HEADLINE": "Welcome to the ABIDE Feasibility Platform!", + "PARAGRAPH1": "Die ABIDE Feasibility Plattform ist ein Unterstützungsangebot für Wissenschaftler und Wissenschaftlerinnen bei der Umsetzung ihrer Forschungsvorhaben.", + "PARAGRAPH2": "Mit einer Machbarkeitsanfrage (Feasibility) erfahren Forschende, wie viele Fälle für ihre Suchkriterien (Ein- und Ausschlusskriterien) in den Datenintegrationszentren der universitätsmedizinischen Standorte bundesweit vorhanden sind und für medizinische Forschungszwecke beantragt werden können.", + "PARAGRAPH3_1": "Zur Formulierung der Abfrage stehen aktuell der Kerndatensatz der Medizininformatikinitiative und der COVID-19 spezifische Datensatz GECCO zur Verfügung.", + "PARAGRAPH3_2":"", + "PARAGRAPH3_3": "", + "PARAGRAPH3_4": "", + "PARAGRAPH3_LINK":"", + "PARAGRAPH4_1":"", + "PARAGRAPH4_2":"", + "PARAGRAPH4_3": "", + "PARAGRAPH5_1": "", + "PARAGRAPH5_2": "", + "PARAGRAPH5_3": "" + }, + "FDPGTHEME": { + "HEADLINE": "Welcome to the „Find data and biospecimens“ service of the German Research Data Portal for Health", + "PARAGRAPH1": "This is a support service for scientists to assist you in realizing your research project. By submitting a feasibility request, you can find out how many data sets for your search criteria are available at university hospitals nationwide. Based on inclusion and exclusion criteria, the availability of health data for medical research purposes can be estimated.", + "PARAGRAPH2": "", + "PARAGRAPH3_1": "With ", + "PARAGRAPH3_2": "New Query", + "PARAGRAPH3_3": " you have the possibility to formulate and send a new query based on the ", + "PARAGRAPH3_4": " to get an overview of the available patient data records.", + "PARAGRAPH3_LINK": "core data set of the MII", + "PARAGRAPH4_1":"You can view and further edit saved queries or saved drafts via ", + "PARAGRAPH4_2":"My Queries", + "PARAGRAPH4_3": ".", + "PARAGRAPH5_1": "Once you have all the relevant information for your research project, you can submit an application for data use in the application portal of the German Research Data Portal for Health via ", + "PARAGRAPH5_2": "Submit Application", + "PARAGRAPH5_3": "." + }, + "NEWQUERY": { + "HEADLINE": "New Query", + "TEXT": "Perform a search based on your inclusion and exclusion criteria" + }, + "MYQUERY": { + "HEADLINE": "My Queries", + "TEXT": "Get an overview of the searches you have already performed" + }, + "FEASPORTAL": { + "HEADLINE": "Submit Application", + "TEXT": "Make a request for data use in the application portal" + } + }, + "LANGUAGE": { + "GERMAN": "German", + "ENGLISH": "English", + "LABEL": "Select language" + }, + "APPLAYOUT": { + "SIDENAV": { + "LABEL": "Sidenav" + }, + "TOGGLE": { + "LABEL": "Toggle sidenav" + } + }, + "NAVIGATION": { + "DASHBOARD": "Home", + "QUERYBUILDER_EDITOR": "New query", + "QUERYBUILDER_OVERVIEW": "My queries", + "OPTIONS": "Options", + "SIGNOUT": "Sign out" + }, + "OPTIONSPAGE": { + "MULTIPLEVALUEDEFINITIONS": "Multiple values per criteria", + "MULTIPLEGROUPS": "Multiple groups", + "DEPENDENTGROUPS": "Dependent groups", + "TIMERESTRICTION": "Time restricted criteria", + "DISPLAYVALUEFILTERICON": "Use icons for comparator symbols", + "POLLINGTIME": "Polling Time", + "POLLINGINTERVALL": "Polling Intervall", + "FHIRPORT": "FHIR Port" + }, + "QUERYBUILDER": { + "SEARCH": { + "INCLUSION": "Inclusion criteria", + "EXCLUSION": "Exclusion criteria", + "LABEL": "enter code or display", + "ALL": "All", + "CATEGORY_FILTER": "Filter by", + "CONSENT_HEADER": "Art der Datennutzung.", + "CONSENT_CENTRAL": " is assumed (Data will centrally merged)", + "CONSENT_CENTRAL_LINK": "„Broad Consent“ of MII", + "CONSENT_DISTRIBUTED": "No „Broad Consent“ required (Data will only used for „Distributed analysis“)" + }, + "SWITCH": { + "LABEL_AND": "AND", + "LABEL_OR": "OR" + }, + "DISPLAY": { + "LABEL": "Selected criteria", + "ONE_OF": "", + "MORE": "more", + "BETWEEN": "between {{ min }} and {{ max }} {{ unit }}", + "COMPARATOR": "{{ comparator }} {{ value }} {{ unit }}", + "TIMERESTRICTION": { + "LATEST": "(latest)", + "BOTH": "between {{ from }} and {{ to }}", + "FROM": "later than {{ from }}", + "TO": "before {{ to }}", + "NONE": "no time restriction" + }, + "GROUPS": { + "LINKEDGROUPS": "groups are linked", + "SHOW_CONNECTION": "show connection", + "NEW_GROUP": "New Group", + "HINT_NOT_MOVED": "Could not move group", + "HINT_NOT_DELETABLE_LINKED_GROUP": "Groups linked with subgroups cannot be deleted" + } + }, + "OVERVIEW": { + "TITLE_LABEL": "Title", + "COMMENT_LABEL": "Comment", + "SAVE_HEADER": "Save the current query", + "LOAD_HEADER": "Previous Queries", + "IMPORT_HEADER": "Import Queries", + "SAVE_WITH_QUERY": "Save for Feasibility Portal", + "SAVE_TEMPLATE": "Save as template", + "DOWNLOAD_SQ": "Save as file", + "FILENAME": "File name", + "SAVED_QUERIES": "Saved Queries (with result)", + "SAVED_TEMPLATES": "Saved Templates" + }, + "EDIT": { + "HEADER": "Restrictions of selected concepts", + "HEADER_FILTER_QUANTITY": "Choose a value restriction:", + "HEADER_FILTER_QUANTITY_FOR_DISPLAY": "Choose a value restriction ({{ label }}):", + "HEADER_FILTER_CONCEPT_OPTIONAL": "Choose one or more valid values:", + "HEADER_FILTER_CONCEPT_MANDATORY": "Choose one or more valid values:", + "HEADER_FILTER_CONCEPT_FOR_DISPLAY": "Choose one or more valid values ({{ label }}):", + "CHOOSE_GROUP":"Choose a group", + "MANDATORY_HINT": "Mandatory field", + "UNIT": "Unit", + "MIN": "Min", + "MAX": "Max", + "VALUE": "Value", + "OPERATOR": "Operator", + "AND": "and", + "EQUAL": "equals", + "LESS_THAN": "less than", + "GREATER_THAN": "more than", + "BETWEEN": "between", + "TIMERESTRICTION": { + "LABEL": "Date", + "EVER": "All occurrences in", + "LATEST": "Latest occurrence in", + "FROM": "from", + "TO": "to", + "AT": "at", + "NOT_AT": "not at", + "BEFORE": "before", + "BEFORE_OR_AT": "before or at", + "AFTER": "after", + "AFTER_OR_AT": "after or at", + "BETWEEN": "between", + "TITLE": "Time constraint (optional)" + }, + "GROUPS": { + "HEADER_LINKED_GROUPS": "Relation between linked groups", + "OPTION_PARENT_EVER": "all occurrences", + "OPTION_PARENT_FIRST": "first occurrence", + "OPTION_PARENT_LATEST": "latest occurrence", + "GROUP_PARENT_1": "of group", + "GROUP_PARENT_2": "occurred", + "OPTION_DEPENDENT_EVER": "all occurrences", + "OPTION_DEPENDENT_FIRST": "first occurrence", + "OPTION_DEPENDENT_LATEST": "latest occurrence", + "GROUP_DEPENDENT_1": "of group", + "GROUP_DEPENDENT_2": "", + "TILL": "till", + "FROM": "from", + "BEFORE": "before", + "AFTER": "after", + "DAY": "day(s)", + "MONTH": "month(s)", + "YEAR": "year(s)", + "LABEL_UNIT": "Unit", + "LABEL_VALUE": "Value", + "LABEL_PREPOSITION": "Preposition" + } + }, + "HINT": { + "NO_VALUE_SELECTED": "Choose at least one value", + "MINIMUM_GREATER_MAXIMUM": "Minimal value must be greater than maximal value", + "MINIMUM_EXCEEDED": "Value must be at least {{ min }}", + "MAXIMUM_EXCEEDED": "Value must be at most {{ max }}", + "SEARCH_TEXT_NO_INPUT": "Enter a search criteria or open the category tree view", + "NO_CRITERIA_SELECTED": "Choose at least one inclusion criteria" + } + }, + "RESULT": { + "PATIENT_NUMBER": "Number of patients", + "TOTAL": "Total", + "SITE": "Site", + "MESSAGE429": "You reached your maximum request limit.", + "DETAILS_TOOLTIP": "The number shows how many views of the detailed result view you have already used - will be reset daily" + }, + "LEGAL": { + "DISCLOSURE": "Disclosure", + "DATAPROTECTION": "Data Protection" + }, + "BUTTON": { + "SAVE": "Save", + "CANCEL": "Cancel", + "CLOSE": "Close", + "ADD": "Add", + "ADD_TOOLTIP": "restrict criteria", + "ADDALL": "Add all", + "SEND": "Send", + "RESET": "Reset", + "RESULTDETAILS": "Details", + "SAVEQUERY": "Save query", + "VALIDATE": "Validate", + "IMPORT": "Load query", + "IMPORT_FROM_FILE": "choose file" + } +} diff --git a/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml b/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml index 3e4b79e..4094fa1 100644 --- a/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml +++ b/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: fhir-server: - image: ghcr.io/medizininformatik-initiative/blaze:0.17 + image: ghcr.io/medizininformatik-initiative/blaze:0.20 environment: BASE_URL: ${FHIR_SERVER_BASE_URL:-http://fhir-server:8080} LOG_LEVEL: ${FHIR_SERVER_LOG_LEVEL:-error} diff --git a/feasibility-triangle/flare/.env.default b/feasibility-triangle/flare/.env.default index f5a253c..7316f52 100644 --- a/feasibility-triangle/flare/.env.default +++ b/feasibility-triangle/flare/.env.default @@ -11,4 +11,6 @@ FLARE_CACHE_MEM_SIZE_MB=1024 FLARE_CACHE_MEM_EXPIRE=PT48H FLARE_CACHE_MEM_REFRESH=PT24H FLARE_CACHE_DISK_PATH=cache -FLARE_CACHE_DISK_EXPIRE=P7D \ No newline at end of file +FLARE_CACHE_DISK_EXPIRE=P7D +FLARE_FHIR_MAXCONNECTIONS=32 +FLARE_JAVA_TOOL_OPTIONS=-Xmx4g \ No newline at end of file diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index f82913d..cffb025 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,13 +2,14 @@ version: "3.7" services: flare: - image: ghcr.io/medizininformatik-initiative/flare:main + image: ghcr.io/medizininformatik-initiative/flare:0.1 ports: - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: FLARE_FHIR_SERVER: ${FLARE_FHIR_SERVER_URL:-http://fhir-server:8080/fhir/} FLARE_FHIR_USER: ${FLARE_FHIR_USER:-} FLARE_FHIR_PASSWORD: ${FLARE_FHIR_PW:-} + FLARE_FHIR_MAXCONNECTIONS: ${FLARE_FHIR_MAXCONNECTIONS:-32} FLARE_FHIR_PAGE_COUNT: ${FLARE_FHIR_PAGE_COUNT:-500} LOG_LEVEL: ${FLARE_LOG_LEVEL:-warn} FLARE_MAPPING_MAPPINGSFILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json @@ -18,6 +19,7 @@ services: FLARE_CACHE_MEM_REFRESH: ${FLARE_CACHE_MEM_REFRESH:-PT24H} FLARE_CACHE_DISK_PATH: ${FLARE_CACHE_DISK_PATH:-cache} FLARE_CACHE_DISK_EXPIRE: ${FLARE_CACHE_DISK_EXPIRE:-P7D} + JAVA_TOOL_OPTIONS: ${FLARE_JAVA_TOOL_OPTIONS:--Xmx4g} restart: unless-stopped volumes: - ${FLARE_LOCAL_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json From 6ad3bfb2435e42305b2f9130b381e4479baa1e16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 22 Mar 2023 22:02:21 +0100 Subject: [PATCH 073/118] update ui lang files --- feasibility-portal/gui/language/de.json | 2 +- feasibility-portal/gui/language/en.json | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/feasibility-portal/gui/language/de.json b/feasibility-portal/gui/language/de.json index eeaa95a..6e4b90b 100644 --- a/feasibility-portal/gui/language/de.json +++ b/feasibility-portal/gui/language/de.json @@ -100,7 +100,7 @@ "CATEGORY_FILTER": "Filtern nach", "CONSENT_HEADER": "Art der Datennutzung", "CONSENT_CENTRAL": " voraussetzen (Daten können zentral zusammengeführt werden)", - "CONSENT_CENTRAL_LINK": "„Broad Consent“ der MII", + "CONSENT_CENTRAL_LINK": "„Broad Consent (der MII oder MII-kompatibel)", "CONSENT_DISTRIBUTED": "Kein „Broad Consent“ voraussetzen (Daten stehen nur für „Verteilte Analysen“ zur Verfügung)" }, "SWITCH": { diff --git a/feasibility-portal/gui/language/en.json b/feasibility-portal/gui/language/en.json index f197a96..0090f35 100644 --- a/feasibility-portal/gui/language/en.json +++ b/feasibility-portal/gui/language/en.json @@ -44,21 +44,21 @@ "PARAGRAPH4_1":"You can view and further edit saved queries or saved drafts via ", "PARAGRAPH4_2":"My Queries", "PARAGRAPH4_3": ".", - "PARAGRAPH5_1": "Once you have all the relevant information for your research project, you can submit an application for data use in the application portal of the German Research Data Portal for Health via ", + "PARAGRAPH5_1": "Once you have all the relevant information for your research project, you can submit an application for data use in the proposal portal of the German Research Data Portal for Health via", "PARAGRAPH5_2": "Submit Application", "PARAGRAPH5_3": "." }, "NEWQUERY": { "HEADLINE": "New Query", - "TEXT": "Perform a search based on your inclusion and exclusion criteria" + "TEXT": "Perform a request based on your inclusion and exclusion criteria" }, "MYQUERY": { "HEADLINE": "My Queries", - "TEXT": "Get an overview of the searches you have already performed" + "TEXT": "Get an overview of the requests you have already performed" }, "FEASPORTAL": { "HEADLINE": "Submit Application", - "TEXT": "Make a request for data use in the application portal" + "TEXT": "Make a request for data use in the proposal portal" } }, "LANGUAGE": { @@ -98,10 +98,10 @@ "LABEL": "enter code or display", "ALL": "All", "CATEGORY_FILTER": "Filter by", - "CONSENT_HEADER": "Art der Datennutzung.", - "CONSENT_CENTRAL": " is assumed (Data will centrally merged)", - "CONSENT_CENTRAL_LINK": "„Broad Consent“ of MII", - "CONSENT_DISTRIBUTED": "No „Broad Consent“ required (Data will only used for „Distributed analysis“)" + "CONSENT_HEADER": "Type of data use", + "CONSENT_CENTRAL": " is assumed (Data consolidated centrally)", + "CONSENT_CENTRAL_LINK": "„Broad Consent“ (MII or compatible with MII)", + "CONSENT_DISTRIBUTED": "No „Broad Consent“ requested (data available for „federated analysis“)" }, "SWITCH": { "LABEL_AND": "AND", @@ -213,7 +213,7 @@ "TOTAL": "Total", "SITE": "Site", "MESSAGE429": "You reached your maximum request limit.", - "DETAILS_TOOLTIP": "The number shows how many views of the detailed result view you have already used - will be reset daily" + "DETAILS_TOOLTIP": "The number shows many views of the detailed result view you have already used - will be reset daily" }, "LEGAL": { "DISCLOSURE": "Disclosure", From f18050e84f197d3628711644bb755921b2e59518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 22 Mar 2023 22:04:02 +0100 Subject: [PATCH 074/118] add mime type svg for new mii logo --- feasibility-portal/gui/mime.types | 1 + 1 file changed, 1 insertion(+) diff --git a/feasibility-portal/gui/mime.types b/feasibility-portal/gui/mime.types index 62bd4b6..641a680 100644 --- a/feasibility-portal/gui/mime.types +++ b/feasibility-portal/gui/mime.types @@ -1,4 +1,5 @@ types { + image/svg+xml svg; text/html html htm shtml; text/css css; text/xml xml rss; From 17aa7fe8e5dc620c6967625e8fa2d5426b717d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 22 Mar 2023 22:11:50 +0100 Subject: [PATCH 075/118] update backend version and add new env vars --- feasibility-portal/backend/.env.default | 7 +++++-- feasibility-portal/backend/docker-compose.yml | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index 4b8f956..ceb579a 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -33,10 +33,13 @@ FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH=../ontology/codex-term-code-mapping.j FEASIBILITY_BACKEND_MIGRATION_PATH=../ontology/migration/R__Load_latest_ui_profile.sql FEASIBILITY_BACKEND_CERTS_PATH=../dsf-broker/certs # ---- privacy +FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=3 +FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=20 FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_AMOUNT=3 FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_INTERVALMINUTES=1 -FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_ANY_POLLINGINTERVALSECONDS=10 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS=10 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS=10 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT=3 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS=7200 FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=20 -FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=3 \ No newline at end of file +FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=3 diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 95399ed..5c8fab0 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0-rc1 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0-rc2 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -39,9 +39,12 @@ services: DSF_WEBSOCKET_URL: ${FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL:-wss://dsf-zars-fhir-proxy:443/fhir/ws} DSF_ORGANIZATION_ID: ${FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID:-Test_ZARS} # ---- privacy + PRIVACY_THRESHOLD_SITES: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES:-3} + PRIVACY_THRESHOLD_RESULTS: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS:-20} PRIVACY_QUOTA_CREATE_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_AMOUNT:-3} PRIVACY_QUOTA_CREATE_INTERVALMINUTES: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_INTERVALMINUTES:-1} - PRIVACY_QUOTA_READ_ANY_POLLINGINTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_ANY_POLLINGINTERVALSECONDS:-10} + PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS:-10} + PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS:-10} PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT:-3} PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS:-7200} PRIVACY_THRESHOLD_RESULTS: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS:-20} From caea35a544ba32310eced5c6f1d894387d242488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 22 Mar 2023 22:14:21 +0100 Subject: [PATCH 076/118] remove double env var entries backend --- feasibility-portal/backend/.env.default | 2 -- feasibility-portal/backend/docker-compose.yml | 2 -- 2 files changed, 4 deletions(-) diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index ceb579a..9a273c7 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -33,8 +33,6 @@ FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH=../ontology/codex-term-code-mapping.j FEASIBILITY_BACKEND_MIGRATION_PATH=../ontology/migration/R__Load_latest_ui_profile.sql FEASIBILITY_BACKEND_CERTS_PATH=../dsf-broker/certs # ---- privacy -FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=3 -FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=20 FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_AMOUNT=3 FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_INTERVALMINUTES=1 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS=10 diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 5c8fab0..71a3fe4 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -39,8 +39,6 @@ services: DSF_WEBSOCKET_URL: ${FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL:-wss://dsf-zars-fhir-proxy:443/fhir/ws} DSF_ORGANIZATION_ID: ${FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID:-Test_ZARS} # ---- privacy - PRIVACY_THRESHOLD_SITES: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES:-3} - PRIVACY_THRESHOLD_RESULTS: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS:-20} PRIVACY_QUOTA_CREATE_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_AMOUNT:-3} PRIVACY_QUOTA_CREATE_INTERVALMINUTES: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_INTERVALMINUTES:-1} PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS:-10} From f243e7e56089e8b3f638b1242797137b5bd5acba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 24 Mar 2023 13:00:13 +0100 Subject: [PATCH 077/118] bump rev proxy, backend, aktin and gui version, add new env vars to readme --- feasibility-portal/README.md | 12 ++++++++++++ feasibility-portal/aktin-broker/docker-compose.yml | 2 +- feasibility-portal/backend/.env.default | 7 +++++++ feasibility-portal/backend/docker-compose.yml | 10 +++++++--- feasibility-portal/gui/deploy-config.json.default | 2 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-triangle/flare/.env.default | 1 + feasibility-triangle/flare/docker-compose.yml | 5 +++-- feasibility-triangle/rev-proxy/docker-compose.yml | 2 +- 9 files changed, 34 insertions(+), 9 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 7ebe87c..55e5b8d 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -137,6 +137,8 @@ After a few moments you should see the results to your query in the **Number of | FEASIBILITY_BACKEND_DATASOURCE_PASSWORD | backend database password | guidbpw | | BACKEND | | FEASIBILITY_BACKEND_KEYCLOAK_ENABLED | whether or not keycloak is enabled for the backend | true | | BACKEND | | KEYCLOAK_ALLOWED_ROLE | The keycloak role required to access the backend | FEASIBILITY_USER | | BACKEND | +|FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE|The keycloak role required to access the backend as Power user - Power users cannot be blacklisted|FEASIBILITY_POWER_USER||BACKEND| +|FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE|The keycloak role required to access the backend as admin|FEASIBILITY_ADMIN||BACKEND| | FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL | the url the backend uses to access keycloak | http://keycloak:8080 | | BACKEND | | FEASIBILITY_BACKEND_KEYCLOAK_REALM | the realm the backend uses within keyloak | codex-develop | | BACKEND | | FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID | the id of the keyloak client for the backend | feasibility-gui | | BACKEND | @@ -160,6 +162,16 @@ After a few moments you should see the results to your query in the **Number of | FEASIBILITY_BACKEND_CONCEPT_TREE_PATH | path on host where the backend looks for the code tree file | ../ontology/codex-code-tree.json | | BACKEND | | FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH | path on host where the backend looks for the mapping file | ../ontology/codex-term-code-mapping.json | | BACKEND | | FEASIBILITY_BACKEND_CERTS_PATH | | ../dsf-broker/certs | | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_AMOUNT|Set how many queries a user can send in a soft intervall minutes time|3||BACKEND| +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES|Set how many minutes time withini which user can sen soft create amount|1||BACKEND| +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT|Set how many queries a user can send in a hard intervall minutes time - if exceeed user will be blacklisted|50||BACKEND| +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES|Set how many minutes time withini which user can sen hard create amount - if exceeed user will be blacklisted|10080||BACKEND| +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS|Set polling interval for summary results - sum of results accross all connected sites|10||BACKEND| +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS|Set polling interval for detailed obfuscated results - detailed list of results per site - site name obfuscated|10||BACKEND| +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT|Set how often a user can view detailed obfuscated query results in DETAILEDOBFUSCATED_INTERVALSECONDS seconds|3||BACKEND| +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS|Set how many seconds time within which user can view detailed results DETAILEDOBFUSCATED_AMOUNT often|7200||BACKEND| +|FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS|Set results size which has to be exceeded for results to be shown|20||BACKEND| +|FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES|Set number of sites which have to be exceeded for results to be shown|3||BACKEND| | FEASIBILITY_KEYCLOAK_DB | keycloak database host | keycloakdb | | KEYCLOAK | | FEASIBILITY_KEYCLOAK_DB_USER | keycloak database username | keycloakdbuser | | KEYCLOAK | | FEASIBILITY_KEYCLOAK_DB_PW | keycloak database password | keycloakdbpw | | KEYCLOAK | diff --git a/feasibility-portal/aktin-broker/docker-compose.yml b/feasibility-portal/aktin-broker/docker-compose.yml index b71da74..d80b556 100644 --- a/feasibility-portal/aktin-broker/docker-compose.yml +++ b/feasibility-portal/aktin-broker/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-broker: - image: ghcr.io/aktin/aktin-broker:1.3.4 + image: ghcr.io/aktin/aktin-broker:1.5.0 environment: LOG_LEVEL: ${AKTIN_BROKER_LOG_LEVEL:-INFO} PASSWORD: ${AKTIN_ADMIN_PW:-changeme} diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index 9a273c7..e12542c 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -5,6 +5,7 @@ FEASIBILITY_BACKEND_DATASOURCE_USERNAME=guidbuser FEASIBILITY_BACKEND_DATASOURCE_PASSWORD=guidbpw FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=true FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER +FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE=FEASIBILITY_POWER_USER FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE=FEASIBILITY_ADMIN FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://auth:8080/auth FEASIBILITY_BACKEND_KEYCLOAK_REALM=feasibility @@ -35,9 +36,15 @@ FEASIBILITY_BACKEND_CERTS_PATH=../dsf-broker/certs # ---- privacy FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_AMOUNT=3 FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_INTERVALMINUTES=1 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_AMOUNT=3 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES=1 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT=50 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES=10080 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS=10 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS=10 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT=3 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS=7200 FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=20 FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=3 + + diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 71a3fe4..8b8fb94 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0-rc2 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0-rc3 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -15,6 +15,7 @@ services: # ---- auth KEYCLOAK_ENABLED: ${FEASIBILITY_BACKEND_KEYCLOAK_ENABLED:-true} KEYCLOAK_ALLOWED_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} + KEYCLOAK_POWER_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE:-FEASIBILITY_POWER_USER} KEYCLOAK_ADMIN_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE:-FEASIBILITY_ADMIN} KEYCLOAK_BASE_URL: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} KEYCLOAK_REALM: ${FEASIBILITY_BACKEND_KEYCLOAK_REALM:-codex-develop} @@ -39,14 +40,17 @@ services: DSF_WEBSOCKET_URL: ${FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL:-wss://dsf-zars-fhir-proxy:443/fhir/ws} DSF_ORGANIZATION_ID: ${FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID:-Test_ZARS} # ---- privacy - PRIVACY_QUOTA_CREATE_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_AMOUNT:-3} - PRIVACY_QUOTA_CREATE_INTERVALMINUTES: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_INTERVALMINUTES:-1} + PRIVACY_QUOTA_SOFT_CREATE_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_AMOUNT:-3} + PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES:-1} + PRIVACY_QUOTA_HARD_CREATE_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT:-50} + PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES:-10080} PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS:-10} PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS:-10} PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT:-3} PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS:-7200} PRIVACY_THRESHOLD_RESULTS: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS:-20} PRIVACY_THRESHOLD_SITES: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES:-3} + restart: unless-stopped volumes: - ${FEASIBILITY_BACKEND_UI_PROFILES_PATH:-../ontology/ui_profiles}:/opt/codex-feasibility-backend/ontology/ui_profiles diff --git a/feasibility-portal/gui/deploy-config.json.default b/feasibility-portal/gui/deploy-config.json.default index 603bbe4..b36f19c 100644 --- a/feasibility-portal/gui/deploy-config.json.default +++ b/feasibility-portal/gui/deploy-config.json.default @@ -28,7 +28,7 @@ "extra": { "displayvaluefiltericon": false, "showoptionspage": false, - "optionpageroles": ["FEASIBILITY_USER"] + "optionpageroles": ["FEASIBILITY_ADMIN"] } }, "options": { diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 4f762d4..6fc56ea 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc2 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc3 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-triangle/flare/.env.default b/feasibility-triangle/flare/.env.default index 7316f52..0ac6677 100644 --- a/feasibility-triangle/flare/.env.default +++ b/feasibility-triangle/flare/.env.default @@ -10,6 +10,7 @@ FLARE_LOG_LEVEL=info FLARE_CACHE_MEM_SIZE_MB=1024 FLARE_CACHE_MEM_EXPIRE=PT48H FLARE_CACHE_MEM_REFRESH=PT24H +FLARE_CACHE_DISK_THREADS=4 FLARE_CACHE_DISK_PATH=cache FLARE_CACHE_DISK_EXPIRE=P7D FLARE_FHIR_MAXCONNECTIONS=32 diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index cffb025..c6d378e 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -10,12 +10,13 @@ services: FLARE_FHIR_USER: ${FLARE_FHIR_USER:-} FLARE_FHIR_PASSWORD: ${FLARE_FHIR_PW:-} FLARE_FHIR_MAXCONNECTIONS: ${FLARE_FHIR_MAXCONNECTIONS:-32} - FLARE_FHIR_PAGE_COUNT: ${FLARE_FHIR_PAGE_COUNT:-500} + FLARE_FHIR_PAGECOUNT: ${FLARE_FHIR_PAGE_COUNT:-500} LOG_LEVEL: ${FLARE_LOG_LEVEL:-warn} FLARE_MAPPING_MAPPINGSFILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json FLARE_MAPPING_CONCEPTTREEFILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json - FLARE_CACHE_MEM_SIZE_MB: ${FLARE_CACHE_MEM_SIZE_MB:-1024} + FLARE_CACHE_MEM_SIZEMB: ${FLARE_CACHE_MEM_SIZE_MB:-1024} FLARE_CACHE_MEM_EXPIRE: ${FLARE_CACHE_MEM_EXPIRE:-PT48H} + FLARE_CACHE_DISK_THREADS: ${FLARE_CACHE_DISK_THREADS:-4} FLARE_CACHE_MEM_REFRESH: ${FLARE_CACHE_MEM_REFRESH:-PT24H} FLARE_CACHE_DISK_PATH: ${FLARE_CACHE_DISK_PATH:-cache} FLARE_CACHE_DISK_EXPIRE: ${FLARE_CACHE_DISK_EXPIRE:-P7D} diff --git a/feasibility-triangle/rev-proxy/docker-compose.yml b/feasibility-triangle/rev-proxy/docker-compose.yml index eb2f84e..50c8a12 100644 --- a/feasibility-triangle/rev-proxy/docker-compose.yml +++ b/feasibility-triangle/rev-proxy/docker-compose.yml @@ -3,7 +3,7 @@ version: '2.0' services: feasibility-triangle-nginx: restart: unless-stopped - image: nginxinc/nginx-unprivileged:1.22-alpine + image: nginxinc/nginx-unprivileged:1.23-alpine ports: - ${FEASIBILITY_TRIANGLE_REV_PROXY_PORT:-444}:8443 volumes: From 67be8ca82ada3901f97f5bb48c5617c4b4248a7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 24 Mar 2023 13:09:22 +0100 Subject: [PATCH 078/118] remove hapi fhir server setup --- .../{blaze-server => }/.env.default | 0 .../{blaze-server => }/docker-compose.yml | 0 .../fhir-server/hapi-fhir-server/README.md | 13 --------- .../hapi-fhir-server/docker-compose.yml | 27 ------------------- feasibility-triangle/start-triangle.sh | 12 +-------- feasibility-triangle/stop-triangle.sh | 3 +-- 6 files changed, 2 insertions(+), 53 deletions(-) rename feasibility-triangle/fhir-server/{blaze-server => }/.env.default (100%) rename feasibility-triangle/fhir-server/{blaze-server => }/docker-compose.yml (100%) delete mode 100644 feasibility-triangle/fhir-server/hapi-fhir-server/README.md delete mode 100644 feasibility-triangle/fhir-server/hapi-fhir-server/docker-compose.yml diff --git a/feasibility-triangle/fhir-server/blaze-server/.env.default b/feasibility-triangle/fhir-server/.env.default similarity index 100% rename from feasibility-triangle/fhir-server/blaze-server/.env.default rename to feasibility-triangle/fhir-server/.env.default diff --git a/feasibility-triangle/fhir-server/blaze-server/docker-compose.yml b/feasibility-triangle/fhir-server/docker-compose.yml similarity index 100% rename from feasibility-triangle/fhir-server/blaze-server/docker-compose.yml rename to feasibility-triangle/fhir-server/docker-compose.yml diff --git a/feasibility-triangle/fhir-server/hapi-fhir-server/README.md b/feasibility-triangle/fhir-server/hapi-fhir-server/README.md deleted file mode 100644 index d10d1e6..0000000 --- a/feasibility-triangle/fhir-server/hapi-fhir-server/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# HAPI FHIR Server - -Simple HAPI FHIR Server based on official HAPI project docker: hapiproject/hapi:v5.1.0 - -## Run - -### With batteries included - -```sh -docker-compose -f docker-compose.yml up -d -``` - -Access at \ No newline at end of file diff --git a/feasibility-triangle/fhir-server/hapi-fhir-server/docker-compose.yml b/feasibility-triangle/fhir-server/hapi-fhir-server/docker-compose.yml deleted file mode 100644 index 2160c3e..0000000 --- a/feasibility-triangle/fhir-server/hapi-fhir-server/docker-compose.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: "3.7" - -services: - fhir-server: - container_name: fhir-server - image: hapiproject/hapi:v5.4.1 - restart: unless-stopped - ports: - - ${PORT_HAPI_FHIR:-127.0.0.1:8081}:8080 - environment: - SPRING_DATASOURCE_URL: "jdbc:postgresql://db:5432/fhir?currentSchema=public" - SPRING_DATASOURCE_USERNAME: postgres - SPRING_DATASOURCE_PASSWORD: postgres - SPRING_DATASOURCE_DRIVERCLASSNAME: org.postgresql.Driver - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT: org.hibernate.dialect.PostgreSQL10Dialect - VALIDATION_REQUESTS_ENABLED: "false" - HAPI_FHIR_USE_APACHE_ADDRESS_STRATEGY: "true" - depends_on: - - db - - db: - container_name: hapidb - image: postgres:12.6-alpine - restart: unless-stopped - environment: - POSTGRES_PASSWORD: postgres - POSTGRES_DB: fhir diff --git a/feasibility-triangle/start-triangle.sh b/feasibility-triangle/start-triangle.sh index 39ebe0d..bfccd77 100755 --- a/feasibility-triangle/start-triangle.sh +++ b/feasibility-triangle/start-triangle.sh @@ -1,23 +1,13 @@ #!/usr/bin/env sh - COMPOSE_PROJECT=${FEASIBILITY_COMPOSE_PROJECT:-feasibility-deploy} - BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -FHIR_SERVER=${FHIR_SERVER:-blaze} CERT_FILE=${CERT_FILE:-$BASE_DIR/auth/cert.pem} KEY_FILE=${KEY_FILE:-$BASE_DIR/auth/key.pem} docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-client/docker-compose.yml up -d docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/flare/docker-compose.yml up -d - -if [ "$FHIR_SERVER" = "blaze" ]; then - echo "Starting up FHIR-Server: Blaze" - docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/blaze-server/docker-compose.yml up -d -elif [ "$FHIR_SERVER" = "hapi" ]; then - echo "Starting up FHIR-Server: HAPI" - docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/hapi-fhir-server/docker-compose.yml up -d -fi +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/docker-compose.yml up -d if [ -f "$CERT_FILE" ] && [ -f "$KEY_FILE" ]; then echo "Auth files cert: $CERT_FILE and key: $KEY_FILE exist => starting NGINX reverse proxy on port $PORT_NUM_NODE_REV_PROXY" diff --git a/feasibility-triangle/stop-triangle.sh b/feasibility-triangle/stop-triangle.sh index 3fcb3ee..73b5d4f 100755 --- a/feasibility-triangle/stop-triangle.sh +++ b/feasibility-triangle/stop-triangle.sh @@ -6,7 +6,6 @@ BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-client/docker-compose.yml stop docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/flare/docker-compose.yml stop -docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/blaze-server/docker-compose.yml stop -docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/hapi-fhir-server/docker-compose.yml stop +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/docker-compose.yml stop docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/rev-proxy/docker-compose.yml stop sh "$BASE_DIR"/dsf-client/stop.sh "$COMPOSE_PROJECT" From a797ebc79d3dcc2ee19beb41895d55efbbc64873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 24 Mar 2023 17:18:12 +0100 Subject: [PATCH 079/118] update lang files and gui --- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-portal/gui/language/de.json | 5 ++++- feasibility-portal/gui/language/en.json | 7 +++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 6fc56ea..69ac38b 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc3 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc4 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-portal/gui/language/de.json b/feasibility-portal/gui/language/de.json index 6e4b90b..cfc9273 100644 --- a/feasibility-portal/gui/language/de.json +++ b/feasibility-portal/gui/language/de.json @@ -99,6 +99,8 @@ "ALL": "Alle", "CATEGORY_FILTER": "Filtern nach", "CONSENT_HEADER": "Art der Datennutzung", + "CONSENT_CENTRAL_TOOLTIP": "Bei der zentralen Analyse erhalten Sie von der MII pseudonymisierte Daten zu den Patienten, die zu Ihrem Forschungsprojekt passen. Pseudonyme Daten (die durch die Pseudonyme automatisch einen Bezug zu den Patienten ermöglichen) können aber nur genutzt werden, wenn die Patienten ihre Einwilligung in die Nutzung erteilt haben. Die Forschenden bekommen die pseudonymisierten Daten zum Download zur Verfügung gestellt und können darin ihre Analysen mit großer Flexibilität und Tiefe sowie häufig mit größerem Tempo ausführen, als es bei verteilten Analysen der Fall ist. Die Erhebung der Einwilligungen ist an den Standorten in vollem Gange, dennoch ist erwartbar, dass zu den meisten Anfragen weniger Patienten angezeigt werden als bei verteilten Analysen.", + "CONSENT_DISTRIBUTED_TOOLTIP": "Bei verteilten Analysen findet die Analyse auf den Daten an den Standorten statt. Die Forschenden erhalten anonyme Ergebnisdaten. An vielen Standorten kann bei verteilten Analysen auf einer anderen Rechtsgrundlage als der Einwilligung der Patienten gerechnet werden. Dadurch wird häufig eine größere Menge an Patienten gefunden, die zu Ihrer Forschungsfrage passen. Bei manchen Standorten erfolgen Machbarkeitsanfragen auch auf Basis der Patienteneinwilligung. Diese Standorte antworten auf Machbarkeitsanfragen mit vergleichsweise geringen Anzahlen. Möglicherweise stehen an diesen Standorten für verteilte Analysen aber höhere Patientenzahlen zur Verfügung. Die tatsächliche Anzahl wird erst nach dem Antragsprozess deutlich.", "CONSENT_CENTRAL": " voraussetzen (Daten können zentral zusammengeführt werden)", "CONSENT_CENTRAL_LINK": "„Broad Consent (der MII oder MII-kompatibel)", "CONSENT_DISTRIBUTED": "Kein „Broad Consent“ voraussetzen (Daten stehen nur für „Verteilte Analysen“ zur Verfügung)" @@ -134,7 +136,7 @@ "SAVE_HEADER": "Abspeichern der aktuellen Suchanfrage", "LOAD_HEADER": "Bisherige Suchanfragen", "IMPORT_HEADER": "Suchanfragen importieren", - "SAVE_WITH_QUERY": "für Machbarkeitsanfrage speichern", + "SAVE_WITH_QUERY": "für Datennutzungsantrag speichern (muss vorher ausgeführt worden sein)", "SAVE_TEMPLATE": "als Vorlage speichern", "DOWNLOAD_SQ": "als Datei speichern", "FILENAME": "Dateiname", @@ -210,6 +212,7 @@ }, "RESULT": { "PATIENT_NUMBER": "Anzahl der Patienten", + "PATIENT_NUMBER_TOOLTIP": "Die Machbarkeitsanfragen liefen Näherungsergebnisse zurück. Die Ergebnisse der Anfrage werden anonymisiert. In dem Prozess werden Abweichungen zum exakten Ergebnis bewusst eingeführt. Daher eignen sich die Ergebnisse lediglich für die erste Bewertung einer Machbarkeit Ihres Projekts, sie sollten aber nicht für die wissenschaftliche Arbeit eingesetzt werden. Das Veröffentlichen der Zahlen ist grundsätzlich nicht gestattet. Die tatsächlich erhältliche Patientenzahl lässt sich erst beziffern, wenn Ihr Projekt über einen Datennutzungsantrag angefragt und durch die zuständigen Use & Access Committees begutachtet wurde.", "TOTAL": "Gesamt", "SITE": "Standort", "MESSAGE429": "Sie haben die maximale Anzahl an Abrufen für die Standortaufschlüsselung erreicht.", diff --git a/feasibility-portal/gui/language/en.json b/feasibility-portal/gui/language/en.json index 0090f35..73fa2a6 100644 --- a/feasibility-portal/gui/language/en.json +++ b/feasibility-portal/gui/language/en.json @@ -99,6 +99,8 @@ "ALL": "All", "CATEGORY_FILTER": "Filter by", "CONSENT_HEADER": "Type of data use", + "CONSENT_CENTRAL_TOOLTIP": "For the central analysis you will recieve patient data pseudonymised by the MII, which fit your research project proposal. Pseudonymised data can only be used, if patients have consented to their use.The researches will recieve the pseudonymised data in form of a Download. They will then be able to conduct their analysis with greater flexibility and depths as well as faster speed compared to decentral analyis. The collection of the consent is currently underway across all sites. However it can be expected, that for most queries less patients will be found for central than de-central analysis.", + "CONSENT_DISTRIBUTED_TOOLTIP": " For distributed analyses the analysis is carried out at the sites. The researchers recieve anonymous result data. For many sites a de-central analysis can be based on a different legal other than a consent. This often leads to larger numbers of patients found, which fulfill the requirements for your research proposal. Some sites also require the consent of a patient for feasibility queries. These sites will answer feasibility queries with comparatively lower number. The actual number of patients available from these site for distributed analyses might be higher. The actual number of available patients will not be clear until after the research proposal has been processed..", "CONSENT_CENTRAL": " is assumed (Data consolidated centrally)", "CONSENT_CENTRAL_LINK": "„Broad Consent“ (MII or compatible with MII)", "CONSENT_DISTRIBUTED": "No „Broad Consent“ requested (data available for „federated analysis“)" @@ -134,7 +136,7 @@ "SAVE_HEADER": "Save the current query", "LOAD_HEADER": "Previous Queries", "IMPORT_HEADER": "Import Queries", - "SAVE_WITH_QUERY": "Save for Feasibility Portal", + "SAVE_WITH_QUERY": "Save for research proposal (must have been executed)", "SAVE_TEMPLATE": "Save as template", "DOWNLOAD_SQ": "Save as file", "FILENAME": "File name", @@ -210,10 +212,11 @@ }, "RESULT": { "PATIENT_NUMBER": "Number of patients", + "PATIENT_NUMBER_TOOLTIP": "The feasibility queries return approximate results. The results of the query are anaonymised. In this process, deviations from the exact result are deliberately introduced. Therefore, the results are only suitable for the first evaluation of the feasibility of your project and should not be used for scientific work. The publication of the results is generally not permitted. The actual number of patients can only be quantified once your project has been requested via a data use application and reviewed by the relevant Use & Access Committees.", "TOTAL": "Total", "SITE": "Site", "MESSAGE429": "You reached your maximum request limit.", - "DETAILS_TOOLTIP": "The number shows many views of the detailed result view you have already used - will be reset daily" + "DETAILS_TOOLTIP": "The number shows how many views of the detailed result view you have already used - will be reset daily" }, "LEGAL": { "DISCLOSURE": "Disclosure", From adedac8733f376aba1670b913dff8ed243547639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 24 Mar 2023 17:30:17 +0100 Subject: [PATCH 080/118] bump gui version --- feasibility-portal/gui/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 69ac38b..6013a82 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc4 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc5 ports: - "443:8443" restart: unless-stopped From 6f15e5c34a54fdce94eafc5ddbdc403cfe44ba55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 28 Mar 2023 14:23:52 +0200 Subject: [PATCH 081/118] bump flare version --- feasibility-triangle/flare/docker-compose.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index c6d378e..fa62ee4 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: flare: - image: ghcr.io/medizininformatik-initiative/flare:0.1 + image: ghcr.io/medizininformatik-initiative/flare:0.2 ports: - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: @@ -10,15 +10,15 @@ services: FLARE_FHIR_USER: ${FLARE_FHIR_USER:-} FLARE_FHIR_PASSWORD: ${FLARE_FHIR_PW:-} FLARE_FHIR_MAXCONNECTIONS: ${FLARE_FHIR_MAXCONNECTIONS:-32} - FLARE_FHIR_PAGECOUNT: ${FLARE_FHIR_PAGE_COUNT:-500} + FLARE_FHIR_PAGE_COUNT: ${FLARE_FHIR_PAGE_COUNT:-500} LOG_LEVEL: ${FLARE_LOG_LEVEL:-warn} - FLARE_MAPPING_MAPPINGSFILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json - FLARE_MAPPING_CONCEPTTREEFILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json - FLARE_CACHE_MEM_SIZEMB: ${FLARE_CACHE_MEM_SIZE_MB:-1024} + FLARE_MAPPING_MAPPING_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json + FLARE_MAPPING_CONCEPT_TREE_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json + FLARE_CACHE_MEM_SIZE_MB: ${FLARE_CACHE_MEM_SIZE_MB:-1024} FLARE_CACHE_MEM_EXPIRE: ${FLARE_CACHE_MEM_EXPIRE:-PT48H} - FLARE_CACHE_DISK_THREADS: ${FLARE_CACHE_DISK_THREADS:-4} FLARE_CACHE_MEM_REFRESH: ${FLARE_CACHE_MEM_REFRESH:-PT24H} FLARE_CACHE_DISK_PATH: ${FLARE_CACHE_DISK_PATH:-cache} + FLARE_CACHE_DISK_THREADS: ${FLARE_CACHE_DISK_THREADS:-4} FLARE_CACHE_DISK_EXPIRE: ${FLARE_CACHE_DISK_EXPIRE:-P7D} JAVA_TOOL_OPTIONS: ${FLARE_JAVA_TOOL_OPTIONS:--Xmx4g} restart: unless-stopped From 3898c82456641ca1fa4d079c01c8d5e0143cb49a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 28 Mar 2023 22:48:10 +0200 Subject: [PATCH 082/118] update keycloak to newest version, bump backend and gui version --- feasibility-portal/backend/.env.default | 3 +- feasibility-portal/backend/docker-compose.yml | 5 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-portal/gui/nginx.conf | 18 +- feasibility-portal/keycloak/.env.default | 17 +- .../keycloak/docker-compose.yml | 40 +- .../keycloak/init/feasibility-realm.json | 2263 +++++++++++++++++ .../keycloak/init/initial-realm-prod.json | 1798 ------------- 8 files changed, 2316 insertions(+), 1830 deletions(-) create mode 100644 feasibility-portal/keycloak/init/feasibility-realm.json delete mode 100644 feasibility-portal/keycloak/init/initial-realm-prod.json diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index e12542c..8167f93 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -7,7 +7,8 @@ FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=true FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE=FEASIBILITY_POWER_USER FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE=FEASIBILITY_ADMIN -FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL=http://auth:8080/auth +FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER=https://localhost/auth +FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK=http://auth:8080 FEASIBILITY_BACKEND_KEYCLOAK_REALM=feasibility FEASIBILITY_BACKEND_QUERY_VALIDATION_ENABLED=true FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=false diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 8b8fb94..8dd5ac7 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0-rc3 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0-rc4 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -17,7 +17,8 @@ services: KEYCLOAK_ALLOWED_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} KEYCLOAK_POWER_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE:-FEASIBILITY_POWER_USER} KEYCLOAK_ADMIN_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE:-FEASIBILITY_ADMIN} - KEYCLOAK_BASE_URL: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL:-http://keycloak:8080} + KEYCLOAK_BASE_URL_ISSUER: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER:-http://keycloak:8080} + KEYCLOAK_BASE_URL_JWK: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK:-http://auth:8080} KEYCLOAK_REALM: ${FEASIBILITY_BACKEND_KEYCLOAK_REALM:-codex-develop} # ----- translation QUERY_VALIDATION_ENABLED: ${FEASIBILITY_BACKEND_QUERY_VALIDATION_ENABLED:-true} diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 6013a82..bfa030a 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc5 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc6 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-portal/gui/nginx.conf b/feasibility-portal/gui/nginx.conf index d8c6956..a201cb8 100644 --- a/feasibility-portal/gui/nginx.conf +++ b/feasibility-portal/gui/nginx.conf @@ -73,12 +73,26 @@ gzip_disable "MSIE [1-6]\."; proxy_buffers 4 128k; proxy_busy_buffers_size 128k; proxy_buffer_size 64k; - proxy_pass http://auth:8080; + proxy_pass http://auth:8080/auth; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $host; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header X-Real-IP $remote_addr; } + location /auth/keycloakadmin { + proxy_buffers 4 128k; + proxy_busy_buffers_size 128k; + proxy_buffer_size 64k; + proxy_pass http://auth:8080/auth; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header X-Real-IP $remote_addr; + } + } } diff --git a/feasibility-portal/keycloak/.env.default b/feasibility-portal/keycloak/.env.default index 167f9f6..9d19a07 100644 --- a/feasibility-portal/keycloak/.env.default +++ b/feasibility-portal/keycloak/.env.default @@ -1,7 +1,10 @@ -FEASIBILITY_KEYCLOAK_DB=keycloakdb -FEASIBILITY_KEYCLOAK_DB_USER=keycloakdbuser -FEASIBILITY_KEYCLOAK_DB_PW=keycloakdbpw -FEASIBILITY_KEYCLOAK_ADMIN_USER=admin -FEASIBILITY_KEYCLOAK_ADMIN_PW=adminpw -FEASIBILITY_KEYCLOAK_PROXY_ADDR_FORWARDING=true -FEASIBILITY_KEYCLOAK_BASE_URL=https://localhost/auth \ No newline at end of file +FEASIBILITY_KC_DB=keycloakdb +FEASIBILITY_KC_DB_USER=keycloakdbuser +FEASIBILITY_KC_DB_PW=keycloakdbpw +FEASIBILITY_KC_ADMIN_USER=admin +FEASIBILITY_KC_ADMIN_PW=adminpw +FEASIBILITY_KC_HTTP_RELATIVE_PATH=/auth +FEASIBILITY_KC_HOSTNAME_URL=https://localhost/auth +FEASIBILITY_KC_HOSTNAME_ADMIN_URL=https://localhost/auth/keycloakadmin +FEASIBILITY_KC_LOG_LEVEL=info +FEASIBILITY_KC_PROXY=edge \ No newline at end of file diff --git a/feasibility-portal/keycloak/docker-compose.yml b/feasibility-portal/keycloak/docker-compose.yml index 3792378..55cf69b 100644 --- a/feasibility-portal/keycloak/docker-compose.yml +++ b/feasibility-portal/keycloak/docker-compose.yml @@ -2,36 +2,38 @@ version: "3.7" services: auth-db: - image: postgres:14-alpine + image: postgres:15-alpine restart: unless-stopped environment: - POSTGRES_DB: ${FEASIBILITY_KEYCLOAK_DB:-keycloakdb} - POSTGRES_USER: ${FEASIBILITY_KEYCLOAK_DB_USER:-keycloakdbuser} - POSTGRES_PASSWORD: ${FEASIBILITY_KEYCLOAK_DB_PW:-keycloakdbpw} + POSTGRES_DB: ${FEASIBILITY_KC_DB:-keycloakdb} + POSTGRES_USER: ${FEASIBILITY_KC_DB_USER:-keycloakdbuser} + POSTGRES_PASSWORD: ${FEASIBILITY_KC_DB_PW:-keycloakdbpw} volumes: - "feasibility-auth-db:/var/lib/postgresql/data" auth: - image: jboss/keycloak:16.1.1 + image: keycloak/keycloak:21.0 + command: ["start", "--import-realm"] restart: unless-stopped + ports: + - "8080:8080" environment: - DB_VENDOR: POSTGRES - DB_ADDR: auth-db - DB_DATABASE: ${FEASIBILITY_KEYCLOAK_DB:-keycloakdb} - DB_USER: ${FEASIBILITY_KEYCLOAK_DB_USER:-keycloakdbuser} - DB_SCHEMA: public - DB_PASSWORD: ${FEASIBILITY_KEYCLOAK_DB_PW:-keycloakdbpw} - KEYCLOAK_USER: ${FEASIBILITY_KEYCLOAK_ADMIN_USER:-admin} - KEYCLOAK_PASSWORD: ${FEASIBILITY_KEYCLOAK_ADMIN_PW:-adminpw} - PROXY_ADDRESS_FORWARDING: ${FEASIBILITY_KEYCLOAK_PROXY_ADDR_FORWARDING:-true} - KEYCLOAK_IMPORT: /tmp/initial-realm.json - KEYCLOAK_FRONTEND_URL: ${FEASIBILITY_KEYCLOAK_BASE_URL:-https://localhost/auth} + KC_DB: postgres + KC_DB_URL: "jdbc:postgresql://auth-db:5432/${FEASIBILITY_KC_DB}" + KC_DB_USERNAME: ${FEASIBILITY_KC_DB_USER} + KC_DB_PASSWORD: ${FEASIBILITY_KC_DB_PW} + KEYCLOAK_ADMIN: ${FEASIBILITY_KC_ADMIN_USER} + KEYCLOAK_ADMIN_PASSWORD: ${FEASIBILITY_KC_ADMIN_PW} + KC_HTTP_RELATIVE_PATH: ${FEASIBILITY_KC_HTTP_RELATIVE_PATH:-/auth} + KC_HOSTNAME_URL: ${FEASIBILITY_KC_HOSTNAME_URL:-https://localhost/auth} + KC_HOSTNAME_ADMIN_URL: ${FEASIBILITY_KC_HOSTNAME_ADMIN_URL:-https://localhost/auth/keycloakadmin} + KC_LOG_LEVEL: ${FEASIBILITY_KC_LOG_LEVEL:-info} + KC_PROXY: ${FEASIBILITY_KC_PROXY:-edge} volumes: - - ${KEYCLOAKIMPORTFILE:-./init/initial-realm-prod.json}:/tmp/initial-realm.json - - ../auth/cert.pem:/etc/x509/https/tls.crt - - ../auth/key.pem:/etc/x509/https/tls.key + - ./init/feasibility-realm.json:/opt/keycloak/data/import/realm.json:ro depends_on: - auth-db + volumes: feasibility-auth-db: diff --git a/feasibility-portal/keycloak/init/feasibility-realm.json b/feasibility-portal/keycloak/init/feasibility-realm.json new file mode 100644 index 0000000..e52c0d9 --- /dev/null +++ b/feasibility-portal/keycloak/init/feasibility-realm.json @@ -0,0 +1,2263 @@ +{ + "id": "2268ed68-686a-4c9e-8637-6c366a60d459", + "realm": "feasibility", + "notBefore": 0, + "defaultSignatureAlgorithm": "RS256", + "revokeRefreshToken": false, + "refreshTokenMaxReuse": 0, + "accessTokenLifespan": 300, + "accessTokenLifespanForImplicitFlow": 900, + "ssoSessionIdleTimeout": 1800, + "ssoSessionMaxLifespan": 36000, + "ssoSessionIdleTimeoutRememberMe": 0, + "ssoSessionMaxLifespanRememberMe": 0, + "offlineSessionIdleTimeout": 2592000, + "offlineSessionMaxLifespanEnabled": false, + "offlineSessionMaxLifespan": 5184000, + "clientSessionIdleTimeout": 0, + "clientSessionMaxLifespan": 0, + "clientOfflineSessionIdleTimeout": 0, + "clientOfflineSessionMaxLifespan": 0, + "accessCodeLifespan": 60, + "accessCodeLifespanUserAction": 300, + "accessCodeLifespanLogin": 1800, + "actionTokenGeneratedByAdminLifespan": 43200, + "actionTokenGeneratedByUserLifespan": 300, + "oauth2DeviceCodeLifespan": 600, + "oauth2DevicePollingInterval": 5, + "enabled": true, + "sslRequired": "external", + "registrationAllowed": false, + "registrationEmailAsUsername": false, + "rememberMe": false, + "verifyEmail": false, + "loginWithEmailAllowed": true, + "duplicateEmailsAllowed": false, + "resetPasswordAllowed": false, + "editUsernameAllowed": false, + "bruteForceProtected": true, + "permanentLockout": false, + "maxFailureWaitSeconds": 900, + "minimumQuickLoginWaitSeconds": 60, + "waitIncrementSeconds": 60, + "quickLoginCheckMilliSeconds": 1000, + "maxDeltaTimeSeconds": 43200, + "failureFactor": 30, + "roles": { + "realm": [ + { + "id": "51cb7b69-d269-4872-b832-2d326e2e8658", + "name": "FeasibilityUser", + "description": "Standard feasibility user, which is allowed to send feasibility queries but has no admin rights", + "composite": false, + "clientRole": false, + "containerId": "2268ed68-686a-4c9e-8637-6c366a60d459", + "attributes": {} + }, + { + "id": "c15735b2-fb84-4939-90bb-1483d95eb9dd", + "name": "offline_access", + "description": "${role_offline-access}", + "composite": false, + "clientRole": false, + "containerId": "2268ed68-686a-4c9e-8637-6c366a60d459", + "attributes": {} + }, + { + "id": "79573cca-5524-4642-a46f-ce7b988690ae", + "name": "FeasibilityPowerUser", + "description": "Users in this role are not subject to the hard limit for creating queries.", + "composite": false, + "clientRole": false, + "containerId": "2268ed68-686a-4c9e-8637-6c366a60d459", + "attributes": {} + }, + { + "id": "3b8bd5f7-5d05-434f-9040-d6e4ea2cd49b", + "name": "uma_authorization", + "description": "${role_uma_authorization}", + "composite": false, + "clientRole": false, + "containerId": "2268ed68-686a-4c9e-8637-6c366a60d459", + "attributes": {} + }, + { + "id": "e3102b96-039a-4b74-8b7b-1ee58bac24c4", + "name": "default-roles-feasibility", + "description": "${role_default-roles}", + "composite": true, + "composites": { + "realm": [ + "offline_access", + "uma_authorization" + ], + "client": { + "account": [ + "view-profile", + "manage-account" + ] + } + }, + "clientRole": false, + "containerId": "2268ed68-686a-4c9e-8637-6c366a60d459", + "attributes": {} + }, + { + "id": "c9d91f7e-30f0-4fab-9c06-75edad9a7fb9", + "name": "FeasibilityAdmin", + "description": "Admin user who may access endpoints a normal user must not access. Users in this role are not subject to any rate limiting", + "composite": false, + "clientRole": false, + "containerId": "2268ed68-686a-4c9e-8637-6c366a60d459", + "attributes": {} + } + ], + "client": { + "feasibility-webapp": [], + "realm-management": [ + { + "id": "9331cbb4-1e36-4777-9df2-e9f55541f23c", + "name": "view-realm", + "description": "${role_view-realm}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "b3cc4711-7c56-4b03-af51-08edc7e1d2b1", + "name": "create-client", + "description": "${role_create-client}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "ef251993-4d26-4321-82d5-77d82dba29b8", + "name": "manage-clients", + "description": "${role_manage-clients}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "93bac7cf-4036-4670-be72-c385ba1f5bb0", + "name": "manage-authorization", + "description": "${role_manage-authorization}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "309737bf-98e9-440e-9418-1bf56e7741ca", + "name": "impersonation", + "description": "${role_impersonation}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "ae1b0ea8-eb86-4fbb-ba31-f8e3c64762c7", + "name": "query-clients", + "description": "${role_query-clients}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "50f7eaec-dceb-42ba-a4c6-83d3e60b1b72", + "name": "view-users", + "description": "${role_view-users}", + "composite": true, + "composites": { + "client": { + "realm-management": [ + "query-groups", + "query-users" + ] + } + }, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "a38cc5d0-3422-422f-b776-6896ccabeec2", + "name": "manage-realm", + "description": "${role_manage-realm}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "429ff4cc-4ebd-4ca7-a5a0-8015ff9fb094", + "name": "manage-events", + "description": "${role_manage-events}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "27b5a1f1-ce28-4dbb-a501-9ba2bd4f2b00", + "name": "query-users", + "description": "${role_query-users}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "cb4548fc-5d6d-40ad-9983-d8659b8be6b6", + "name": "view-events", + "description": "${role_view-events}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "5f16bac4-91d3-44c1-a8cb-7ed5da4015d0", + "name": "realm-admin", + "description": "${role_realm-admin}", + "composite": true, + "composites": { + "client": { + "realm-management": [ + "view-realm", + "create-client", + "manage-clients", + "manage-authorization", + "impersonation", + "query-clients", + "view-users", + "manage-realm", + "manage-events", + "query-users", + "view-events", + "manage-identity-providers", + "query-realms", + "view-clients", + "manage-users", + "view-authorization", + "query-groups", + "view-identity-providers" + ] + } + }, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "798884b5-15b9-4830-b715-32bbc8d10b32", + "name": "manage-identity-providers", + "description": "${role_manage-identity-providers}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "a9e4215c-6834-4531-a1b6-a1c95e4fd4cd", + "name": "query-realms", + "description": "${role_query-realms}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "1d386eb1-bbdd-43f1-9583-19ba1f80bbbc", + "name": "view-clients", + "description": "${role_view-clients}", + "composite": true, + "composites": { + "client": { + "realm-management": [ + "query-clients" + ] + } + }, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "e48a6d04-c281-4d6e-a336-0627f78ad401", + "name": "manage-users", + "description": "${role_manage-users}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "5780557a-d429-4cd2-90fd-a35578e77e38", + "name": "view-authorization", + "description": "${role_view-authorization}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "b50b51b6-3890-4de7-9e62-a9090b572d39", + "name": "query-groups", + "description": "${role_query-groups}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + }, + { + "id": "b4a2906d-b347-4a6a-b01a-a3e05e1d93a9", + "name": "view-identity-providers", + "description": "${role_view-identity-providers}", + "composite": false, + "clientRole": true, + "containerId": "5a01c330-fd53-4aeb-bcce-085264100c18", + "attributes": {} + } + ], + "security-admin-console": [], + "admin-cli": [], + "account-console": [], + "broker": [ + { + "id": "2dbbcaa4-f916-4892-b152-e79f0e8f1ae5", + "name": "read-token", + "description": "${role_read-token}", + "composite": false, + "clientRole": true, + "containerId": "f3331d77-6585-4c5e-a490-756f60be886e", + "attributes": {} + } + ], + "account": [ + { + "id": "efd139d7-d607-47bf-8b70-ab1ecb3ae06e", + "name": "delete-account", + "description": "${role_delete-account}", + "composite": false, + "clientRole": true, + "containerId": "a9708df4-9d2d-48a6-9f16-8978316f51e5", + "attributes": {} + }, + { + "id": "f4cfff0d-d7c9-4713-aaf1-18fbec77f636", + "name": "manage-consent", + "description": "${role_manage-consent}", + "composite": true, + "composites": { + "client": { + "account": [ + "view-consent" + ] + } + }, + "clientRole": true, + "containerId": "a9708df4-9d2d-48a6-9f16-8978316f51e5", + "attributes": {} + }, + { + "id": "81626631-1e34-44c1-be51-f450cd78b614", + "name": "view-consent", + "description": "${role_view-consent}", + "composite": false, + "clientRole": true, + "containerId": "a9708df4-9d2d-48a6-9f16-8978316f51e5", + "attributes": {} + }, + { + "id": "70f8967a-89a7-45c4-99cd-be1c8194e248", + "name": "manage-account-links", + "description": "${role_manage-account-links}", + "composite": false, + "clientRole": true, + "containerId": "a9708df4-9d2d-48a6-9f16-8978316f51e5", + "attributes": {} + }, + { + "id": "7d0f39a0-cde9-4b0a-a529-0994dd3eb33a", + "name": "view-applications", + "description": "${role_view-applications}", + "composite": false, + "clientRole": true, + "containerId": "a9708df4-9d2d-48a6-9f16-8978316f51e5", + "attributes": {} + }, + { + "id": "fe10338e-5ba1-417a-8b58-99e8e0d3837c", + "name": "view-profile", + "description": "${role_view-profile}", + "composite": false, + "clientRole": true, + "containerId": "a9708df4-9d2d-48a6-9f16-8978316f51e5", + "attributes": {} + }, + { + "id": "93114928-449f-473b-a748-03cd2de51c8d", + "name": "manage-account", + "description": "${role_manage-account}", + "composite": true, + "composites": { + "client": { + "account": [ + "manage-account-links" + ] + } + }, + "clientRole": true, + "containerId": "a9708df4-9d2d-48a6-9f16-8978316f51e5", + "attributes": {} + }, + { + "id": "d9b50ef5-1a7f-4ce8-aecd-ebf7cd464d64", + "name": "view-groups", + "description": "${role_view-groups}", + "composite": false, + "clientRole": true, + "containerId": "a9708df4-9d2d-48a6-9f16-8978316f51e5", + "attributes": {} + } + ] + } + }, + "groups": [], + "defaultRole": { + "id": "e3102b96-039a-4b74-8b7b-1ee58bac24c4", + "name": "default-roles-feasibility", + "description": "${role_default-roles}", + "composite": true, + "clientRole": false, + "containerId": "2268ed68-686a-4c9e-8637-6c366a60d459" + }, + "requiredCredentials": [ + "password" + ], + "passwordPolicy": "notUsername(undefined) and notEmail(undefined)", + "otpPolicyType": "totp", + "otpPolicyAlgorithm": "HmacSHA1", + "otpPolicyInitialCounter": 0, + "otpPolicyDigits": 6, + "otpPolicyLookAheadWindow": 1, + "otpPolicyPeriod": 30, + "otpPolicyCodeReusable": false, + "otpSupportedApplications": [ + "totpAppFreeOTPName", + "totpAppGoogleName", + "totpAppMicrosoftAuthenticatorName" + ], + "webAuthnPolicyRpEntityName": "keycloak", + "webAuthnPolicySignatureAlgorithms": [ + "ES256" + ], + "webAuthnPolicyRpId": "", + "webAuthnPolicyAttestationConveyancePreference": "not specified", + "webAuthnPolicyAuthenticatorAttachment": "not specified", + "webAuthnPolicyRequireResidentKey": "not specified", + "webAuthnPolicyUserVerificationRequirement": "not specified", + "webAuthnPolicyCreateTimeout": 0, + "webAuthnPolicyAvoidSameAuthenticatorRegister": false, + "webAuthnPolicyAcceptableAaguids": [], + "webAuthnPolicyPasswordlessRpEntityName": "keycloak", + "webAuthnPolicyPasswordlessSignatureAlgorithms": [ + "ES256" + ], + "webAuthnPolicyPasswordlessRpId": "", + "webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified", + "webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified", + "webAuthnPolicyPasswordlessRequireResidentKey": "not specified", + "webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified", + "webAuthnPolicyPasswordlessCreateTimeout": 0, + "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false, + "webAuthnPolicyPasswordlessAcceptableAaguids": [], + "scopeMappings": [ + { + "clientScope": "offline_access", + "roles": [ + "offline_access" + ] + } + ], + "clientScopeMappings": { + "account": [ + { + "client": "account-console", + "roles": [ + "manage-account", + "view-groups" + ] + } + ] + }, + "clients": [ + { + "id": "a9708df4-9d2d-48a6-9f16-8978316f51e5", + "clientId": "account", + "name": "${client_account}", + "rootUrl": "${authBaseUrl}", + "baseUrl": "/realms/feasibility/account/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [ + "/realms/feasibility/account/*" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "acr", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "0e4587c4-53a6-425d-9c3c-373a1f3c3ea8", + "clientId": "account-console", + "name": "${client_account-console}", + "rootUrl": "${authBaseUrl}", + "baseUrl": "/realms/feasibility/account/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [ + "/realms/feasibility/account/*" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+", + "pkce.code.challenge.method": "S256" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "protocolMappers": [ + { + "id": "14386432-3d23-43c2-993d-b827d702319b", + "name": "audience resolve", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-resolve-mapper", + "consentRequired": false, + "config": {} + } + ], + "defaultClientScopes": [ + "web-origins", + "acr", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "7be48f2f-4745-4912-8748-50209d15a7e4", + "clientId": "admin-cli", + "name": "${client_admin-cli}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": false, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "acr", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "f3331d77-6585-4c5e-a490-756f60be886e", + "clientId": "broker", + "name": "${client_broker}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": true, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "acr", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "2bb006d9-c6d1-4694-91bb-d20c72f97ab4", + "clientId": "feasibility-webapp", + "name": "feasibility-webapp", + "description": "", + "rootUrl": "https://localhost", + "adminUrl": "https://localhost", + "baseUrl": "https://localhost", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [ + "https://localhost/*" + ], + "webOrigins": [ + "+" + ], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": true, + "protocol": "openid-connect", + "attributes": { + "oidc.ciba.grant.enabled": "false", + "backchannel.logout.session.required": "true", + "post.logout.redirect.uris": "+", + "display.on.consent.screen": "false", + "oauth2.device.authorization.grant.enabled": "false", + "backchannel.logout.revoke.offline.tokens": "false" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": true, + "nodeReRegistrationTimeout": -1, + "defaultClientScopes": [ + "web-origins", + "acr", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "5a01c330-fd53-4aeb-bcce-085264100c18", + "clientId": "realm-management", + "name": "${client_realm-management}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": true, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "acr", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "d54a4fd4-51ef-467e-a842-a74dcf04b3e8", + "clientId": "security-admin-console", + "name": "${client_security-admin-console}", + "rootUrl": "${authAdminUrl}", + "baseUrl": "/admin/feasibility/console/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [ + "/admin/feasibility/console/*" + ], + "webOrigins": [ + "+" + ], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+", + "pkce.code.challenge.method": "S256" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "protocolMappers": [ + { + "id": "95ed21c3-cad8-4d48-a24a-c5d30d619826", + "name": "locale", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "locale", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "locale", + "jsonType.label": "String" + } + } + ], + "defaultClientScopes": [ + "web-origins", + "acr", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + } + ], + "clientScopes": [ + { + "id": "54f9e1da-a52f-49c2-9751-57ec83d7ae0f", + "name": "profile", + "description": "OpenID Connect built-in scope: profile", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${profileScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "09d58d3e-eef2-458f-bba4-48d6de6a6116", + "name": "gender", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "gender", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "gender", + "jsonType.label": "String" + } + }, + { + "id": "40e2763f-4fc0-4dfa-a81f-ff815131c138", + "name": "updated at", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "updatedAt", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "updated_at", + "jsonType.label": "long" + } + }, + { + "id": "fd71d132-c5d0-4c03-82ab-2fd9854c68d7", + "name": "given name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "firstName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "given_name", + "jsonType.label": "String" + } + }, + { + "id": "829a7be3-13d0-4bb1-b283-8f7e4047e2d2", + "name": "birthdate", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "birthdate", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "birthdate", + "jsonType.label": "String" + } + }, + { + "id": "ee8b1a4b-64c7-4cc1-a3cb-dea1592a2b62", + "name": "full name", + "protocol": "openid-connect", + "protocolMapper": "oidc-full-name-mapper", + "consentRequired": false, + "config": { + "id.token.claim": "true", + "access.token.claim": "true", + "userinfo.token.claim": "true" + } + }, + { + "id": "25bdd74c-d84e-47c3-a23f-1c83281bf156", + "name": "profile", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "profile", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "profile", + "jsonType.label": "String" + } + }, + { + "id": "5263a825-41da-4a3d-bb7b-feb91dd13427", + "name": "locale", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "locale", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "locale", + "jsonType.label": "String" + } + }, + { + "id": "d941f7ea-e6cd-4d64-8227-477e920f791d", + "name": "family name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "lastName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "family_name", + "jsonType.label": "String" + } + }, + { + "id": "47215783-c6ff-4565-b5fc-759e485c8979", + "name": "website", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "website", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "website", + "jsonType.label": "String" + } + }, + { + "id": "413a6730-ea1d-4857-b192-0ab41ffeb0e5", + "name": "nickname", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "nickname", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "nickname", + "jsonType.label": "String" + } + }, + { + "id": "55e8c3e2-36b2-460a-9851-e9a429164194", + "name": "picture", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "picture", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "picture", + "jsonType.label": "String" + } + }, + { + "id": "0c8f81d7-734d-4195-aead-c00c9ba4f9e3", + "name": "middle name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "middleName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "middle_name", + "jsonType.label": "String" + } + }, + { + "id": "7948a327-a526-4be6-9715-afd8c8636797", + "name": "zoneinfo", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "zoneinfo", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "zoneinfo", + "jsonType.label": "String" + } + }, + { + "id": "1b88530a-5336-48d7-859b-bc41c364dc0f", + "name": "username", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "username", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "preferred_username", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "b52455e7-9cd5-4726-a31a-31312344012c", + "name": "address", + "description": "OpenID Connect built-in scope: address", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${addressScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "6f9322e7-84a9-437e-8644-aea3b5f54adc", + "name": "address", + "protocol": "openid-connect", + "protocolMapper": "oidc-address-mapper", + "consentRequired": false, + "config": { + "user.attribute.formatted": "formatted", + "user.attribute.country": "country", + "user.attribute.postal_code": "postal_code", + "userinfo.token.claim": "true", + "user.attribute.street": "street", + "id.token.claim": "true", + "user.attribute.region": "region", + "access.token.claim": "true", + "user.attribute.locality": "locality" + } + } + ] + }, + { + "id": "abf381fe-7538-4529-858f-4216132674cd", + "name": "acr", + "description": "OpenID Connect scope for add acr (authentication context class reference) to the token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "false" + }, + "protocolMappers": [ + { + "id": "8c01d465-fdcc-47a9-aa2c-da829dd1ff65", + "name": "acr loa level", + "protocol": "openid-connect", + "protocolMapper": "oidc-acr-mapper", + "consentRequired": false, + "config": { + "id.token.claim": "true", + "access.token.claim": "true", + "userinfo.token.claim": "true" + } + } + ] + }, + { + "id": "47fe69af-a1b4-4c4f-b02d-a23e12b0cf39", + "name": "role_list", + "description": "SAML role list", + "protocol": "saml", + "attributes": { + "consent.screen.text": "${samlRoleListScopeConsentText}", + "display.on.consent.screen": "true" + }, + "protocolMappers": [ + { + "id": "9aeef7a2-0a1e-4460-be36-510274c17772", + "name": "role list", + "protocol": "saml", + "protocolMapper": "saml-role-list-mapper", + "consentRequired": false, + "config": { + "single": "false", + "attribute.nameformat": "Basic", + "attribute.name": "Role" + } + } + ] + }, + { + "id": "83573c1e-ff5a-4523-ba7a-5e81d9db86f1", + "name": "offline_access", + "description": "OpenID Connect built-in scope: offline_access", + "protocol": "openid-connect", + "attributes": { + "consent.screen.text": "${offlineAccessScopeConsentText}", + "display.on.consent.screen": "true" + } + }, + { + "id": "dfde37ea-846c-4d60-beba-0af7adfefe45", + "name": "email", + "description": "OpenID Connect built-in scope: email", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${emailScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "797d901f-6f96-4228-93e4-49fe517427de", + "name": "email", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "email", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email", + "jsonType.label": "String" + } + }, + { + "id": "84c070fa-6b10-44f3-a540-31f8943b32ed", + "name": "email verified", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "emailVerified", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email_verified", + "jsonType.label": "boolean" + } + } + ] + }, + { + "id": "19af4bbf-04e2-4ca9-a93a-027fe7726309", + "name": "web-origins", + "description": "OpenID Connect scope for add allowed web origins to the access token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "false", + "consent.screen.text": "" + }, + "protocolMappers": [ + { + "id": "bcb6d62a-79e1-4476-8421-1b27ef11b59f", + "name": "allowed web origins", + "protocol": "openid-connect", + "protocolMapper": "oidc-allowed-origins-mapper", + "consentRequired": false, + "config": {} + } + ] + }, + { + "id": "2b547faf-1890-4b84-b5b2-65ae318d76d9", + "name": "roles", + "description": "OpenID Connect scope for add user roles to the access token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "true", + "consent.screen.text": "${rolesScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "74a5caa0-08f3-4f03-8f52-e434e9e9b25a", + "name": "audience resolve", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-resolve-mapper", + "consentRequired": false, + "config": {} + }, + { + "id": "6cf63106-cebe-4bbf-8d54-26b601cbbb9c", + "name": "realm roles", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-realm-role-mapper", + "consentRequired": false, + "config": { + "multivalued": "true", + "userinfo.token.claim": "true", + "user.attribute": "foo", + "id.token.claim": "false", + "access.token.claim": "true", + "claim.name": "realm_access.roles", + "jsonType.label": "String" + } + }, + { + "id": "edc9a040-eb9c-441f-82d1-204e91a3f02f", + "name": "client roles", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-client-role-mapper", + "consentRequired": false, + "config": { + "user.attribute": "foo", + "access.token.claim": "true", + "claim.name": "resource_access.${client_id}.roles", + "jsonType.label": "String", + "multivalued": "true" + } + } + ] + }, + { + "id": "60bfd884-d8da-481c-9687-6517d98b4d09", + "name": "microprofile-jwt", + "description": "Microprofile - JWT built-in scope", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "false" + }, + "protocolMappers": [ + { + "id": "112e1abe-9dba-4b17-90fe-879ce45e681b", + "name": "upn", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "username", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "upn", + "jsonType.label": "String" + } + }, + { + "id": "70633dda-f43e-4304-bc8f-47c5600e2b9e", + "name": "groups", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-realm-role-mapper", + "consentRequired": false, + "config": { + "multivalued": "true", + "userinfo.token.claim": "true", + "user.attribute": "foo", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "groups", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "811d2520-078a-4730-826d-efdd9f5c5818", + "name": "phone", + "description": "OpenID Connect built-in scope: phone", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${phoneScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "02e74785-b633-4a78-bbd3-fb5aa405880b", + "name": "phone number", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "phoneNumber", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "phone_number", + "jsonType.label": "String" + } + }, + { + "id": "35471ea2-3b31-4a2e-a57b-63fa23312e75", + "name": "phone number verified", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "phoneNumberVerified", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "phone_number_verified", + "jsonType.label": "boolean" + } + } + ] + } + ], + "defaultDefaultClientScopes": [ + "role_list", + "profile", + "email", + "roles", + "web-origins", + "acr" + ], + "defaultOptionalClientScopes": [ + "offline_access", + "address", + "phone", + "microprofile-jwt" + ], + "browserSecurityHeaders": { + "contentSecurityPolicyReportOnly": "", + "xContentTypeOptions": "nosniff", + "xRobotsTag": "none", + "xFrameOptions": "SAMEORIGIN", + "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", + "xXSSProtection": "1; mode=block", + "strictTransportSecurity": "max-age=31536000; includeSubDomains" + }, + "smtpServer": {}, + "eventsEnabled": false, + "eventsListeners": [ + "jboss-logging" + ], + "enabledEventTypes": [], + "adminEventsEnabled": false, + "adminEventsDetailsEnabled": false, + "identityProviders": [], + "identityProviderMappers": [], + "components": { + "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [ + { + "id": "1727392e-576c-4a6d-be26-3939ca7f1a74", + "name": "Allowed Client Scopes", + "providerId": "allowed-client-templates", + "subType": "authenticated", + "subComponents": {}, + "config": { + "allow-default-scopes": [ + "true" + ] + } + }, + { + "id": "e1667956-eb28-406b-85e1-921570ce4203", + "name": "Consent Required", + "providerId": "consent-required", + "subType": "anonymous", + "subComponents": {}, + "config": {} + }, + { + "id": "1cf930a6-6c5b-4c8a-989e-8311ea67361e", + "name": "Trusted Hosts", + "providerId": "trusted-hosts", + "subType": "anonymous", + "subComponents": {}, + "config": { + "host-sending-registration-request-must-match": [ + "true" + ], + "client-uris-must-match": [ + "true" + ] + } + }, + { + "id": "a65081f4-6f09-4d6a-9841-20f8c24c6254", + "name": "Allowed Client Scopes", + "providerId": "allowed-client-templates", + "subType": "anonymous", + "subComponents": {}, + "config": { + "allow-default-scopes": [ + "true" + ] + } + }, + { + "id": "f7dd852b-1d11-40e6-b1ef-a616afa244d5", + "name": "Full Scope Disabled", + "providerId": "scope", + "subType": "anonymous", + "subComponents": {}, + "config": {} + }, + { + "id": "5213745c-6a93-4666-b05a-2f3d6fd0cbe6", + "name": "Allowed Protocol Mapper Types", + "providerId": "allowed-protocol-mappers", + "subType": "anonymous", + "subComponents": {}, + "config": { + "allowed-protocol-mapper-types": [ + "oidc-full-name-mapper", + "saml-user-attribute-mapper", + "saml-role-list-mapper", + "oidc-usermodel-property-mapper", + "oidc-usermodel-attribute-mapper", + "oidc-address-mapper", + "oidc-sha256-pairwise-sub-mapper", + "saml-user-property-mapper" + ] + } + }, + { + "id": "b6c31f41-a5a0-40aa-9b3d-40eb54b0bd93", + "name": "Max Clients Limit", + "providerId": "max-clients", + "subType": "anonymous", + "subComponents": {}, + "config": { + "max-clients": [ + "200" + ] + } + }, + { + "id": "844964d8-a4e4-48b9-8bae-9e9b4cf98407", + "name": "Allowed Protocol Mapper Types", + "providerId": "allowed-protocol-mappers", + "subType": "authenticated", + "subComponents": {}, + "config": { + "allowed-protocol-mapper-types": [ + "saml-user-attribute-mapper", + "oidc-sha256-pairwise-sub-mapper", + "oidc-usermodel-property-mapper", + "oidc-full-name-mapper", + "oidc-usermodel-attribute-mapper", + "saml-role-list-mapper", + "oidc-address-mapper", + "saml-user-property-mapper" + ] + } + } + ], + "org.keycloak.userprofile.UserProfileProvider": [ + { + "id": "64e5b946-3efc-4fa1-ab11-ee67d46b7740", + "providerId": "declarative-user-profile", + "subComponents": {}, + "config": {} + } + ], + "org.keycloak.keys.KeyProvider": [ + { + "id": "01e3c79d-0db5-4f14-9cb5-ec84494cf288", + "name": "hmac-generated", + "providerId": "hmac-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ], + "algorithm": [ + "HS256" + ] + } + }, + { + "id": "1b448d17-22f0-4ef8-b014-1a1476d9480f", + "name": "aes-generated", + "providerId": "aes-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ] + } + }, + { + "id": "94d424b7-b1db-4582-897e-d2cc50918f74", + "name": "rsa-enc-generated", + "providerId": "rsa-enc-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ], + "algorithm": [ + "RSA-OAEP" + ] + } + }, + { + "id": "9127a77a-f0bc-464e-9429-24d332b94fa9", + "name": "rsa-generated", + "providerId": "rsa-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ] + } + } + ] + }, + "internationalizationEnabled": false, + "supportedLocales": [], + "authenticationFlows": [ + { + "id": "cb24f56f-33f6-451f-8e86-f0b59cb78bfb", + "alias": "Account verification options", + "description": "Method with which to verity the existing account", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-email-verification", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "Verify Existing Account by Re-authentication", + "userSetupAllowed": false + } + ] + }, + { + "id": "16cbe5b5-8907-4c79-a28e-af26a64d4545", + "alias": "Authentication Options", + "description": "Authentication options.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "basic-auth", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "basic-auth-otp", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-spnego", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 30, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "f540010d-17d4-4f96-8752-44bcf3fb9770", + "alias": "Browser - Conditional OTP", + "description": "Flow to determine if the OTP is required for the authentication", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-otp-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "8bd5fb04-e90f-4838-9f03-30230712a0b4", + "alias": "Direct Grant - Conditional OTP", + "description": "Flow to determine if the OTP is required for the authentication", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "direct-grant-validate-otp", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "54247ccb-334b-4ac6-a815-a6209ca0b020", + "alias": "First broker login - Conditional OTP", + "description": "Flow to determine if the OTP is required for the authentication", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-otp-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "0714d5f1-6090-4932-8e6d-757bb8dbe82b", + "alias": "Handle Existing Account", + "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-confirm-link", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "Account verification options", + "userSetupAllowed": false + } + ] + }, + { + "id": "a284c5e8-d3d7-4ce2-a192-0a12add20e2c", + "alias": "Reset - Conditional OTP", + "description": "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "reset-otp", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "5a0eee2a-7c7b-4d5b-af9d-a2938f8d99c8", + "alias": "User creation or linking", + "description": "Flow for the existing/non-existing user alternatives", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticatorConfig": "create unique user config", + "authenticator": "idp-create-user-if-unique", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "Handle Existing Account", + "userSetupAllowed": false + } + ] + }, + { + "id": "67915d59-934e-411f-961e-2685fc7115a6", + "alias": "Verify Existing Account by Re-authentication", + "description": "Reauthentication of existing account", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-username-password-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "First broker login - Conditional OTP", + "userSetupAllowed": false + } + ] + }, + { + "id": "b88af6ec-5de7-42a2-8e09-addc24063066", + "alias": "browser", + "description": "browser based authentication", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "auth-cookie", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-spnego", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "identity-provider-redirector", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 25, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 30, + "autheticatorFlow": true, + "flowAlias": "forms", + "userSetupAllowed": false + } + ] + }, + { + "id": "a1ed4636-21e5-48a4-bccd-c8a460a99759", + "alias": "clients", + "description": "Base authentication for clients", + "providerId": "client-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "client-secret", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "client-jwt", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "client-secret-jwt", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 30, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "client-x509", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 40, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "02300a75-fe74-4290-bca5-e6a264f23350", + "alias": "direct grant", + "description": "OpenID Connect Resource Owner Grant", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "direct-grant-validate-username", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "direct-grant-validate-password", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 30, + "autheticatorFlow": true, + "flowAlias": "Direct Grant - Conditional OTP", + "userSetupAllowed": false + } + ] + }, + { + "id": "ab4dc592-8917-4418-9e14-2c18e541837b", + "alias": "docker auth", + "description": "Used by Docker clients to authenticate against the IDP", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "docker-http-basic-authenticator", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "3e6b5064-2034-470f-bd29-8edc96285991", + "alias": "first broker login", + "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticatorConfig": "review profile config", + "authenticator": "idp-review-profile", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "User creation or linking", + "userSetupAllowed": false + } + ] + }, + { + "id": "9c9af7ce-c44c-49b6-b3c9-5926819b798b", + "alias": "forms", + "description": "Username, password, otp and other auth forms.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "auth-username-password-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "Browser - Conditional OTP", + "userSetupAllowed": false + } + ] + }, + { + "id": "76e0940b-a8b4-408e-be78-eaf8fd37bc78", + "alias": "http challenge", + "description": "An authentication flow based on challenge-response HTTP Authentication Schemes", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "no-cookie-redirect", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "Authentication Options", + "userSetupAllowed": false + } + ] + }, + { + "id": "9a5d8f12-34f7-4dd0-baab-9ad1335f83f5", + "alias": "registration", + "description": "registration flow", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "registration-page-form", + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": true, + "flowAlias": "registration form", + "userSetupAllowed": false + } + ] + }, + { + "id": "af3e4179-a6e2-4ab8-a66d-7ad4c0fc11c5", + "alias": "registration form", + "description": "registration form", + "providerId": "form-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "registration-user-creation", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "registration-profile-action", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 40, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "registration-password-action", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 50, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "registration-recaptcha-action", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 60, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "fadc7a19-a9c5-4d5b-b7cf-a083ea11d579", + "alias": "reset credentials", + "description": "Reset credentials for a user if they forgot their password or something", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "reset-credentials-choose-user", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "reset-credential-email", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "reset-password", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 30, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 40, + "autheticatorFlow": true, + "flowAlias": "Reset - Conditional OTP", + "userSetupAllowed": false + } + ] + }, + { + "id": "6fb62e67-4ebd-4698-a79e-416643f8cc40", + "alias": "saml ecp", + "description": "SAML ECP Profile Authentication Flow", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "http-basic-authenticator", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + } + ], + "authenticatorConfig": [ + { + "id": "3189c761-6799-4a93-8033-46b386b8e6cc", + "alias": "create unique user config", + "config": { + "require.password.update.after.registration": "false" + } + }, + { + "id": "7df85127-1db0-42d7-9408-c2fce1ad2c47", + "alias": "review profile config", + "config": { + "update.profile.on.first.login": "missing" + } + } + ], + "requiredActions": [ + { + "alias": "CONFIGURE_TOTP", + "name": "Configure OTP", + "providerId": "CONFIGURE_TOTP", + "enabled": true, + "defaultAction": false, + "priority": 10, + "config": {} + }, + { + "alias": "TERMS_AND_CONDITIONS", + "name": "Terms and Conditions", + "providerId": "TERMS_AND_CONDITIONS", + "enabled": false, + "defaultAction": false, + "priority": 20, + "config": {} + }, + { + "alias": "UPDATE_PASSWORD", + "name": "Update Password", + "providerId": "UPDATE_PASSWORD", + "enabled": true, + "defaultAction": false, + "priority": 30, + "config": {} + }, + { + "alias": "UPDATE_PROFILE", + "name": "Update Profile", + "providerId": "UPDATE_PROFILE", + "enabled": true, + "defaultAction": false, + "priority": 40, + "config": {} + }, + { + "alias": "VERIFY_EMAIL", + "name": "Verify Email", + "providerId": "VERIFY_EMAIL", + "enabled": true, + "defaultAction": false, + "priority": 50, + "config": {} + }, + { + "alias": "delete_account", + "name": "Delete Account", + "providerId": "delete_account", + "enabled": false, + "defaultAction": false, + "priority": 60, + "config": {} + }, + { + "alias": "webauthn-register", + "name": "Webauthn Register", + "providerId": "webauthn-register", + "enabled": true, + "defaultAction": false, + "priority": 70, + "config": {} + }, + { + "alias": "webauthn-register-passwordless", + "name": "Webauthn Register Passwordless", + "providerId": "webauthn-register-passwordless", + "enabled": true, + "defaultAction": false, + "priority": 80, + "config": {} + }, + { + "alias": "update_user_locale", + "name": "Update User Locale", + "providerId": "update_user_locale", + "enabled": true, + "defaultAction": false, + "priority": 1000, + "config": {} + } + ], + "browserFlow": "browser", + "registrationFlow": "registration", + "directGrantFlow": "direct grant", + "resetCredentialsFlow": "reset credentials", + "clientAuthenticationFlow": "clients", + "dockerAuthenticationFlow": "docker auth", + "attributes": { + "cibaBackchannelTokenDeliveryMode": "poll", + "cibaExpiresIn": "120", + "cibaAuthRequestedUserHint": "login_hint", + "oauth2DeviceCodeLifespan": "600", + "clientOfflineSessionMaxLifespan": "0", + "oauth2DevicePollingInterval": "5", + "clientSessionIdleTimeout": "0", + "parRequestUriLifespan": "60", + "clientSessionMaxLifespan": "0", + "clientOfflineSessionIdleTimeout": "0", + "cibaInterval": "5", + "realmReusableOtpCode": "false" + }, + "keycloakVersion": "21.0.1", + "userManagedAccessAllowed": false, + "clientProfiles": { + "profiles": [] + }, + "clientPolicies": { + "policies": [] + } +} diff --git a/feasibility-portal/keycloak/init/initial-realm-prod.json b/feasibility-portal/keycloak/init/initial-realm-prod.json deleted file mode 100644 index 5ea86b9..0000000 --- a/feasibility-portal/keycloak/init/initial-realm-prod.json +++ /dev/null @@ -1,1798 +0,0 @@ -{ - "id" : "feasibility", - "realm" : "feasibility", - "notBefore" : 0, - "defaultSignatureAlgorithm" : "RS256", - "revokeRefreshToken" : false, - "refreshTokenMaxReuse" : 0, - "accessTokenLifespan" : 300, - "accessTokenLifespanForImplicitFlow" : 900, - "ssoSessionIdleTimeout" : 1800, - "ssoSessionMaxLifespan" : 36000, - "ssoSessionIdleTimeoutRememberMe" : 0, - "ssoSessionMaxLifespanRememberMe" : 0, - "offlineSessionIdleTimeout" : 2592000, - "offlineSessionMaxLifespanEnabled" : false, - "offlineSessionMaxLifespan" : 5184000, - "clientSessionIdleTimeout" : 0, - "clientSessionMaxLifespan" : 0, - "clientOfflineSessionIdleTimeout" : 0, - "clientOfflineSessionMaxLifespan" : 0, - "accessCodeLifespan" : 60, - "accessCodeLifespanUserAction" : 300, - "accessCodeLifespanLogin" : 1800, - "actionTokenGeneratedByAdminLifespan" : 43200, - "actionTokenGeneratedByUserLifespan" : 300, - "oauth2DeviceCodeLifespan" : 600, - "oauth2DevicePollingInterval" : 5, - "enabled" : true, - "sslRequired" : "external", - "registrationAllowed" : false, - "registrationEmailAsUsername" : false, - "rememberMe" : false, - "verifyEmail" : false, - "loginWithEmailAllowed" : true, - "duplicateEmailsAllowed" : false, - "resetPasswordAllowed" : false, - "editUsernameAllowed" : false, - "bruteForceProtected" : false, - "permanentLockout" : false, - "maxFailureWaitSeconds" : 900, - "minimumQuickLoginWaitSeconds" : 60, - "waitIncrementSeconds" : 60, - "quickLoginCheckMilliSeconds" : 1000, - "maxDeltaTimeSeconds" : 43200, - "failureFactor" : 30, - "roles" : { - "realm" : [ { - "id" : "913cae18-a8ca-46aa-a555-46bcc276c6a5", - "name" : "uma_authorization", - "description" : "${role_uma_authorization}", - "composite" : false, - "clientRole" : false, - "containerId" : "feasibility", - "attributes" : { } - }, { - "id" : "7a906443-fad8-47ab-b02b-01a36ac2a725", - "name" : "offline_access", - "description" : "${role_offline-access}", - "composite" : false, - "clientRole" : false, - "containerId" : "feasibility", - "attributes" : { } - }, { - "id" : "185a6bc8-6d93-4286-9df6-d038e3075131", - "name" : "FEASIBILITY_USER", - "description" : "Standard feasibility user, which is allowed to send feasibility queries but has no admin rights", - "composite" : false, - "clientRole" : false, - "containerId" : "feasibility", - "attributes" : { } - }, { - "id" : "d37ac4b9-ff18-49f0-b5db-04015bd8ef04", - "name" : "default-roles-feasibility", - "description" : "${role_default-roles}", - "composite" : true, - "composites" : { - "realm" : [ "offline_access", "uma_authorization" ], - "client" : { - "account" : [ "manage-account", "view-profile" ] - } - }, - "clientRole" : false, - "containerId" : "feasibility", - "attributes" : { } - } ], - "client" : { - "realm-management" : [ { - "id" : "355674ff-8891-485c-a68e-8c94cfec490a", - "name" : "view-identity-providers", - "description" : "${role_view-identity-providers}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "69d186fe-fc92-4b29-a287-144c4ead7bc5", - "name" : "manage-clients", - "description" : "${role_manage-clients}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "e089ab06-7d1a-4593-b8f8-82acb26ad4fe", - "name" : "manage-users", - "description" : "${role_manage-users}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "06383980-7900-4759-aec2-4cb253ebaa0d", - "name" : "manage-authorization", - "description" : "${role_manage-authorization}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "0d8ac718-e81d-4663-b3d1-ab72c3fa4c2f", - "name" : "view-realm", - "description" : "${role_view-realm}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "6dc13962-883a-4c78-a948-7eb91bdc1333", - "name" : "query-groups", - "description" : "${role_query-groups}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "e38a62c9-39ad-4b72-a504-adc9ccfa8325", - "name" : "query-clients", - "description" : "${role_query-clients}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "4c7e669f-8ade-4263-947d-28c9e949cb8a", - "name" : "realm-admin", - "description" : "${role_realm-admin}", - "composite" : true, - "composites" : { - "client" : { - "realm-management" : [ "view-identity-providers", "manage-users", "manage-clients", "view-realm", "manage-authorization", "query-groups", "query-clients", "view-events", "view-authorization", "query-users", "query-realms", "manage-realm", "manage-events", "create-client", "view-users", "view-clients", "manage-identity-providers", "impersonation" ] - } - }, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "f01b3e77-6ce7-48a7-8836-5296602a9377", - "name" : "view-events", - "description" : "${role_view-events}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "a277268b-02d6-4d1b-9f6f-fdddc39f2f1d", - "name" : "query-users", - "description" : "${role_query-users}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "dbf38fbc-9449-49ef-bced-b645c8d8e9ff", - "name" : "view-authorization", - "description" : "${role_view-authorization}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "b91f9193-06f7-46a4-860c-47e07c6e19e2", - "name" : "query-realms", - "description" : "${role_query-realms}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "06bcea3b-53ba-451c-970c-1076b0828d75", - "name" : "manage-realm", - "description" : "${role_manage-realm}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "3a2d6159-cba0-420d-a714-99cec7bab561", - "name" : "manage-events", - "description" : "${role_manage-events}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "feba4c38-9734-4084-8e7d-5c96e369658d", - "name" : "create-client", - "description" : "${role_create-client}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "2bed404b-7bc7-4820-93e7-3281172049c7", - "name" : "view-clients", - "description" : "${role_view-clients}", - "composite" : true, - "composites" : { - "client" : { - "realm-management" : [ "query-clients" ] - } - }, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "c20771d4-2295-4a2b-a565-d596bf8b3ec7", - "name" : "view-users", - "description" : "${role_view-users}", - "composite" : true, - "composites" : { - "client" : { - "realm-management" : [ "query-groups", "query-users" ] - } - }, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "6f959669-5dd8-4c20-8043-fadc35f96f2f", - "name" : "impersonation", - "description" : "${role_impersonation}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - }, { - "id" : "57707eab-db06-434c-8e6d-48e1e05edbf5", - "name" : "manage-identity-providers", - "description" : "${role_manage-identity-providers}", - "composite" : false, - "clientRole" : true, - "containerId" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "attributes" : { } - } ], - "feasibility-gui" : [ ], - "security-admin-console" : [ ], - "admin-cli" : [ ], - "account-console" : [ ], - "broker" : [ { - "id" : "5d8b0f88-6275-41bf-992a-0bd16e69825f", - "name" : "read-token", - "description" : "${role_read-token}", - "composite" : false, - "clientRole" : true, - "containerId" : "543d5000-dd9b-4db9-a0a1-ea3665c59c20", - "attributes" : { } - } ], - "account" : [ { - "id" : "fd6c7388-4057-4faf-b69f-3063e81cb3a8", - "name" : "view-consent", - "description" : "${role_view-consent}", - "composite" : false, - "clientRole" : true, - "containerId" : "809d8294-46d9-4219-b617-02f790af5037", - "attributes" : { } - }, { - "id" : "5a704c35-2f22-4f95-aedf-f4b89459e6c7", - "name" : "manage-account", - "description" : "${role_manage-account}", - "composite" : true, - "composites" : { - "client" : { - "account" : [ "manage-account-links" ] - } - }, - "clientRole" : true, - "containerId" : "809d8294-46d9-4219-b617-02f790af5037", - "attributes" : { } - }, { - "id" : "808d7ca7-d6c6-4763-bb79-4a471bbadd97", - "name" : "manage-account-links", - "description" : "${role_manage-account-links}", - "composite" : false, - "clientRole" : true, - "containerId" : "809d8294-46d9-4219-b617-02f790af5037", - "attributes" : { } - }, { - "id" : "c775280f-4b65-403a-b8ec-0f133cbb3b7e", - "name" : "view-profile", - "description" : "${role_view-profile}", - "composite" : false, - "clientRole" : true, - "containerId" : "809d8294-46d9-4219-b617-02f790af5037", - "attributes" : { } - }, { - "id" : "d183e0db-004e-4bc2-b4bd-b324b2479b3b", - "name" : "view-applications", - "description" : "${role_view-applications}", - "composite" : false, - "clientRole" : true, - "containerId" : "809d8294-46d9-4219-b617-02f790af5037", - "attributes" : { } - }, { - "id" : "5cd0e740-7701-46be-9688-183b8397f9ca", - "name" : "delete-account", - "description" : "${role_delete-account}", - "composite" : false, - "clientRole" : true, - "containerId" : "809d8294-46d9-4219-b617-02f790af5037", - "attributes" : { } - }, { - "id" : "3c06193c-94ce-446a-8948-69070e7826d2", - "name" : "manage-consent", - "description" : "${role_manage-consent}", - "composite" : true, - "composites" : { - "client" : { - "account" : [ "view-consent" ] - } - }, - "clientRole" : true, - "containerId" : "809d8294-46d9-4219-b617-02f790af5037", - "attributes" : { } - } ] - } - }, - "groups" : [ { - "id" : "dd4dfa45-4159-4098-9d91-1ad809674c67", - "name" : "feasibility-user", - "path" : "/feasibility-user", - "attributes" : { }, - "realmRoles" : [ "FEASIBILITY_USER" ], - "clientRoles" : { }, - "subGroups" : [ ] - } ], - "defaultRole" : { - "id" : "d37ac4b9-ff18-49f0-b5db-04015bd8ef04", - "name" : "default-roles-feasibility", - "description" : "${role_default-roles}", - "composite" : true, - "clientRole" : false, - "containerId" : "feasibility" - }, - "requiredCredentials" : [ "password" ], - "otpPolicyType" : "totp", - "otpPolicyAlgorithm" : "HmacSHA1", - "otpPolicyInitialCounter" : 0, - "otpPolicyDigits" : 6, - "otpPolicyLookAheadWindow" : 1, - "otpPolicyPeriod" : 30, - "otpSupportedApplications" : [ "FreeOTP", "Google Authenticator" ], - "webAuthnPolicyRpEntityName" : "keycloak", - "webAuthnPolicySignatureAlgorithms" : [ "ES256" ], - "webAuthnPolicyRpId" : "", - "webAuthnPolicyAttestationConveyancePreference" : "not specified", - "webAuthnPolicyAuthenticatorAttachment" : "not specified", - "webAuthnPolicyRequireResidentKey" : "not specified", - "webAuthnPolicyUserVerificationRequirement" : "not specified", - "webAuthnPolicyCreateTimeout" : 0, - "webAuthnPolicyAvoidSameAuthenticatorRegister" : false, - "webAuthnPolicyAcceptableAaguids" : [ ], - "webAuthnPolicyPasswordlessRpEntityName" : "keycloak", - "webAuthnPolicyPasswordlessSignatureAlgorithms" : [ "ES256" ], - "webAuthnPolicyPasswordlessRpId" : "", - "webAuthnPolicyPasswordlessAttestationConveyancePreference" : "not specified", - "webAuthnPolicyPasswordlessAuthenticatorAttachment" : "not specified", - "webAuthnPolicyPasswordlessRequireResidentKey" : "not specified", - "webAuthnPolicyPasswordlessUserVerificationRequirement" : "not specified", - "webAuthnPolicyPasswordlessCreateTimeout" : 0, - "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister" : false, - "webAuthnPolicyPasswordlessAcceptableAaguids" : [ ], - "users" : [ ], - "scopeMappings" : [ { - "clientScope" : "offline_access", - "roles" : [ "offline_access" ] - } ], - "clientScopeMappings" : { - "account" : [ { - "client" : "account-console", - "roles" : [ "manage-account" ] - } ] - }, - "clients" : [ { - "id" : "809d8294-46d9-4219-b617-02f790af5037", - "clientId" : "account", - "name" : "${client_account}", - "rootUrl" : "${authBaseUrl}", - "baseUrl" : "/realms/feasibility/account/", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "redirectUris" : [ "/realms/feasibility/account/*" ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "8ea10973-aa64-4608-81cb-cf28436906a0", - "clientId" : "account-console", - "name" : "${client_account-console}", - "rootUrl" : "${authBaseUrl}", - "baseUrl" : "/realms/feasibility/account/", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "redirectUris" : [ "/realms/feasibility/account/*" ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { - "pkce.code.challenge.method" : "S256" - }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "protocolMappers" : [ { - "id" : "c8f01dea-65e5-4a89-b022-f9cd49bdb0c2", - "name" : "audience resolve", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-audience-resolve-mapper", - "consentRequired" : false, - "config" : { } - } ], - "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "35a0cf7e-ab0d-4f64-8c59-a85df5c8666b", - "clientId" : "admin-cli", - "name" : "${client_admin-cli}", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : false, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : true, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "543d5000-dd9b-4db9-a0a1-ea3665c59c20", - "clientId" : "broker", - "name" : "${client_broker}", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : true, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "84966fed-c305-4da7-be96-10b4584eb052", - "clientId" : "feasibility-gui", - "name" : "feasibility-gui", - "rootUrl" : "https://localhost", - "baseUrl" : "https://localhost", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "redirectUris" : [ "https://localhost/*" ], - "webOrigins" : [ "https://localhost" ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : true, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { - "saml.assertion.signature" : "false", - "id.token.as.detached.signature" : "false", - "saml.multivalued.roles" : "false", - "saml.force.post.binding" : "false", - "saml.encrypt" : "false", - "oauth2.device.authorization.grant.enabled" : "false", - "backchannel.logout.revoke.offline.tokens" : "false", - "saml.server.signature" : "false", - "saml.server.signature.keyinfo.ext" : "false", - "use.refresh.tokens" : "true", - "exclude.session.state.from.auth.response" : "false", - "oidc.ciba.grant.enabled" : "false", - "saml.artifact.binding" : "false", - "backchannel.logout.session.required" : "true", - "client_credentials.use_refresh_token" : "false", - "saml_force_name_id_format" : "false", - "saml.client.signature" : "false", - "tls.client.certificate.bound.access.tokens" : "false", - "require.pushed.authorization.requests" : "false", - "saml.authnstatement" : "false", - "display.on.consent.screen" : "false", - "saml.onetimeuse.condition" : "false" - }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : true, - "nodeReRegistrationTimeout" : -1, - "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "e6089980-bd10-40ec-bcf0-021654e7d5d2", - "clientId" : "realm-management", - "name" : "${client_realm-management}", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : true, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "7d85918f-33f4-4967-a4b7-c37c27a4764e", - "clientId" : "security-admin-console", - "name" : "${client_security-admin-console}", - "rootUrl" : "${authAdminUrl}", - "baseUrl" : "/admin/feasibility/console/", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "redirectUris" : [ "/admin/feasibility/console/*" ], - "webOrigins" : [ "+" ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { - "pkce.code.challenge.method" : "S256" - }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "protocolMappers" : [ { - "id" : "9a3554a7-3db0-42cd-a32d-253ed8974f66", - "name" : "locale", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "locale", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "locale", - "jsonType.label" : "String" - } - } ], - "defaultClientScopes" : [ "web-origins", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - } ], - "clientScopes" : [ { - "id" : "9e54c6c2-0aa6-46d3-98f8-639b9e84bca6", - "name" : "role_list", - "description" : "SAML role list", - "protocol" : "saml", - "attributes" : { - "consent.screen.text" : "${samlRoleListScopeConsentText}", - "display.on.consent.screen" : "true" - }, - "protocolMappers" : [ { - "id" : "660801b2-a9ef-4a67-8884-4461f40bd91c", - "name" : "role list", - "protocol" : "saml", - "protocolMapper" : "saml-role-list-mapper", - "consentRequired" : false, - "config" : { - "single" : "false", - "attribute.nameformat" : "Basic", - "attribute.name" : "Role" - } - } ] - }, { - "id" : "b503db75-c63d-43a9-99c4-8933411acac5", - "name" : "offline_access", - "description" : "OpenID Connect built-in scope: offline_access", - "protocol" : "openid-connect", - "attributes" : { - "consent.screen.text" : "${offlineAccessScopeConsentText}", - "display.on.consent.screen" : "true" - } - }, { - "id" : "22e668e6-7477-43b9-b980-d20f32203ab4", - "name" : "profile", - "description" : "OpenID Connect built-in scope: profile", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${profileScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "dc818891-ee21-42dd-a042-53ae54280284", - "name" : "zoneinfo", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "zoneinfo", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "zoneinfo", - "jsonType.label" : "String" - } - }, { - "id" : "8e62e716-8889-4f13-8256-dab11d583608", - "name" : "middle name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "middleName", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "middle_name", - "jsonType.label" : "String" - } - }, { - "id" : "23526425-35fd-4537-ab0b-aed54f59c63e", - "name" : "nickname", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "nickname", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "nickname", - "jsonType.label" : "String" - } - }, { - "id" : "058d0aa6-a967-4932-b384-b73e5ba0e0b4", - "name" : "full name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-full-name-mapper", - "consentRequired" : false, - "config" : { - "id.token.claim" : "true", - "access.token.claim" : "true", - "userinfo.token.claim" : "true" - } - }, { - "id" : "908a8f10-01bf-4a80-9e39-134a5259b7e7", - "name" : "locale", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "locale", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "locale", - "jsonType.label" : "String" - } - }, { - "id" : "49fec980-87e5-4035-a4db-f41cb1159d1f", - "name" : "picture", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "picture", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "picture", - "jsonType.label" : "String" - } - }, { - "id" : "7aa5f0c2-0a9c-486f-bcf7-e9d3dd071d9f", - "name" : "family name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "lastName", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "family_name", - "jsonType.label" : "String" - } - }, { - "id" : "400a3a74-c4e4-4f6a-a782-03f2daf8ed7f", - "name" : "birthdate", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "birthdate", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "birthdate", - "jsonType.label" : "String" - } - }, { - "id" : "b9604c8f-eaba-4333-808a-1c58a874decf", - "name" : "updated at", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "updatedAt", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "updated_at", - "jsonType.label" : "String" - } - }, { - "id" : "4efba9b3-f668-499a-b34d-3644d7ae8db6", - "name" : "profile", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "profile", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "profile", - "jsonType.label" : "String" - } - }, { - "id" : "726f471f-93c3-48a5-b2b8-4cb0fcf57ab7", - "name" : "website", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "website", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "website", - "jsonType.label" : "String" - } - }, { - "id" : "97f4560a-ff09-4983-a5a1-8166e9c035b8", - "name" : "gender", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "gender", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "gender", - "jsonType.label" : "String" - } - }, { - "id" : "6b9f9512-b501-45ee-b882-8a427ee84039", - "name" : "given name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "firstName", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "given_name", - "jsonType.label" : "String" - } - }, { - "id" : "925cfc56-bbe9-40e2-bb7e-9b8b84e93e69", - "name" : "username", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "username", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "preferred_username", - "jsonType.label" : "String" - } - } ] - }, { - "id" : "55f2daa4-f2cd-41f0-a617-3cc1365f692e", - "name" : "microprofile-jwt", - "description" : "Microprofile - JWT built-in scope", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "false" - }, - "protocolMappers" : [ { - "id" : "259ccd2b-2ebd-48ed-b605-6ac6007afce0", - "name" : "groups", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-realm-role-mapper", - "consentRequired" : false, - "config" : { - "multivalued" : "true", - "user.attribute" : "foo", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "groups", - "jsonType.label" : "String" - } - }, { - "id" : "2a4e87bf-9464-4d9f-9929-f667a77fb752", - "name" : "upn", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "username", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "upn", - "jsonType.label" : "String" - } - } ] - }, { - "id" : "9a476ca3-b855-46c8-bf58-6a4bae5b5dab", - "name" : "email", - "description" : "OpenID Connect built-in scope: email", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${emailScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "237c45bf-8633-4050-9984-586aa9da0a96", - "name" : "email", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "email", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "email", - "jsonType.label" : "String" - } - }, { - "id" : "0afa79db-68a0-4528-badb-6c10d9db820b", - "name" : "email verified", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "emailVerified", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "email_verified", - "jsonType.label" : "boolean" - } - } ] - }, { - "id" : "4629a245-a77b-4055-8244-ac6290cc89d1", - "name" : "address", - "description" : "OpenID Connect built-in scope: address", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${addressScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "00c69d3d-abed-4205-a8ef-6a3df86f545e", - "name" : "address", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-address-mapper", - "consentRequired" : false, - "config" : { - "user.attribute.formatted" : "formatted", - "user.attribute.country" : "country", - "user.attribute.postal_code" : "postal_code", - "userinfo.token.claim" : "true", - "user.attribute.street" : "street", - "id.token.claim" : "true", - "user.attribute.region" : "region", - "access.token.claim" : "true", - "user.attribute.locality" : "locality" - } - } ] - }, { - "id" : "754f520a-27c6-41e7-95a6-03ad374e4143", - "name" : "roles", - "description" : "OpenID Connect scope for add user roles to the access token", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "false", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${rolesScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "c7cd55a9-9c1c-4390-b6f3-e59264461415", - "name" : "audience resolve", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-audience-resolve-mapper", - "consentRequired" : false, - "config" : { } - }, { - "id" : "a14fbf98-8ebe-416b-8263-5c50b77ed238", - "name" : "client roles", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-client-role-mapper", - "consentRequired" : false, - "config" : { - "user.attribute" : "foo", - "access.token.claim" : "true", - "claim.name" : "resource_access.${client_id}.roles", - "jsonType.label" : "String", - "multivalued" : "true" - } - }, { - "id" : "1e63d316-6a19-4049-a295-5dd600f7b1b6", - "name" : "realm roles", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-realm-role-mapper", - "consentRequired" : false, - "config" : { - "user.attribute" : "foo", - "access.token.claim" : "true", - "claim.name" : "realm_access.roles", - "jsonType.label" : "String", - "multivalued" : "true" - } - } ] - }, { - "id" : "2e6fa524-565e-4151-81a8-be4cb5e2b247", - "name" : "phone", - "description" : "OpenID Connect built-in scope: phone", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${phoneScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "7073f0a3-678e-4748-b379-83e3c7a89bd9", - "name" : "phone number", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "phoneNumber", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "phone_number", - "jsonType.label" : "String" - } - }, { - "id" : "e396c288-0869-467f-a315-173388845f20", - "name" : "phone number verified", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "phoneNumberVerified", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "phone_number_verified", - "jsonType.label" : "boolean" - } - } ] - }, { - "id" : "8fd75efa-3be8-46b3-bade-3f24433d03fd", - "name" : "web-origins", - "description" : "OpenID Connect scope for add allowed web origins to the access token", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "false", - "display.on.consent.screen" : "false", - "consent.screen.text" : "" - }, - "protocolMappers" : [ { - "id" : "98108f6b-8bbc-46b9-83a1-30aa539c40e0", - "name" : "allowed web origins", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-allowed-origins-mapper", - "consentRequired" : false, - "config" : { } - } ] - } ], - "defaultDefaultClientScopes" : [ "role_list", "profile", "email", "roles", "web-origins" ], - "defaultOptionalClientScopes" : [ "offline_access", "address", "phone", "microprofile-jwt" ], - "browserSecurityHeaders" : { - "contentSecurityPolicyReportOnly" : "", - "xContentTypeOptions" : "nosniff", - "xRobotsTag" : "none", - "xFrameOptions" : "SAMEORIGIN", - "contentSecurityPolicy" : "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", - "xXSSProtection" : "1; mode=block", - "strictTransportSecurity" : "max-age=31536000; includeSubDomains" - }, - "smtpServer" : { }, - "eventsEnabled" : false, - "eventsListeners" : [ "jboss-logging" ], - "enabledEventTypes" : [ ], - "adminEventsEnabled" : false, - "adminEventsDetailsEnabled" : false, - "identityProviders" : [ ], - "identityProviderMappers" : [ ], - "components" : { - "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy" : [ { - "id" : "d51877c5-52e3-4480-84bf-c0619cb7ffba", - "name" : "Allowed Protocol Mapper Types", - "providerId" : "allowed-protocol-mappers", - "subType" : "authenticated", - "subComponents" : { }, - "config" : { - "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "oidc-address-mapper", "saml-user-attribute-mapper", "saml-user-property-mapper", "oidc-usermodel-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper" ] - } - }, { - "id" : "01d9486e-ba62-40f4-8462-4b960bdc3baa", - "name" : "Allowed Protocol Mapper Types", - "providerId" : "allowed-protocol-mappers", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-usermodel-property-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper", "oidc-address-mapper" ] - } - }, { - "id" : "4000d1c1-c789-4553-906e-51f7debe6053", - "name" : "Allowed Client Scopes", - "providerId" : "allowed-client-templates", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "allow-default-scopes" : [ "true" ] - } - }, { - "id" : "a4d284aa-27f4-4ec5-b36c-13984812a6f7", - "name" : "Trusted Hosts", - "providerId" : "trusted-hosts", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "host-sending-registration-request-must-match" : [ "true" ], - "client-uris-must-match" : [ "true" ] - } - }, { - "id" : "750791d1-e57f-49ec-94f2-97b10c64968d", - "name" : "Consent Required", - "providerId" : "consent-required", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { } - }, { - "id" : "4362fca0-4e80-4404-9f6e-51c484fb7186", - "name" : "Max Clients Limit", - "providerId" : "max-clients", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "max-clients" : [ "200" ] - } - }, { - "id" : "550e6ec0-9239-49ad-ba41-c88908c04a6c", - "name" : "Full Scope Disabled", - "providerId" : "scope", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { } - }, { - "id" : "bebecfb2-019f-412f-9250-d65b5f4d5080", - "name" : "Allowed Client Scopes", - "providerId" : "allowed-client-templates", - "subType" : "authenticated", - "subComponents" : { }, - "config" : { - "allow-default-scopes" : [ "true" ] - } - } ], - "org.keycloak.keys.KeyProvider" : [ { - "id" : "cd059e72-1677-4ff7-a522-a06208af5c69", - "name" : "rsa-enc-generated", - "providerId" : "rsa-generated", - "subComponents" : { }, - "config" : { - "privateKey" : [ "MIIEowIBAAKCAQEAyZgCT/dHAB/Q6nd9JQAs8qOwGLJNdGsCEIgzlxh9CgbUyiRXEGNSvCKDkCcMHJqcRwOiPhY5A6ZXAuSFWt754quYxZkJAvb5Pf2MunHkbL1Z2FHit0vLB7zLpF4nBecp+OdrstQSxo97lkHlkJmm0Vyeum1B5ornUBrViI/8nFXbMg/Wcc5X1B+1vl5iEeoN4WOFerl4PJCwtq+i9i0cWpESPMKxAeu9BDWkM6rg9vVjfozT/QwdzgBDDO+qZF6LtNZsogbwto2tSGHMpM01DB2TgBt4zDUBb6yysnDvgFSYlZVz3x0hDce4Zkzw7zNbkdhdnCls5eYGn9pPo+1d5QIDAQABAoIBACidq7mYxIFN57WVpW0S//tS52PSaLCP7raN+nbyxB6FCdJASBpRKJYnDgK5G0OYEuxr2wBPUeVeWiGHESchzY7Rq9ID50DlqYnHz9awo6kU7UkcFmV/q8Q/UXgoUAxsapRva8930uCWf/viAvKDQozj8Eb3RFPCoKAPB/6fo/GLLx+QCQxh763namiwceh8QCcw6b7Bb0bY5e85+n7Ff9L/Z2ic/ObW6B8fxKLuQ3IN8DnZ3aX3gu4AY64n2+slbk/9NRxjhQeYqG9EFVK40ynQ+/melIMHtcfnLWn4JmrE0SNmkPT2etzTG4iUG8OB7e90Cuyix6JHFvObU0YKRfECgYEA7c9UBuJNj+a+Ucd4JvDwDwWHm1FdAtJMkIaQGwTt2IuW5xH1NKhQPo0Jeg9Aj+tHuwuj9EqVEyqC46lp7XUPQ/P2RKl1CikmW6IHVFMT1GrM5agAeIrmY4VjlDnYAfPmL6vm8ubNVY8SpoTx2X0DOl11YDW7c6ayEjwRUp9Y5P8CgYEA2QOECfMFtE9E2F5MeNel1sZvFznRchMr6g3YxR3W+/xIX0gv8p7dgti8QugZ2Ux8NodXyIMiuZEzWus/b3q49KrcLf01+UJ0lGx9R4/hIA4yFrjNaEyMQVNF1he0S9+BLeQuYWpTDjQQV4c/PmJ9WAHcn4x5hg+wK2ZM2VE/yRsCgYEAuUkOmQZ9lB8eLi2SKhUTlUCjtZohM++ShBCz+rlOb6fi/Up6mHqDexj8R0PW88tHai7ZoZ7yo6o9rQ/0XnUUXceZG0pEzJPfNQn7V/IawygrWMwbAdCHTQdC3NxstqjHsmDnYl39oioFSATRQrkqaLEkoL98u9EncRmoDY3l/xUCgYBA9vd5DwJfJvfCGgCkkFH6CK9K8akMkEauK3UAFV29U5nKxE5uQDapq/43vUm3rljk7gFOaktj597K0e/MjJ1/yQJe1hVpSAakRBIA8UaAlR9ThAEhvwChsa8PV0tHB2KhfVSRHwY8E0PtH/TD1TIWvX/xV1kt09Z2N4q758HDjwKBgGTK9bYYErNeaIBoNqX3/SVFYFJR8C7p9OP6Jq3q6Nmys7Zz8DiNklwZVuquynuttJsl2iLFiVFZ7gUQlW3tbGwG4ZsEJDpPMoCj2vg6Cr7HMYAbi3UFAWlvJzcsJXgGshjipGE3E7pAM+g65vp/kPToiXzLV5v1QS1Yu0iFgpwe" ], - "keyUse" : [ "enc" ], - "certificate" : [ "MIICpTCCAY0CBgGB2C/SLjANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtmZWFzaWJpbGl0eTAeFw0yMjA3MDcxMDIyMDFaFw0zMjA3MDcxMDIzNDFaMBYxFDASBgNVBAMMC2ZlYXNpYmlsaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyZgCT/dHAB/Q6nd9JQAs8qOwGLJNdGsCEIgzlxh9CgbUyiRXEGNSvCKDkCcMHJqcRwOiPhY5A6ZXAuSFWt754quYxZkJAvb5Pf2MunHkbL1Z2FHit0vLB7zLpF4nBecp+OdrstQSxo97lkHlkJmm0Vyeum1B5ornUBrViI/8nFXbMg/Wcc5X1B+1vl5iEeoN4WOFerl4PJCwtq+i9i0cWpESPMKxAeu9BDWkM6rg9vVjfozT/QwdzgBDDO+qZF6LtNZsogbwto2tSGHMpM01DB2TgBt4zDUBb6yysnDvgFSYlZVz3x0hDce4Zkzw7zNbkdhdnCls5eYGn9pPo+1d5QIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAwKApdladuIgKDg+Bidq3ZVcQaua6ugUSjgWh5ZJcm1VCnrvdi8K1EtZd13uvJo4GUNPxRQPlu5/eDjHiil2gA7z1wz40X7i0KvTD3MnR5E+aHzHL38+sdYOPCUnG4BAni+Au9I5ZqyN5rg7V0ySzttdhlCqLnh0fi6/OebcoDq0NBQ7MF7sUZGVTlR/GTxPaK1rXyUFM9IvzhoorqM/FXMemzzu1F0pO0VYk52q34GedP5P3N87cgCe/3hgLrq6dyogshZ4ujrtcCk1ezOk9vVNx+rbPpaC39P542pA+FGFaU8epYapTL0huv6SPbfFIyUUGP2V5Cwah+e5GKw73j" ], - "priority" : [ "100" ] - } - }, { - "id" : "f69d1970-46ab-4efa-b4cd-1ce3273e6c7e", - "name" : "rsa-generated", - "providerId" : "rsa-generated", - "subComponents" : { }, - "config" : { - "privateKey" : [ "MIIEpAIBAAKCAQEAmDrcdVuG3KxXMVxKEzmlGreXK8mOBow7s7KE9wLsMzgcoPTxb5QMDnQdm5JFjxr6b0Bl3DUuQB4woSIqnX1LG7pF3bBkl6mCizXh2XGd0kFKhlV4EljsN4/1Evb99hr9Fv2yQsmCIL6e6nd1lX8TP7XNZq16EBYumeGk7jhx44nZfADfUC6DLPyV+XnN6bifbn8ld+XpDCGhBDr2L7mFWzhJflKAY2iJOg1JC6MeVuOfjMGWq4dhcSvP2rvEGNtTvjTW8gAmVF8RqXUdq+tqvJSqjRK1C99cpHcmr8T7630QS9G8M3XYR/iI32Sj0YuR6VyoFnVUnURzFRFU3t26HQIDAQABAoIBAEq4WY2hJ0kZrpKj4hgdq1S52JG9lODR5FwHvAwiex2I5UR79iX2XRSbGg1KdqoPa+0/hr/XuqPuLaBpzNEQttUdUT3HXxiyM0lxYTIB+p1BPvtA6HbY/tkm5/wvD+jExoWKcP0nO6Am8InVqPmALkqPSgqkC83plWYiw3nKatxsASrKO4R0Qp5RWUo8GNkDxXh3pHwlYjFvn4t4Nh1QjVTTljcN2gJqHS2D5dIfjVCWHgBZL5Scd9wu+BjysYd0DQRBC9Xh7v2dQzSAvaouaFvsdpiYnHsVgBrGvD1Scctg7wVO/PNtspKpcKgpaEP1rD4l6zN6FI5Ua9tt5CHkO2ECgYEA5gvWUjwtzFpQzmby4zRw8kqLFQuCl4UIJ5QThJD+Oqr7yXn0CZcNqDZ8tUZNcTxytS9YYyiU1RTghdXgGPEgSC1bSOWyxLMJu585aaxA8el9fSBCg17SbuG6THEJ1yOkWxDFfhqfXjQ6LGw2Ru268kITlA3POU9GGtMTBEVBUb8CgYEAqWeLViUhchtozmt1AJGG2EWn0RwG45YcNEXBLxvoumEHYO1acdSI+ekB8Hviovq1TcJkLBSE0Qz505nw6ckD6CpMubs1uPu0cjrXqr5wlF+P/rfBEJqipS31xwyi9S0NqKOKBzKqPrzfH2G4YwXUL/QMlcYDL4wPU3vqU8j5syMCgYEAoh7xeZ7jf8Kec/dlcO2CM56JCdnEvNeJ+aqHXsN4Bwx8yW5ip2eGvmc31+Clrwm0pS+qkKcGzGwcFvW1Kp6z62nbjTIjnC+4yjraETjNxC6Su13CwiZPEsmNq1V2Y+HAcFUPeWF1ssQHw0q3raDYQOaEObDJu0+8zia2ninYcK0CgYAjdY8O6xrDHcWkX43QHqYRIxNri+hNPyCMOIWlbLwcNy8qNMSXyxsY5JMJWYUpBD1rF2OMbocWkxbAGhr5dKAiuqfwwKUQIW+18WcvUEmUZSRo9uGsrhGZbbNihNyfYVzYjdLYitxj4Xj6wqOr5o5xsy3nM9l63GBg4zE7dHf/7QKBgQDcOa/VUvVuIeoD3iGIm/aavc7NVDlA0U4RD6Ehdlrcpm1s/SbRbX3UY2X6ANxEik867XBBeB8ViT/D0qKmT/FFd5z9cS3jcA+oHU3KaKwsFfC80ixCVhDrmX+Rt+5B8fuCw+zU8WRlo9rd/T4WVMctJju6gM8I4Mxk2VjKeRCPcA==" ], - "keyUse" : [ "sig" ], - "certificate" : [ "MIICpTCCAY0CBgGB2C/RqjANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtmZWFzaWJpbGl0eTAeFw0yMjA3MDcxMDIyMDFaFw0zMjA3MDcxMDIzNDFaMBYxFDASBgNVBAMMC2ZlYXNpYmlsaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmDrcdVuG3KxXMVxKEzmlGreXK8mOBow7s7KE9wLsMzgcoPTxb5QMDnQdm5JFjxr6b0Bl3DUuQB4woSIqnX1LG7pF3bBkl6mCizXh2XGd0kFKhlV4EljsN4/1Evb99hr9Fv2yQsmCIL6e6nd1lX8TP7XNZq16EBYumeGk7jhx44nZfADfUC6DLPyV+XnN6bifbn8ld+XpDCGhBDr2L7mFWzhJflKAY2iJOg1JC6MeVuOfjMGWq4dhcSvP2rvEGNtTvjTW8gAmVF8RqXUdq+tqvJSqjRK1C99cpHcmr8T7630QS9G8M3XYR/iI32Sj0YuR6VyoFnVUnURzFRFU3t26HQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAoqnsCV2hN7/osX5ebm7KiYg87bZ4HpydLj12oSAUUK0h6U4RvgBbuZLgaVP7I8Ozbq72F5Rt48m+fY30LxNgWuazI7axJdLrE/HeEo9mCjP3F9ci1lsAwlcXoFmtsGlmlDjFE1WChAwj9D8cwZG4bmv+mRsFP9iJx5n7RXiTdS/OyG44Ufv3XPqx/QVY7I4I+N50JC0mBlFm7GlQLAU9lkZRlnxcbh4uxe4MAY9R7t+CBLYILTCQCCz39U/7UFzfGBAV6Y4mSF/cq50LoqalN+g2ZxMwH5wQs9EpZHBOTQNf7FOf28jc/3wPL2bfkte0XuCAUxAulZAk+PskP6Rm7" ], - "priority" : [ "100" ] - } - }, { - "id" : "1bee6796-da7c-4373-a9fd-3e7f172ddf3e", - "name" : "aes-generated", - "providerId" : "aes-generated", - "subComponents" : { }, - "config" : { - "kid" : [ "9e3b56b9-9f51-453a-b725-a0a10dd44198" ], - "secret" : [ "CuIhnM65L38Oo0Eo8ZSi9w" ], - "priority" : [ "100" ] - } - }, { - "id" : "45eb7073-19e3-4c37-8f09-a509de9b77ba", - "name" : "hmac-generated", - "providerId" : "hmac-generated", - "subComponents" : { }, - "config" : { - "kid" : [ "4d297444-bd22-42d5-80f9-a0712035ae31" ], - "secret" : [ "S6tzdFt6stBKXSjVkYnIQhmNHhPdKnZsL-75MSV5pAgzIXIJxW3TWYYR2aETUgoiz_7zoAKAqw0b9gO7JhRuIw" ], - "priority" : [ "100" ], - "algorithm" : [ "HS256" ] - } - } ] - }, - "internationalizationEnabled" : false, - "supportedLocales" : [ ], - "authenticationFlows" : [ { - "id" : "1591c55b-b9ce-4f96-9b45-630c8c1daa90", - "alias" : "Account verification options", - "description" : "Method with which to verity the existing account", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "idp-email-verification", - "authenticatorFlow" : false, - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "ALTERNATIVE", - "priority" : 20, - "flowAlias" : "Verify Existing Account by Re-authentication", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "25115f67-6dc3-426e-83a2-46d069b2a379", - "alias" : "Authentication Options", - "description" : "Authentication options.", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "basic-auth", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "basic-auth-otp", - "authenticatorFlow" : false, - "requirement" : "DISABLED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-spnego", - "authenticatorFlow" : false, - "requirement" : "DISABLED", - "priority" : 30, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "f1ef28be-073d-4c42-abfd-3dbc5bdd50d2", - "alias" : "Browser - Conditional OTP", - "description" : "Flow to determine if the OTP is required for the authentication", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-otp-form", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "e57adbb9-c56b-4ab1-a5a8-d0aeb6d89075", - "alias" : "Direct Grant - Conditional OTP", - "description" : "Flow to determine if the OTP is required for the authentication", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "direct-grant-validate-otp", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "7447bc9f-50ce-44b9-888a-68899342f751", - "alias" : "First broker login - Conditional OTP", - "description" : "Flow to determine if the OTP is required for the authentication", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-otp-form", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "71def9c4-7877-488d-acab-4ada493fc0a2", - "alias" : "Handle Existing Account", - "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "idp-confirm-link", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "REQUIRED", - "priority" : 20, - "flowAlias" : "Account verification options", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "a6e2ed3e-cf82-415c-928f-403595ee2587", - "alias" : "Reset - Conditional OTP", - "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "reset-otp", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "8ddb20e9-a1d1-48d9-836d-ba2ed0d4ee85", - "alias" : "User creation or linking", - "description" : "Flow for the existing/non-existing user alternatives", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticatorConfig" : "create unique user config", - "authenticator" : "idp-create-user-if-unique", - "authenticatorFlow" : false, - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "ALTERNATIVE", - "priority" : 20, - "flowAlias" : "Handle Existing Account", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "4de10554-cd01-4817-bc60-e89f56ed786f", - "alias" : "Verify Existing Account by Re-authentication", - "description" : "Reauthentication of existing account", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "idp-username-password-form", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "CONDITIONAL", - "priority" : 20, - "flowAlias" : "First broker login - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "048dff4a-cdf8-4642-a12a-552d25566f71", - "alias" : "browser", - "description" : "browser based authentication", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "auth-cookie", - "authenticatorFlow" : false, - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-spnego", - "authenticatorFlow" : false, - "requirement" : "DISABLED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "identity-provider-redirector", - "authenticatorFlow" : false, - "requirement" : "ALTERNATIVE", - "priority" : 25, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "ALTERNATIVE", - "priority" : 30, - "flowAlias" : "forms", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "8f19d645-9b9f-4936-9512-e0009dfbb9c8", - "alias" : "clients", - "description" : "Base authentication for clients", - "providerId" : "client-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "client-secret", - "authenticatorFlow" : false, - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "client-jwt", - "authenticatorFlow" : false, - "requirement" : "ALTERNATIVE", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "client-secret-jwt", - "authenticatorFlow" : false, - "requirement" : "ALTERNATIVE", - "priority" : 30, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "client-x509", - "authenticatorFlow" : false, - "requirement" : "ALTERNATIVE", - "priority" : 40, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "403953bd-1c17-44c5-92b0-c0952c4b3763", - "alias" : "direct grant", - "description" : "OpenID Connect Resource Owner Grant", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "direct-grant-validate-username", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "direct-grant-validate-password", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "CONDITIONAL", - "priority" : 30, - "flowAlias" : "Direct Grant - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "b17452c1-b033-43d0-be9a-94ac47be16ae", - "alias" : "docker auth", - "description" : "Used by Docker clients to authenticate against the IDP", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "docker-http-basic-authenticator", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "53d6fadb-64eb-48f1-9735-26a9b9eab6ac", - "alias" : "first broker login", - "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticatorConfig" : "review profile config", - "authenticator" : "idp-review-profile", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "REQUIRED", - "priority" : 20, - "flowAlias" : "User creation or linking", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "6de11df1-401d-429a-8829-1891fb438ba9", - "alias" : "forms", - "description" : "Username, password, otp and other auth forms.", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "auth-username-password-form", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "CONDITIONAL", - "priority" : 20, - "flowAlias" : "Browser - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "f024a9f0-a435-4529-bd2a-7b08b4629873", - "alias" : "http challenge", - "description" : "An authentication flow based on challenge-response HTTP Authentication Schemes", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "no-cookie-redirect", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "REQUIRED", - "priority" : 20, - "flowAlias" : "Authentication Options", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "7d41146f-09b5-47e1-a079-3d49731a5f5e", - "alias" : "registration", - "description" : "registration flow", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "registration-page-form", - "authenticatorFlow" : true, - "requirement" : "REQUIRED", - "priority" : 10, - "flowAlias" : "registration form", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "057d65e7-1f44-4a36-9dfe-2adc8053f6ab", - "alias" : "registration form", - "description" : "registration form", - "providerId" : "form-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "registration-user-creation", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "registration-profile-action", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 40, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "registration-password-action", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 50, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "registration-recaptcha-action", - "authenticatorFlow" : false, - "requirement" : "DISABLED", - "priority" : 60, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "db258619-ca92-4ec7-872b-a2b43563d241", - "alias" : "reset credentials", - "description" : "Reset credentials for a user if they forgot their password or something", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "reset-credentials-choose-user", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "reset-credential-email", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "reset-password", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 30, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticatorFlow" : true, - "requirement" : "CONDITIONAL", - "priority" : 40, - "flowAlias" : "Reset - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "632d34f5-f7ec-4efe-a843-2f88b17c517a", - "alias" : "saml ecp", - "description" : "SAML ECP Profile Authentication Flow", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "http-basic-authenticator", - "authenticatorFlow" : false, - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - } ], - "authenticatorConfig" : [ { - "id" : "f2d03e45-79a1-40b1-bd11-2ac162e00adf", - "alias" : "create unique user config", - "config" : { - "require.password.update.after.registration" : "false" - } - }, { - "id" : "1289ed55-66fb-474b-a187-1e7addff574c", - "alias" : "review profile config", - "config" : { - "update.profile.on.first.login" : "missing" - } - } ], - "requiredActions" : [ { - "alias" : "CONFIGURE_TOTP", - "name" : "Configure OTP", - "providerId" : "CONFIGURE_TOTP", - "enabled" : true, - "defaultAction" : false, - "priority" : 10, - "config" : { } - }, { - "alias" : "terms_and_conditions", - "name" : "Terms and Conditions", - "providerId" : "terms_and_conditions", - "enabled" : false, - "defaultAction" : false, - "priority" : 20, - "config" : { } - }, { - "alias" : "UPDATE_PASSWORD", - "name" : "Update Password", - "providerId" : "UPDATE_PASSWORD", - "enabled" : true, - "defaultAction" : false, - "priority" : 30, - "config" : { } - }, { - "alias" : "UPDATE_PROFILE", - "name" : "Update Profile", - "providerId" : "UPDATE_PROFILE", - "enabled" : true, - "defaultAction" : false, - "priority" : 40, - "config" : { } - }, { - "alias" : "VERIFY_EMAIL", - "name" : "Verify Email", - "providerId" : "VERIFY_EMAIL", - "enabled" : true, - "defaultAction" : false, - "priority" : 50, - "config" : { } - }, { - "alias" : "delete_account", - "name" : "Delete Account", - "providerId" : "delete_account", - "enabled" : false, - "defaultAction" : false, - "priority" : 60, - "config" : { } - }, { - "alias" : "update_user_locale", - "name" : "Update User Locale", - "providerId" : "update_user_locale", - "enabled" : true, - "defaultAction" : false, - "priority" : 1000, - "config" : { } - } ], - "browserFlow" : "browser", - "registrationFlow" : "registration", - "directGrantFlow" : "direct grant", - "resetCredentialsFlow" : "reset credentials", - "clientAuthenticationFlow" : "clients", - "dockerAuthenticationFlow" : "docker auth", - "attributes" : { - "cibaBackchannelTokenDeliveryMode" : "poll", - "cibaExpiresIn" : "120", - "cibaAuthRequestedUserHint" : "login_hint", - "oauth2DeviceCodeLifespan" : "600", - "oauth2DevicePollingInterval" : "5", - "parRequestUriLifespan" : "60", - "cibaInterval" : "5" - }, - "keycloakVersion" : "15.0.2", - "userManagedAccessAllowed" : false, - "clientProfiles" : { - "profiles" : [ ] - }, - "clientPolicies" : { - "policies" : [ ] - } -} \ No newline at end of file From 138bfc380bec1c1c0d2f5badb03f182632a41dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 28 Mar 2023 23:02:39 +0200 Subject: [PATCH 083/118] remove port exposing keycloak --- feasibility-portal/keycloak/docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/feasibility-portal/keycloak/docker-compose.yml b/feasibility-portal/keycloak/docker-compose.yml index 55cf69b..e5d2ffb 100644 --- a/feasibility-portal/keycloak/docker-compose.yml +++ b/feasibility-portal/keycloak/docker-compose.yml @@ -15,8 +15,6 @@ services: image: keycloak/keycloak:21.0 command: ["start", "--import-realm"] restart: unless-stopped - ports: - - "8080:8080" environment: KC_DB: postgres KC_DB_URL: "jdbc:postgresql://auth-db:5432/${FEASIBILITY_KC_DB}" From 39a244ba716da971246686ddce49365eae5dfb97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 16:45:16 +0200 Subject: [PATCH 084/118] update readmes, env vars and update version backend and gui --- Feasibility-Query.md | 139 +++++++++--------- auth/{cert.pem => cert.pem.example} | 0 auth/{key.pem => key.pem.example} | 0 feasibility-portal/README.md | 117 +++++++++------ feasibility-portal/backend/.env.default | 46 +++--- feasibility-portal/backend/docker-compose.yml | 44 +++--- .../gui/deploy-config.json.default | 14 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-portal/gui/nginx.conf | 3 +- feasibility-portal/keycloak/.env.default | 3 +- .../keycloak/docker-compose.yml | 1 - feasibility-triangle/README.md | 29 ++-- .../aktin-client/.env.default | 4 +- .../aktin-client/docker-compose.yml | 5 +- feasibility-triangle/down-triangle.sh | 3 +- feasibility-triangle/flare/.env.default | 11 +- feasibility-triangle/flare/docker-compose.yml | 4 +- 17 files changed, 223 insertions(+), 202 deletions(-) rename auth/{cert.pem => cert.pem.example} (100%) rename auth/{key.pem => key.pem.example} (100%) diff --git a/Feasibility-Query.md b/Feasibility-Query.md index 08a17cc..c217912 100644 --- a/Feasibility-Query.md +++ b/Feasibility-Query.md @@ -88,66 +88,67 @@ A JSON schema of the ui ontology tree can be found here: -### Codex Code Tree +### Code Tree This file contains a code tree, which allows the query translators to resolve (find) all the children for a "code" (criterion) inside a vocabulary. This then allows the final search query to search not only for a particular criterion, but also search for all the respective children. Following the children element of the code tree would for example resolve I09 () to I09,I09.0,I09.1,I09.2,I09.8,I09.9 -A JSON schema of the Codex Code Tree can be found here: +A JSON schema of the code tree can be found here:
    - Codex Code Tree - Example Excerpt + Code Tree - Example Excerpt ```json { - "children": [ +"children": [ { - "children": [], - "termCode": { - "code": "I09.0", - "display": "Rheumatische Myokarditis", - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm" - } + "termCode": { + "code": "I09.2", + "display": "Chronische rheumatische Perikarditis", + "system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm", + "version": "2023" + } }, { - "children": [], - "termCode": { - "code": "I09.1", - "display": "Rheumatische Krankheiten des Endokards, Herzklappe nicht n\u00e4her bezeichnet", - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm" - } + "termCode": { + "code": "I09.9", + "display": "Rheumatische Herzkrankheit, nicht n\u00e4her bezeichnet", + "system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm", + "version": "2023" + } }, { - "children": [], - "termCode": { - "code": "I09.2", - "display": "Chronische rheumatische Perikarditis", - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm" - } + "termCode": { + "code": "I09.1", + "display": "Rheumatische Krankheiten des Endokards, Herzklappe nicht n\u00e4her bezeichnet", + "system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm", + "version": "2023" + } }, { - "children": [], - "termCode": { - "code": "I09.8", - "display": "Sonstige n\u00e4her bezeichnete rheumatische Herzkrankheiten", - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm" - } + "termCode": { + "code": "I09.0", + "display": "Rheumatische Myokarditis", + "system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm", + "version": "2023" + } }, { - "children": [], - "termCode": { - "code": "I09.9", - "display": "Rheumatische Herzkrankheit, nicht n\u00e4her bezeichnet", - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm" - } + "termCode": { + "code": "I09.8", + "display": "Sonstige n\u00e4her bezeichnete rheumatische Herzkrankheiten", + "system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm", + "version": "2023" + } } - ], - "termCode": { +], +"termCode": { "code": "I09", "display": "Sonstige rheumatische Herzkrankheiten", - "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm" - } + "system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm", + "version": "2023" +} } ```
    @@ -156,7 +157,7 @@ A JSON schema of the Codex Code Tree can be found here: @@ -174,17 +178,19 @@ A JSON schema of the Codex Code Tree can be found here: Term Code Mapping - Excerpt Laboratory Value ```json -{ - "fhirResourceType": "Observation", - "fixedCriteria": [], - "key": { - "code": "76769-9", - "display": "Hemoglobin [Mass/volume] in Venous blood by Oximetry", - "system": "http://loinc.org" - }, - "termCodeSearchParameter": "code", - "valueSearchParameter": "value-quantity" - } +{{ + "fhirResourceType": "Observation", + "key": { + "code": "76769-9", + "display": "Hemoglobin [Mass/volume] in Venous blood by Oximetry", + "system": "http://loinc.org" + }, + "termCodeSearchParameter": "code", + "timeRestrictionParameter": "date", + "timeRestrictionPath": "effective", + "valueFhirPath": "value", + "valueSearchParameter": "value-quantity" + } ``` @@ -193,28 +199,17 @@ A JSON schema of the Codex Code Tree can be found here: diff --git a/auth/cert.pem b/auth/cert.pem.example similarity index 100% rename from auth/cert.pem rename to auth/cert.pem.example diff --git a/auth/key.pem b/auth/key.pem.example similarity index 100% rename from auth/key.pem rename to auth/key.pem.example diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 55e5b8d..425077b 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -128,57 +128,78 @@ After a few moments you should see the results to your query in the **Number of | Env Var | Description | Default | Possible values | Component | |--------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|-----------------|-----------| +|### aktin config ###| | | | | | AKTIN_BROKER_LOG_LEVEL | Log level of the Aktin broker | INFO | | AKTIN | | AKTIN_ADMIN_PW | password for the web admin of the AKTIN broker Admin is accessible via: http://localhost:AKTIN_BROKER_HOST_AND_PORT/admin/html/index.html | changeme | | AKTIN | | AKTIN_BROKER_HOST_AND_PORT | Aktin broker Docker port | 127.0.0.1:8080 | | AKTIN | -| FEASIBILITY_BACKEND_DATASOURCE_HOST | backend database host | feasibility-gui-backend-db | | BACKEND | -| FEASIBILITY_BACKEND_DATASOURCE_PORT | backend database port | 5432 | | BACKEND | -| FEASIBILITY_BACKEND_DATASOURCE_USERNAME | backend database username | guidbuser | | BACKEND | -| FEASIBILITY_BACKEND_DATASOURCE_PASSWORD | backend database password | guidbpw | | BACKEND | -| FEASIBILITY_BACKEND_KEYCLOAK_ENABLED | whether or not keycloak is enabled for the backend | true | | BACKEND | -| KEYCLOAK_ALLOWED_ROLE | The keycloak role required to access the backend | FEASIBILITY_USER | | BACKEND | -|FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE|The keycloak role required to access the backend as Power user - Power users cannot be blacklisted|FEASIBILITY_POWER_USER||BACKEND| -|FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE|The keycloak role required to access the backend as admin|FEASIBILITY_ADMIN||BACKEND| -| FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL | the url the backend uses to access keycloak | http://keycloak:8080 | | BACKEND | -| FEASIBILITY_BACKEND_KEYCLOAK_REALM | the realm the backend uses within keyloak | codex-develop | | BACKEND | -| FEASIBILITY_BACKEND_KEYCLOAK_CLIENT_ID | the id of the keyloak client for the backend | feasibility-gui | | BACKEND | -| FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED | enables CQL translation | true | | BACKEND | -| FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED | enables FHIR Search translation. This is only required if a site has their own FLARE component it wishes to use | false | | BACKEND | -| FEASIBILITY_BACKEND_API_BASE_URL | the api url of the backend. If using an nginx this url should be the url of the nginx, which forwards to the backend | https://localhost/api/ | | BACKEND | -| FEASIBILITY_BACKEND_DIRECT_ENABLED | enables the direct broker. This connects the backend directly to flare and is only meant to be used for a local installation | false | | BACKEND | -| FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL | the url of the flare component the backend should connect to when using the direct broker | http://flare:8080 | | BACKEND | -| FEASIBILITY_BACKEND_ALLOWED_ORIGINS | base-url-of-your-local-feasibility-portal | https://localhost | | BACKEND | -| FEASIBILITY_BACKEND_AKTIN_ENABLED | enables the aktin broker | false | | BACKEND | -| FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL | aktin broker base url | http://aktin-broker:8080/broker/ | | BACKEND | -| FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY | aktin broker admin api key. The backend needs admin access as it requires permission to post new queries to the broker | xxxApiKeyAdmin123 | | BACKEND | -| FEASIBILITY_BACKEND_DSF_ENABLED | enables the dsf | false | | BACKEND | -| FEASIBILITY_BACKEND_DSF_CACERT | | /opt/codex-feasibility-security/ca.pem | | BACKEND | -| FEASIBILITY_BACKEND_DSF_DSF_SECURITY_KEYSTORE_P12FILE | | /opt/codex-feasibility-security/test-user.p12 | | BACKEND | -| FEASIBILITY_BACKEND_DSF_SECURITY_KEYSTORE_PASSWORD | | password | | BACKEND | -| FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL | | https://dsf-zars-fhir-proxy/fhir | | BACKEND | -| FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL | | wss://dsf-zars-fhir-proxy:443/fhir/ws | | BACKEND | -| FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID | | Test_ZARS | | BACKEND | -| FEASIBILITY_BACKEND_UI_PROFILES_PATH | path on host where the backend searches for the ui profiles | ../ontology/ui_profiles | | BACKEND | -| FEASIBILITY_BACKEND_CONCEPT_TREE_PATH | path on host where the backend looks for the code tree file | ../ontology/codex-code-tree.json | | BACKEND | -| FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH | path on host where the backend looks for the mapping file | ../ontology/codex-term-code-mapping.json | | BACKEND | -| FEASIBILITY_BACKEND_CERTS_PATH | | ../dsf-broker/certs | | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_AMOUNT|Set how many queries a user can send in a soft intervall minutes time|3||BACKEND| -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES|Set how many minutes time withini which user can sen soft create amount|1||BACKEND| -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT|Set how many queries a user can send in a hard intervall minutes time - if exceeed user will be blacklisted|50||BACKEND| -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES|Set how many minutes time withini which user can sen hard create amount - if exceeed user will be blacklisted|10080||BACKEND| -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS|Set polling interval for summary results - sum of results accross all connected sites|10||BACKEND| -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS|Set polling interval for detailed obfuscated results - detailed list of results per site - site name obfuscated|10||BACKEND| -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT|Set how often a user can view detailed obfuscated query results in DETAILEDOBFUSCATED_INTERVALSECONDS seconds|3||BACKEND| -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS|Set how many seconds time within which user can view detailed results DETAILEDOBFUSCATED_AMOUNT often|7200||BACKEND| -|FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS|Set results size which has to be exceeded for results to be shown|20||BACKEND| -|FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES|Set number of sites which have to be exceeded for results to be shown|3||BACKEND| -| FEASIBILITY_KEYCLOAK_DB | keycloak database host | keycloakdb | | KEYCLOAK | -| FEASIBILITY_KEYCLOAK_DB_USER | keycloak database username | keycloakdbuser | | KEYCLOAK | -| FEASIBILITY_KEYCLOAK_DB_PW | keycloak database password | keycloakdbpw | | KEYCLOAK | -| FEASIBILITY_KEYCLOAK_ADMIN_USER | keycloak admin username | admin | | KEYCLOAK | -| FEASIBILITY_KEYCLOAK_ADMIN_PW | keycloak admin password | adminpw | | KEYCLOAK | -| FEASIBILITY_KEYCLOAK_PROXY_ADDR_FORWARDING | enables proxy forwarding in keyloak, which is required if a proxy like nginx is used | true | | KEYCLOAK | -| FEASIBILITY_KEYCLOAK_BASE_URL | the base url used by keyloak. This has to be configured to the nginx url which forwards to keycloak if an nginx is used | https://localhost/auth | | KEYCLOAK | +|### backend db-config ###| | | | | +| FEASIBILITY_BACKEND_DATASOURCE_HOST | backend database host | feasibility-gui-backend-db | | BACKEND | +| FEASIBILITY_BACKEND_DATASOURCE_PORT | backend database port |5432| | BACKEND | +| FEASIBILITY_BACKEND_DATASOURCE_USERNAME | backend database username | guidbuser | | BACKEND | +| FEASIBILITY_BACKEND_DATASOURCE_PASSWORD | backend database password | guidbpw | | BACKEND | +|### backend keycloak ###||| | BACKEND | +| FEASIBILITY_BACKEND_KEYCLOAK_ENABLED | whether or not keycloak is enabled for the backend | true | | BACKEND | +|FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE| The keycloak role required to access the backend | FEASIBILITY_USER | | BACKEND | +|FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE|The keycloak role required to access the backend as Power user - Power users cannot be blacklisted|FEASIBILITY_POWER_USER| | BACKEND | +|FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE|The keycloak role required to access the backend as admin|FEASIBILITY_ADMIN| | BACKEND | +"|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER|the url the backend uses to access keycloak to verify the issuer| http://keycloak:8080| | BACKEND |" +"|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK|the url the backend uses to access keycloak for tokens| http://keycloak:8080| | BACKEND |" +| FEASIBILITY_BACKEND_KEYCLOAK_REALM | the realm the backend uses within keyloak | codex-develop | | BACKEND | +|### backend direct broker ###| | | | BACKEND | +|FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_ENABLED| enables the direct broker. This connects the backend directly to flare and is only meant to be used for a local installation | false | | BACKEND | +|FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_USE_CQL|tells the direct broker to use cql instead of flare for query execution | false | | BACKEND | +|FEASIBILITY_BACKEND_BROKER_CLIENT_OBFUSCATE_RESULT_COUNT|obfuscate results from the local broker| false | | BACKEND | +|FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL| the url of the flare component the backend should connect to when using the direct broker |http://flare:8080| | BACKEND | +|FEASIBILITY_BACKEND_CQL_SERVER_BASE_URL| the url of the fhir server the backend should connect to when using the direct broker |http://fhir-server:8080/fhir| | BACKEND | +|### backend Aktin broker ###| | | | BACKEND | +| FEASIBILITY_BACKEND_AKTIN_ENABLED | enables the aktin broker | false | | BACKEND | +| FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL | aktin broker base url | http://aktin-broker:8080/broker/ | | BACKEND | +| FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY | aktin broker admin api key. The backend needs admin access as it requires permission to post new queries to the broker | xxxApiKeyAdmin123 | | BACKEND | +|### backend DSF broker ###| | | | BACKEND | +| FEASIBILITY_BACKEND_DSF_ENABLED | enables the dsf | false | | BACKEND | +| FEASIBILITY_BACKEND_DSF_CACERT | | /opt/codex-feasibility-security/ca.pem | | BACKEND | +| FEASIBILITY_BACKEND_DSF_DSF_SECURITY_KEYSTORE_P12FILE | | /opt/codex-feasibility-security/test-user.p12 | | BACKEND | +| FEASIBILITY_BACKEND_DSF_SECURITY_KEYSTORE_PASSWORD | | password | | BACKEND | +| FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL | | https://dsf-zars-fhir-proxy/fhir | | BACKEND | +| FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL | | wss://dsf-zars-fhir-proxy:443/fhir/ws | | BACKEND | +| FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID | | Test_ZARS | | BACKEND | +|### backend privacy ###| | | | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_AMOUNT|Set how many queries a user can send in a soft intervall minutes time|3| | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES|Set how many minutes time withini which user can sen soft create amount|1| | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT|Set how many queries a user can send in a hard intervall minutes time - if exceeed user will be blacklisted|50| | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES|Set how many minutes time withini which user can sen hard create amount - if exceeed user will be blacklisted|10080| | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS|Set polling interval for summary results - sum of results accross all connected sites|10| | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS|Set polling interval for detailed obfuscated results - detailed list of results per site - site name obfuscated|10| | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT|Set how often a user can view detailed obfuscated query results in DETAILEDOBFUSCATED_INTERVALSECONDS seconds|3| | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS|Set how many seconds time within which user can view detailed results DETAILEDOBFUSCATED_AMOUNT often|7200| | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS|Set results size which has to be exceeded for results to be shown|20| | BACKEND | +|FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES|Set number of sites which have to be exceeded for results to be shown|3| | BACKEND | +|FEASIBILITY_BACKEND_CERTS_PATH |path to certificates| ../dsf-broker/certs | | BACKEND | +|FEASIBILITY_BACKEND_QUERYRESULT_EXPIRY_MINUTES|The time ist takes for query results to expire and be deleted|5| | BACKEND | +|### backend logging ###| | | | BACKEND | +|FEASIBILITY_BACKEND_LOG_LEVEL_SQL|log level of the backend for hibernate|info| | BACKEND | +|FEASIBILITY_BACKEND_LOG_LEVEL|log level of the backend|info| | BACKEND | +|### backend app ###| | | | BACKEND | +| FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED | enables CQL translation | true | | BACKEND | +| FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED | enables FHIR Search translation. This is only required if a site has their own FLARE component it wishes to use | false | | BACKEND | +| FEASIBILITY_BACKEND_API_BASE_URL | the api url of the backend. If using an nginx this url should be the url of the nginx, which forwards to the backend | https://localhost/api/ | | BACKEND | +| FEASIBILITY_BACKEND_ALLOWED_ORIGINS | base-url-of-your-local-feasibility-portal | https://localhost | | BACKEND | +| FEASIBILITY_BACKEND_UI_PROFILES_PATH | path on host where the backend searches for the ui profiles | ../ontology/ui_profiles | | BACKEND | +| FEASIBILITY_BACKEND_CONCEPT_TREE_PATH | path on host where the backend looks for the code tree file | ../ontology/codex-code-tree.json | | BACKEND | +| FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH | path on host where the backend looks for the mapping file | ../ontology/codex-term-code-mapping.json | | BACKEND | +|FEASIBILITY_BACKEND_MIGRATION_PATH| path on host where the backend looks for migration files |../ontology/migration/R_Load_latest_ui_profile.sql| | BACKEND | +|### keycloak ###||||| +|FEASIBILITY_KC_DB|keycloak db name |keycloakdb|| KEYCLOAK | +|FEASIBILITY_KC_DB_USER| keycloak database username |keycloakdbuser|| KEYCLOAK | +|FEASIBILITY_KC_DB_PW| keycloak database password |keycloakdbpw|| KEYCLOAK | +|FEASIBILITY_KC_ADMIN_USER| keycloak admin username |admin|| KEYCLOAK | +|FEASIBILITY_KC_ADMIN_PW| keycloak admin password |adminpw|| KEYCLOAK | +|FEASIBILITY_KC_HTTP_RELATIVE_PATH|the relative path keycloak is running under|/auth|| KEYCLOAK | +|FEASIBILITY_KC_HOSTNAME_URL|the url at which keycloak is exposed|https://localhost/auth|| KEYCLOAK | +|FEASIBILITY_KC_HOSTNAME_ADMIN_URL|the url of the admin console|https://localhost/auth/keycloakadmin|| KEYCLOAK | +|FEASIBILITY_KC_LOG_LEVEL|log level|info|| KEYCLOAK | +|FEASIBILITY_KC_PROXY|type of proxy in front of keycloak to use|edge|| KEYCLOAK | +|### additional dsf configs ###||||| | FEASIBILITY_DSF_BROKER_PROCESS_ORGANIZATION_IDENTIFIER | Identifier of this organization. | Test_ZARS | String | DSF | | FEASIBILITY_DSF_BROKER_PROCESS_FHIR_SERVER_BASE_URL | Base URL to a FHIR server or proxy for feasibility evaluation. This can also be the base URL of a reverse proxy if used. Only required if evaluation strategy is set to cql. | https://dsf-zars-fhir-proxy/fhir | URL | DSF | diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index 8167f93..a5aaafd 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -1,27 +1,32 @@ -FEASIBILITY_BACKEND_LOG_LEVEL=debug +# ----- app +FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=true +FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED=false +FEASIBILITY_BACKEND_API_BASE_URL=https://localhost/api/ +FEASIBILITY_BACKEND_ALLOWED_ORIGINS=https://localhost +# ---- db config FEASIBILITY_BACKEND_DATASOURCE_HOST=feasibility-gui-backend-db FEASIBILITY_BACKEND_DATASOURCE_PORT=5432 FEASIBILITY_BACKEND_DATASOURCE_USERNAME=guidbuser FEASIBILITY_BACKEND_DATASOURCE_PASSWORD=guidbpw +# ---- auth FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=true -FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FEASIBILITY_USER -FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE=FEASIBILITY_POWER_USER -FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE=FEASIBILITY_ADMIN -FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER=https://localhost/auth +FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FeasibilityUser +FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE=FeasibilityPowerUser +FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE=FeasibilityAdmin +FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER=http://auth:8080 FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK=http://auth:8080 FEASIBILITY_BACKEND_KEYCLOAK_REALM=feasibility -FEASIBILITY_BACKEND_QUERY_VALIDATION_ENABLED=true -FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED=false -FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED=false -FEASIBILITY_BACKEND_API_BASE_URL=https://localhost/api/ -FEASIBILITY_BACKEND_DIRECT_ENABLED=true +#---- Direct broker +FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_ENABLED=true +FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_USE_CQL=false +FEASIBILITY_BACKEND_BROKER_CLIENT_OBFUSCATE_RESULT_COUNT=false FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL=http://flare:8080 -FEASIBILITY_BACKEND_ALLOWED_ORIGINS=https://localhost -# ---- Aktin +FEASIBILITY_BACKEND_CQL_SERVER_BASE_URL=http://fhir-server:8080/fhir +# ---- Aktin broker FEASIBILITY_BACKEND_AKTIN_ENABLED=false FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL=http://aktin-broker:8080/broker/ FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY=xxxApiKeyAdmin123 -# ---- DSF +# ---- DSF broker FEASIBILITY_BACKEND_DSF_ENABLED=false FEASIBILITY_BACKEND_DSF_CACERT=/opt/codex-feasibility-security/ca.pem FEASIBILITY_BACKEND_DSF_DSF_SECURITY_KEYSTORE_P12FILE=/opt/codex-feasibility-security/test-user.p12 @@ -29,23 +34,20 @@ FEASIBILITY_BACKEND_DSF_SECURITY_KEYSTORE_PASSWORD=password FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL=https://dsf-zars-fhir-proxy/fhir FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL=wss://dsf-zars-fhir-proxy:443/fhir/ws FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID=Test_ZARS -FEASIBILITY_BACKEND_UI_PROFILES_PATH=../ontology/ui_profiles -FEASIBILITY_BACKEND_CONCEPT_TREE_PATH=../ontology/codex-code-tree.json -FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH=../ontology/codex-term-code-mapping.json -FEASIBILITY_BACKEND_MIGRATION_PATH=../ontology/migration/R__Load_latest_ui_profile.sql -FEASIBILITY_BACKEND_CERTS_PATH=../dsf-broker/certs # ---- privacy -FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_AMOUNT=3 -FEASIBILITY_BACKEND_PRIVACY_QUOTA_CREATE_INTERVALMINUTES=1 FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_AMOUNT=3 FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES=1 FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT=50 FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES=10080 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS=10 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS=10 -FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT=3 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT=10 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS=7200 -FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=20 +FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=50 FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=3 +FEASIBILITY_BACKEND_QUERYRESULT_EXPIRY_MINUTES=5 +# ---- logging +FEASIBILITY_BACKEND_LOG_LEVEL_SQL=info +FEASIBILITY_BACKEND_LOG_LEVEL=info diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 8dd5ac7..8493e0f 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,42 +1,50 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0-rc4 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: - feasibility-gui-backend-db environment: - LOG_LEVEL: ${FEASIBILITY_BACKEND_LOG_LEVEL:-warn} + # ----- app + QUERY_VALIDATION_ENABLED: ${FEASIBILITY_BACKEND_QUERY_VALIDATION_ENABLED:-true} + CQL_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED:-true} + FHIR_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED:-false} + API_BASE_URL: ${FEASIBILITY_BACKEND_API_BASE_URL:-https://localhost/api/} + ALLOWED_ORIGINS: ${FEASIBILITY_BACKEND_ALLOWED_ORIGINS:-https://localhost} + QUERYRESULT_EXPIRY_MINUTES: ${FEASIBILITY_BACKEND_QUERYRESULT_EXPIRY_MINUTES:-5} + # ---- db config FEASIBILITY_DATABASE_HOST: ${FEASIBILITY_BACKEND_DATASOURCE_HOST:-feasibility-gui-backend-db} FEASIBILITY_DATABASE_PORT: ${FEASIBILITY_BACKEND_DATASOURCE_PORT:-5432} FEASIBILITY_DATABASE_USER: ${FEASIBILITY_BACKEND_DATASOURCE_USERNAME:-guidbuser} FEASIBILITY_DATABASE_PASSWORD: ${FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-guidbpw} # ---- auth KEYCLOAK_ENABLED: ${FEASIBILITY_BACKEND_KEYCLOAK_ENABLED:-true} - KEYCLOAK_ALLOWED_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE:-FEASIBILITY_USER} - KEYCLOAK_POWER_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE:-FEASIBILITY_POWER_USER} - KEYCLOAK_ADMIN_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE:-FEASIBILITY_ADMIN} - KEYCLOAK_BASE_URL_ISSUER: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER:-http://keycloak:8080} + KEYCLOAK_ALLOWED_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE:-FeasibilityUser} + KEYCLOAK_POWER_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE:-FeasibilityPowerUser} + KEYCLOAK_ADMIN_ROLE: ${FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE:-FeasibilityAdmin} + KEYCLOAK_BASE_URL_ISSUER: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER:-http://auth:8080} KEYCLOAK_BASE_URL_JWK: ${FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK:-http://auth:8080} - KEYCLOAK_REALM: ${FEASIBILITY_BACKEND_KEYCLOAK_REALM:-codex-develop} - # ----- translation - QUERY_VALIDATION_ENABLED: ${FEASIBILITY_BACKEND_QUERY_VALIDATION_ENABLED:-true} - CQL_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED:-true} - FHIR_TRANSLATE_ENABLED: ${FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED:-false} - API_BASE_URL: ${FEASIBILITY_BACKEND_API_BASE_URL:-https://localhost/api/} - BROKER_CLIENT_DIRECT_ENABLED: ${FEASIBILITY_BACKEND_DIRECT_ENABLED:-false} + KEYCLOAK_REALM: ${FEASIBILITY_BACKEND_KEYCLOAK_REALM:-feasibility} + #---- Direct broker + BROKER_CLIENT_DIRECT_ENABLED: ${FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_ENABLED:-false} + BROKER_CLIENT_DIRECT_USE_CQL: ${FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_USE_CQL:-false} + BROKER_CLIENT_OBFUSCATE_RESULT_COUNT: ${FEASIBILITY_BACKEND_BROKER_CLIENT_OBFUSCATE_RESULT_COUNT:-false} FLARE_WEBSERVICE_BASE_URL: ${FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL:-http://flare:8080} - ALLOWED_ORIGINS: ${FEASIBILITY_BACKEND_ALLOWED_ORIGINS:-https://localhost} - # ---- Aktin + CQL_SERVER_BASE_URL: ${FEASIBILITY_BACKEND_CQL_SERVER_BASE_URL:-http://fhir-server:8080/fhir} + # ---- Aktin broker BROKER_CLIENT_AKTIN_ENABLED: ${FEASIBILITY_BACKEND_AKTIN_ENABLED:-false} AKTIN_BROKER_BASE_URL: ${FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL:-http://aktin-broker:8080/broker/} AKTIN_BROKER_API_KEY: ${FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY:-xxxApiKeyAdmin123} - # ---- DSF + # ---- DSF broker BROKER_CLIENT_DSF_ENABLED: ${FEASIBILITY_BACKEND_DSF_ENABLED:-false} DSF_SECURITY_CACERT: ${FEASIBILITY_BACKEND_DSF_CACERT:-/opt/codex-feasibility-security/ca.pem} DSF_SECURITY_KEYSTORE_P12FILE: ${FEASIBILITY_BACKEND_DSF_DSF_SECURITY_KEYSTORE_P12FILE:-/opt/codex-feasibility-security/test-user.p12} DSF_SECURITY_KEYSTORE_PASSWORD: ${FEASIBILITY_BACKEND_DSF_SECURITY_KEYSTORE_PASSWORD:-password} + DSF_PROXY_HOST: ${FEASIBILITY_BACKEND_DSF_PROXY_HOST} + DSF_PROXY_USERNAME: ${FEASIBILITY_BACKEND_DSF_PROXY_USERNAME} + DSF_PROXY_PASSWORD: ${FEASIBILITY_BACKEND_DSF_PROXY_PASSWORD} DSF_WEBSERVICE_BASE_URL: ${FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL:-https://dsf-zars-fhir-proxy/fhir} DSF_WEBSOCKET_URL: ${FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL:-wss://dsf-zars-fhir-proxy:443/fhir/ws} DSF_ORGANIZATION_ID: ${FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID:-Test_ZARS} @@ -51,7 +59,9 @@ services: PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS:-7200} PRIVACY_THRESHOLD_RESULTS: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS:-20} PRIVACY_THRESHOLD_SITES: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES:-3} - + # ---- logging + LOG_LEVEL_SQL: ${FEASIBILITY_BACKEND_LOG_LEVEL_SQL:-warn} + LOG_LEVEL: ${FEASIBILITY_BACKEND_LOG_LEVEL:-warn} restart: unless-stopped volumes: - ${FEASIBILITY_BACKEND_UI_PROFILES_PATH:-../ontology/ui_profiles}:/opt/codex-feasibility-backend/ontology/ui_profiles diff --git a/feasibility-portal/gui/deploy-config.json.default b/feasibility-portal/gui/deploy-config.json.default index b36f19c..4bb17ad 100644 --- a/feasibility-portal/gui/deploy-config.json.default +++ b/feasibility-portal/gui/deploy-config.json.default @@ -9,10 +9,10 @@ "baseUrl": "https://localhost/api/v2" }, "auth": { - "baseUrl": "https://localhost", + "baseUrl": "https://localhost/auth", "realm": "feasibility", - "clientId": "feasibility-gui", - "roles": ["FEASIBILITY_USER"] + "clientId": "feasibility-webapp", + "roles": ["FeasibilityUser"] }, "legal": { "version": "0.9.0", @@ -27,13 +27,13 @@ }, "extra": { "displayvaluefiltericon": false, - "showoptionspage": false, - "optionpageroles": ["FEASIBILITY_ADMIN"] + "showoptionspage": true, + "optionpageroles": ["FeasibilityAdmin"] } }, "options": { - "pollingtimeinseconds": 10, - "pollingintervallinseconds": 1, + "pollingtimeinseconds": 60, + "pollingintervallinseconds": 10, "lowerboundarypatientresult": 0, "lowerboundarylocationresult": 0 }, diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index bfa030a..1188634 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:0.4.0_rc6 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:1.0.0 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-portal/gui/nginx.conf b/feasibility-portal/gui/nginx.conf index a201cb8..d37a429 100644 --- a/feasibility-portal/gui/nginx.conf +++ b/feasibility-portal/gui/nginx.conf @@ -86,13 +86,12 @@ gzip_disable "MSIE [1-6]\."; proxy_busy_buffers_size 128k; proxy_buffer_size 64k; proxy_pass http://auth:8080/auth; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Real-IP $remote_addr; } - } } diff --git a/feasibility-portal/keycloak/.env.default b/feasibility-portal/keycloak/.env.default index 9d19a07..28a4fc0 100644 --- a/feasibility-portal/keycloak/.env.default +++ b/feasibility-portal/keycloak/.env.default @@ -7,4 +7,5 @@ FEASIBILITY_KC_HTTP_RELATIVE_PATH=/auth FEASIBILITY_KC_HOSTNAME_URL=https://localhost/auth FEASIBILITY_KC_HOSTNAME_ADMIN_URL=https://localhost/auth/keycloakadmin FEASIBILITY_KC_LOG_LEVEL=info -FEASIBILITY_KC_PROXY=edge \ No newline at end of file +FEASIBILITY_KC_PROXY=edge + diff --git a/feasibility-portal/keycloak/docker-compose.yml b/feasibility-portal/keycloak/docker-compose.yml index e5d2ffb..6f4725c 100644 --- a/feasibility-portal/keycloak/docker-compose.yml +++ b/feasibility-portal/keycloak/docker-compose.yml @@ -32,6 +32,5 @@ services: depends_on: - auth-db - volumes: feasibility-auth-db: diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index c6916f5..bb75637 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -109,7 +109,7 @@ execute `bash start-triangle.sh`. This starts the following default triangle: AKTIN (Middleware) - FLARE (FHIR Search executor) - BLAZE (FHIR Server) -- AKTIN: Used to connect to the central platform and allow queries from the Zars +- AKTIN: Used to connect to the central platform and allow queries from the FDPG - FLARE: A Rest Service, which is needed to translate, execute and evaluate a feasibility query on a FHIR Server using FHIR Search - BLAZE: The FHIR Server which holds the patient data for feasibility queries @@ -162,8 +162,6 @@ You can then load the data into your FHIR Server using the `upload-testdata.sh` | FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS || 10 | Integer (seconds) | AKTIN | | FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING || TRUE || AKTIN | | FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS | The timeout within which a process has to return before the client sends a "failed" message to the AKTIN broker | 60 | Integer (seconds) | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_PROCESS_COMMAND | The command to be executed on recieving a feasibility query. Allows one to switch between flare and cql execution | /opt/aktin/call-flare.sh | /opt/aktin/call-flare.sh, /opt/aktin/call-cql.sh | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_PROCESS_ARGS || 10 | Integer (seconds) | AKTIN | | FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS |configures how many parallel threads AKTIN will use to process requests simultaniously| 2 | Integer (number of threads) | AKTIN | | FEASIBILITY_AKTIN_FLARE_URL | the URL of the FLARE component if used | http://flare:8080/query/execute | URL | AKTIN | | FEASIBILITY_AKTIN_FLARE_USER | the basic auth user for flare if needed | | | AKTIN | @@ -189,10 +187,16 @@ You can then load the data into your FHIR Server using the `upload-testdata.sh` | FLARE_FHIR_USER | basic auth user to connect to FHIR server ||| FLARE | | FLARE_FHIR_PW | basic auth password to connect to FHIR server if CQL is used ||| FLARE | | FLARE_FHIR_PAGE_COUNT | The number of resources per page FLARE asks for from the FHIR server | 500 || FLARE | -| FLARE_EXEC_CORE_POOL_SIZE | The core thread pool size | 4 | Integer | FLARE | -| FLARE_EXEC_MAX_POOL_SIZE | The max thread pool size | 16 | Integer | FLARE | -| FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS | The time threads are kept alive | 10 | Integer | FLARE | -| FLARE_LOG_LEVEL | log level of flare | debug | off, fatal, error, warn, info, debug, trace | FLARE | +| Env Variable | Description | Default | Possible Values | Component | +| FLARE_FHIR_MAX_CONNECTIONS | maximum number of connections flare will open to fhir server simultaniously |32 | |FLARE | +| FLARE_CACHE_MEM_SIZE_MB | in memory cache size in mb | 1024| |FLARE | +| FLARE_CACHE_MEM_EXPIRE | in memory cache time to expire | PT48H| ISO 8601 time duration|FLARE | +| FLARE_CACHE_MEM_REFRESH | in memory chache time to refresh - not refresh should be shorter than expire| PT24H| ISO 8601 time duration|FLARE | +| FLARE_CACHE_DISK_THREADS | number of threads used to write to disk cache| 4| integer |FLARE | +| FLARE_CACHE_DISK_PATH | disk path for disk cache inside docker container | PT24H| string disk path|FLARE | +| FLARE_CACHE_DISK_EXPIRE | disk cache time to expire | P7D| ISO 8601 time duration|FLARE | +| FLARE_JAVA_TOOL_OPTIONS | java tool options passed to the flare container | -Xmx4g| |FLARE | +| FLARE_LOG_LEVEL | | info| off, fatal, error, warn, info, debug, trace |FLARE | | FEASIBILITY_TRIANGLE_REV_PROXY_PORT | The exposed docker port of the reverse proxy - set to 443 if you want to use standard https and you only have the feasibility triangle installed on your server | 444 | Integer (valid port) | REV Proxy | | FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_HOST | Forward proxy host. | | FQDN | DSF | | FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PORT | Forward proxy port. | | Integer | DSF | @@ -275,17 +279,12 @@ Log in to the portal and send a request with the Inclusion Criterion chosen from and press "send". Check your triangle aktin client logs: -`cat /opt/feasibility-deploy/feasibility-triangle/aktin-client/aktin-requests.log` +docker logs -f id-of-the-aktin-client-container you should see output similar to: ``` -##### INCOMING REQUEST at Thu Sep 8 11:49:08 UTC 2022 ##### -----BEGIN REQUEST---- -{"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"gender","system":"mii.abide","display":"Geschlecht"}],"attributeFilters":[{"type":"concept","selectedConcepts":[{"code":"female","system":"http://hl7.org/fhir/administrative-gender","display":"Female"},{"code":"male","system":"http://hl7.org/fhir/administrative-gender","display":"Male"}],"attributeCode":{"code":"gender","system":"mii.abide","display":"Geschlecht"}}]}]]} -----END REQUEST---- -----BEGIN RESPONSE---- -65 -----END RESPONSE---- +Mar 29, 2023 12:59:57 PM feasibility.FeasibilityExecution doExecution +FINE: {"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"718-7","system":"http://loinc.org","display":"Hämoglobin"}],"valueFilter":{"type":"quantity-comparator","selectedConcepts":[],"comparator":"gt","unit":{"code":"g/dL","display":"g/dL"},"value":0.0}}]]} ``` diff --git a/feasibility-triangle/aktin-client/.env.default b/feasibility-triangle/aktin-client/.env.default index 1162bb5..49b525a 100644 --- a/feasibility-triangle/aktin-client/.env.default +++ b/feasibility-triangle/aktin-client/.env.default @@ -20,5 +20,5 @@ FEASIBILITY_AKTIN_FLARE_PW= FEASIBILITY_AKTIN_HARD_RATE_LIMIT_NREQUESTS=300 FEASIBILITY_AKTIN_HARD_RATE_LIMIT_RESET_MINUTES=60 FEASIBILITY_AKTIN_OBFUSCATOR_EPSILON=0.28 -FEASIBILITY_AKTIN_LOG_LEVEL= -FEASIBILITY_AKTIN_LOG_LEVEL_FEASIBILITY= \ No newline at end of file +FEASIBILITY_AKTIN_LOG_LEVEL=INFO +FEASIBILITY_AKTIN_LOG_LEVEL_FEASIBILITY=FINE \ No newline at end of file diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 89e55cf..720dd95 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.5.0-RC2 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.5.0 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} @@ -12,10 +12,9 @@ services: CLIENT_WEBSOCKET_PING_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS:-60} CLIENT_WEBSOCKET_RECONNECT_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS:-10} CLIENT_WEBSOCKET_RECONNECT_POLLING: ${FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING:-true} + PROCESS_EXECUTOR_THREADS: ${FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS:-1} PROCESS_TIMEOUT_SECONDS: ${FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS:-60} - CLIENT_OBFUSCATE: ${FEASIBILITY_AKTIN_CLIENT_OBFUSCATE:-true} JAVA_OPTS: ${FEASIBILITY_AKTIN_JAVA_OPTS} - PROCESS_EXECUTOR_THREADS: ${FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS:-1} CQL_FHIR_BASE_URL: ${FEASIBILITY_AKTIN_CQL_FHIR_BASE_URL} CQL_FHIR_USER: ${FEASIBILITY_AKTIN_CQL_FHIR_USER} CQL_FHIR_PW: ${FEASIBILITY_AKTIN_CQL_FHIR_PW} diff --git a/feasibility-triangle/down-triangle.sh b/feasibility-triangle/down-triangle.sh index 51e7463..5e14964 100755 --- a/feasibility-triangle/down-triangle.sh +++ b/feasibility-triangle/down-triangle.sh @@ -5,7 +5,6 @@ BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-client/docker-compose.yml down docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/flare/docker-compose.yml down -docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/blaze-server/docker-compose.yml down -v -docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/hapi-fhir-server/docker-compose.yml down +docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/docker-compose.yml down -v docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/rev-proxy/docker-compose.yml down sh "$BASE_DIR"/dsf-client/down.sh "$COMPOSE_PROJECT" diff --git a/feasibility-triangle/flare/.env.default b/feasibility-triangle/flare/.env.default index 0ac6677..01f2227 100644 --- a/feasibility-triangle/flare/.env.default +++ b/feasibility-triangle/flare/.env.default @@ -1,17 +1,14 @@ FEASIBILITY_FLARE_PORT=127.0.0.1:8084 -FLARE_FHIR_SERVER_URL=http://fhir-server:8080/fhir/ +FLARE_FHIR_SERVER_URL=http://fhir-server:8080/fhir FLARE_FHIR_USER= FLARE_FHIR_PW= FLARE_FHIR_PAGE_COUNT=500 -FLARE_EXEC_CORE_POOL_SIZE=4 -FLARE_EXEC_MAX_POOL_SIZE=16 -FLARE_EXEC_KEEP_ALIVE_TIME_SECONDS=10 -FLARE_LOG_LEVEL=info +FLARE_FHIR_MAX_CONNECTIONS=32 FLARE_CACHE_MEM_SIZE_MB=1024 FLARE_CACHE_MEM_EXPIRE=PT48H FLARE_CACHE_MEM_REFRESH=PT24H FLARE_CACHE_DISK_THREADS=4 FLARE_CACHE_DISK_PATH=cache FLARE_CACHE_DISK_EXPIRE=P7D -FLARE_FHIR_MAXCONNECTIONS=32 -FLARE_JAVA_TOOL_OPTIONS=-Xmx4g \ No newline at end of file +FLARE_JAVA_TOOL_OPTIONS=-Xmx4g +FLARE_LOG_LEVEL=info diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index fa62ee4..de67a13 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -9,9 +9,8 @@ services: FLARE_FHIR_SERVER: ${FLARE_FHIR_SERVER_URL:-http://fhir-server:8080/fhir/} FLARE_FHIR_USER: ${FLARE_FHIR_USER:-} FLARE_FHIR_PASSWORD: ${FLARE_FHIR_PW:-} - FLARE_FHIR_MAXCONNECTIONS: ${FLARE_FHIR_MAXCONNECTIONS:-32} + FLARE_FHIR_MAX_CONNECTIONS: ${FLARE_FHIR_MAX_CONNECTIONS:-32} FLARE_FHIR_PAGE_COUNT: ${FLARE_FHIR_PAGE_COUNT:-500} - LOG_LEVEL: ${FLARE_LOG_LEVEL:-warn} FLARE_MAPPING_MAPPING_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json FLARE_MAPPING_CONCEPT_TREE_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json FLARE_CACHE_MEM_SIZE_MB: ${FLARE_CACHE_MEM_SIZE_MB:-1024} @@ -21,6 +20,7 @@ services: FLARE_CACHE_DISK_THREADS: ${FLARE_CACHE_DISK_THREADS:-4} FLARE_CACHE_DISK_EXPIRE: ${FLARE_CACHE_DISK_EXPIRE:-P7D} JAVA_TOOL_OPTIONS: ${FLARE_JAVA_TOOL_OPTIONS:--Xmx4g} + LOG_LEVEL: ${FLARE_LOG_LEVEL:-info} restart: unless-stopped volumes: - ${FLARE_LOCAL_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json From 6de9803b60b6144288862d7626231c9ee28516a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 17:03:46 +0200 Subject: [PATCH 085/118] fix path to db migration --- feasibility-portal/backend/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 8493e0f..edf17eb 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -67,7 +67,7 @@ services: - ${FEASIBILITY_BACKEND_UI_PROFILES_PATH:-../ontology/ui_profiles}:/opt/codex-feasibility-backend/ontology/ui_profiles - ${FEASIBILITY_BACKEND_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:/opt/codex-feasibility-backend/ontology/codex-code-tree.json - ${FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:/opt/codex-feasibility-backend/ontology/codex-term-code-mapping.json - - ${FEASIBILITY_BACKEND_MIGRATION_PATH:-../ontology/migration/R_Load_latest_ui_profile.sql}:/opt/codex-feasibility-backend/ontology/migration/R__Load_latest_ui_profile.sql + - ${FEASIBILITY_BACKEND_MIGRATION_PATH:-../ontology/migration/R__Load_latest_ui_profile.sql}:/opt/codex-feasibility-backend/ontology/migration/R__Load_latest_ui_profile.sql - ${FEASIBILITY_BACKEND_CERTS_PATH:-../dsf-broker/certs}:/opt/codex-feasibility-security feasibility-gui-backend-db: From 57ce23330d24c577a96d4d47aa03c0f1916865ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 17:23:15 +0200 Subject: [PATCH 086/118] remove old tests and adjust ci --- .github/workflows/ci.yml | 65 ---------------- test/README.md | 58 --------------- test/run_tests.sh | 157 --------------------------------------- 3 files changed, 280 deletions(-) delete mode 100644 test/README.md delete mode 100755 test/run_tests.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65640ba..3d73561 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,12 +10,6 @@ on: branches: - main -env: - TEST_DATA_REF: v0.2.0 - TEST_DATA_PATH: test/data-to-sq - AUTH_USERNAME: "codex-developer" - AUTH_PASSWORD: "codex" - jobs: lint: @@ -29,62 +23,3 @@ jobs: - name: Check shell scripts uses: ludeeus/action-shellcheck@master - test: - runs-on: ubuntu-latest - - needs: lint - - steps: - - name: Checkout Deploy Repo - uses: actions/checkout@v2 - - - name: Checkout Test Data Repo - uses: actions/checkout@v2 - with: - repository: num-codex/codex-testdata-to-sq - ref: ${{ env.TEST_DATA_REF }} - path: ${{ env.TEST_DATA_PATH }} - - - name: Cache Test Data - id: cache-test-data - uses: actions/cache@v2 - with: - path: ${{ env.TEST_DATA_PATH }}/testCases - key: testcases-${{ hashFiles('**/*.json') }} - - - name: Setup Python - if: steps.cache-test-data.outputs.cache-hit != 'true' - uses: actions/setup-python@v2 - - - name: Generate Test Data - if: steps.cache-test-data.outputs.cache-hit != 'true' - working-directory: ${{ env.TEST_DATA_PATH }} - run: python main.py - - - name: Setup Base Auth - run: bash feasibility-portal/setup-base-auth.sh "${{ env.AUTH_USERNAME }}" "${{ env.AUTH_PASSWORD }}" - - - name: Build the stack - env: - CODEX_DSF_DIC_FHIR_APP_JVM_ARGS: -Xmx1g - CODEX_DSF_DIC_BPE_APP_JVM_ARGS: -Xmx500m - CODEX_DSF_ZARS_FHIR_APP_JVM_ARGS: -Xmx1g - CODEX_DSF_ZARS_BPE_APP_JVM_ARGS: -Xmx500m - CODEX_FEASIBILITY_BACKEND_API_BASE_URL: http://localhost:8091/api/ - run: ./start-zars-and-num-node.sh --disable-result-obfuscation - - - name: Wait for FHIR Server Running - uses: ifaxity/wait-on-action@v1 - with: - resource: http://localhost:8081/health - timeout: 60000 - - - name: Initialize Test Data - run: bash num-node/init-testdata.sh - - - name: Run tests - env: - TERM: "xterm" - QUERY_ENDPOINT_URL: "http://localhost:8091/api/v1/query-handler/run-query" - AUTH_TOKEN_REQUEST_URL: "https://localhost:8443/auth/realms/codex-develop/protocol/openid-connect/token" - run: test/run_tests.sh diff --git a/test/README.md b/test/README.md deleted file mode 100644 index 2e12b10..0000000 --- a/test/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Running Test Queries -For running test queries against a running test deployment of the codex project the script `test/run_tests.sh` can be used for automatic test execution. In order to have predictable results the components NUM node and ZARS need to be started and ready, the NUM node needs to be initialized with test patient data and test cases needs to be cloned to a local directory containing specific search queries which all should result in the total number of patients of 1. These queries are sent to the ZARS and the response is checked to contain a result of 1. - -## Prerequisites -The following software needs to be installed to run the automatic test script: - -* bash -* curl -* jq - -For the [complete setup and test script execution](#complete-setup-and-test-script-execution) additional software is needed: - -* docker -* docker-compose -* git -* python - -## Set Environment -The following environment variables need to be set to run the automatic test script: - -* `TEST_DATA_PATH`, path to the folder containing the cloned test cases project -* `QUERY_ENDPOINT_URL`, url of the query endpoint for sending search queries -* `AUTH_TOKEN_REQUEST_URL`, url of the access token provider endpoint -* `AUTH_USERNAME`, username of the user permitted to send queries -* `AUTH_PASSWORD`, password of the user permitted to send queries - -## Complete Setup and Test Script Execution -You can use the following shell script to setup both the NUM node and the ZARS component with all test patient data as well as running the automatic test script. This assumes that all of the software listed in section [Prerequisites](#prerequisites) is installed and a write and read accessible directory `/tmp` exists: - -``` -export TEST_DATA_PATH=/tmp/codex-testdata -export QUERY_ENDPOINT_URL="http://localhost:8091/api/v1/query-handler/run-query" -export AUTH_TOKEN_REQUEST_URL="https://localhost:8443/auth/realms/codex-develop/protocol/openid-connect/token" -export AUTH_USERNAME=codex-developer -export AUTH_PASSWORD=codex -git clone --single-branch --branch main https://github.com/num-codex/codex-deploy.git /tmp/codex-deploy -git clone --single-branch --branch v0.2.0 https://github.com/num-codex/codex-testdata-to-sq.git $TEST_DATA_PATH -/tmp/codex-deploy/setup-all-base-auth.sh codex-developer $AUTH_PASSWORD -/tmp/codex-deploy/start-zars-and-num-node.sh --disable-result-obfuscation -(cd $TEST_DATA_PATH; python main.py) -until docker exec -it fhir-server curl -s --fail 'http://localhost:8080/health'; do - sleep 1; -done -/tmp/codex-deploy/num-node/init-testdata.sh -/tmp/codex-deploy/test/run_tests.sh -``` - -The script starts the components with their default services. You can change the services to be used by editing the line - -``` -/tmp/codex-deploy/start-zars-and-num-node.sh --disable-result-obfuscation -``` - -and add the desired arguments. To find out about the available arguments and their values run the main startup script in the root directory of this git repository with the help flag (`-h`): - -``` -./start-zars-and-num-node.sh -h -``` diff --git a/test/run_tests.sh b/test/run_tests.sh deleted file mode 100755 index b45b962..0000000 --- a/test/run_tests.sh +++ /dev/null @@ -1,157 +0,0 @@ -#!/bin/bash -set -o pipefail - -RED=$(tput setaf 1) -YELLOW=$(tput setaf 3) -GREEN=$(tput setaf 2) -BOLD=$(tput bold) -UNDERLINE=$(tput smul) -RESET=$(tput sgr 0) - -check_ignored() { - for ignored in $ignored_files; do - if [ "$1" == "$ignored" ]; then - return 0 - fi - done - return 1 -} - -print_info() { - echo -n " ${UNDERLINE}$1${RESET}: " - echo "$2" -} - -print_success() { - echo "$GREEN SUCCESS$RESET" - while ! { [[ -z "$1" ]] || [[ -z "$2" ]]; }; do - print_info "$1" "$2" - shift 2 - done -} - -print_fail() { - echo "$RED FAILURE $RESET" - while ! { [[ -z "$1" ]] || [[ -z "$2" ]]; }; do - print_info "$1" "$2" - shift 2 - done - case_fail=$((case_fail+1)) -} - -for e in "AUTH_TOKEN_REQUEST_URL" "AUTH_USERNAME" "AUTH_PASSWORD" "QUERY_ENDPOINT_URL" "TEST_DATA_PATH"; do - missing=false - if [ -z "${!e}" ]; then - echo "${RED}Required environment variable '$e' missing!${RESET}" - missing=true - fi -done - -if $missing; then - exit 1 -fi - -mapfile -t files < <(ls "$TEST_DATA_PATH"/testCases/*.json) -ignored_files=$(cat "$TEST_DATA_PATH"/testCaseIgnoreList.txt) -case_total="${#files[@]}" -case_execute=0 -case_fail=0 -case_ignore=0 -pad=${#case_total} -delay=${TEST_RETRY_DELAY:-2} -i=0 - -for f in "${files[@]}"; do - filename="$(basename "$f")" - title="$(echo "$filename" | sed -r 's/\.json//')" - if check_ignored "$filename"; then - continue - fi - case_execute=$((case_execute+1)) -done - -for f in "${files[@]}"; do - filename="$(basename "$f")" - title="$(echo "$filename" | sed -r 's/\.json//')" - - if check_ignored "$filename"; then - case_ignore=$((case_ignore+1)) - continue - fi - - i=$((i+1)) - - echo "" - printf "${BOLD}[%${pad}s/%d] Running Test Case:$RESET %s\n" "$i" "$case_execute" "$title" - echo -n " Sending Query " - auth_token="$(curl -ksS --location --request POST "$AUTH_TOKEN_REQUEST_URL" \ - --header 'Content-Type: application/x-www-form-urlencoded' \ - --data-urlencode 'grant_type=password' \ - --data-urlencode "username=$AUTH_USERNAME" \ - --data-urlencode "password=$AUTH_PASSWORD" \ - --data-urlencode 'client_id=feasibility-gui' 2>&1)" - if ! jq -ne --argjson auth "$auth_token" '$auth | .access_token != null' 1> /dev/null 2>&1; then - print_fail "Error" "${RED}Response to access token request does not conform to expected format${RESET}" "Response" "$auth_token" - continue - fi - auth_token="$(jq -rn --argjson auth "$auth_token" '$auth | .access_token')" - result_location="$(curl -ksS --location --request POST\ - --header 'Content-Type: application/json' \ - --header 'Accept: application/json' \ - --header "Authorization: Bearer $auth_token" \ - --data "@$f" \ - "$QUERY_ENDPOINT_URL")" - if ! jq -ne --argjson result "$result_location" '$result | .location != null' 1> /dev/null 2>&1; then - print_fail "Error" "${RED}Query response does not conform to expected format${RESET}" "Query File" "$f" "Response" "$result_location" - continue - fi - result_location="$(jq -rn --argjson result "$result_location" '$result | .location')" - print_success "Send Query" "Success" - - echo -n " Retrieving Result " - retries=${TEST_RETRY_COUNT:-5} - failed=true - while [ "$retries" -gt 0 ]; do - result="$(curl -ksS --location \ - --header "Authorization: Bearer $auth_token" \ - --header 'Accept: application/json' \ - "$result_location")" - if ! jq -ne --argjson result "$result" '$result | .resultLines != null' 1> /dev/null 2>&1; then - print_fail "Error" "${RED}Result response does not conform to expected format${RESET}" "Response" "$result" - continue - fi - if jq -ne --argjson result "$result" '$result | .resultLines | length > 0' 1> /dev/null 2>&1; then - failed=false - break - fi - sleep "$delay" - retries=$((retries-1)) - done - - if $failed; then - print_fail "Error" "${RED}Result response contains empty resultLines${RESET}" "Result Location" "$result_location" "Response" "$result" - continue - fi - - if ! jq -ne --argjson result "$result" '$result | .totalNumberOfPatients == 1' 1> /dev/null 2>&1; then - print_fail "Expected Result" "1" "Actual Result" "$(jq -n --argjson result "$result" '$result | .totalNumberOfPatients')" - continue - else - print_success "Query Result" "Success" - fi -done - -echo "" -echo "${BOLD}Test Summary:${RESET}" -echo " ${UNDERLINE}Total${RESET}: $case_total" -printf " ${UNDERLINE}Ignored${RESET}: ${YELLOW}%${pad}s${RESET}\n" "$case_ignore" -printf " ${UNDERLINE}Executed${RESET}: %${pad}s\n" "$case_execute" -printf " ${UNDERLINE}Succeeded${RESET}: ${GREEN}%${pad}s${RESET}\n" "$((case_execute-case_fail))" -echo -n " ${UNDERLINE}Failed${RESET}: " -if [ $case_fail -gt 0 ]; then - printf "${RED}%${pad}s${RESET}\n" "$case_fail" - exit 1 -else - printf "${GREEN}%${pad}s${RESET}\n" "0" - exit 0 -fi From 9e377eed671af3115800195b2eaff89462113920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 17:42:06 +0200 Subject: [PATCH 087/118] remove dsf from deployment --- feasibility-portal/backend/docker-compose.yml | 2 +- feasibility-portal/dsf-broker/.env.default | 4 - .../dsf-broker/bpe/app/last_event/.gitkeep | 0 .../dsf-broker/bpe/cache/.gitkeep | 0 feasibility-portal/dsf-broker/certs/ca.pem | 29 -- .../dsf-broker/docker-compose.yml | 195 ------------- feasibility-portal/dsf-broker/down.sh | 8 - .../dsf-broker/fhir/app/conf/bundle.xml | 262 ------------------ .../dsf-broker/proxy/nginx.conf | 59 ---- feasibility-portal/dsf-broker/start.sh | 26 -- feasibility-portal/dsf-broker/stop.sh | 8 - feasibility-triangle/dsf-client/.env.default | 9 - .../dsf-client/bpe/app/last_event/.gitkeep | 0 .../dsf-client/bpe/cache/.gitkeep | 0 .../dsf-client/docker-compose.yml | 221 --------------- feasibility-triangle/dsf-client/down.sh | 8 - .../dsf-client/fhir/app/conf/bundle.xml | 262 ------------------ .../dsf-client/proxy/nginx.conf | 56 ---- feasibility-triangle/dsf-client/start.sh | 26 -- feasibility-triangle/dsf-client/stop.sh | 8 - ...lient_certificate_private_key.pem.password | 1 - secrets/app_client_trust_certificates.pem | 29 -- secrets/app_dic_1_client_certificate.pem | 30 -- ...p_dic_1_client_certificate_private_key.pem | 55 ---- secrets/app_zars_client_certificate.pem | 30 -- ...pp_zars_client_certificate_private_key.pem | 55 ---- secrets/db_dic_1_bpe_user.password | 1 - secrets/db_dic_1_bpe_user_camunda.password | 1 - secrets/db_fhir_dic_1_user.password | 1 - ..._fhir_dic_1_user_permanent_delete.password | 1 - secrets/db_fhir_zars_user.password | 1 - ...b_fhir_zars_user_permanent_delete.password | 1 - secrets/db_liquibase.password | 1 - secrets/db_zars_bpe_user.password | 1 - secrets/db_zars_bpe_user_camunda.password | 1 - secrets/proxy_certificate_and_int_cas.pem | 63 ----- secrets/proxy_certificate_private_key.pem | 52 ---- secrets/proxy_trusted_client_cas.pem | 29 -- .../certs => secrets}/test-user.p12 | Bin util/certs/Dockerfile | 7 - util/certs/add_cert_to_truststore.sh | 25 -- ...create_trust_store_with_additional_cert.sh | 9 - util/certs/trust_store_output/.gitkeep | 0 util/certs/your_certs/.gitkeep | 0 util/checks/dsf-check.sh | 255 ----------------- 45 files changed, 1 insertion(+), 1831 deletions(-) delete mode 100644 feasibility-portal/dsf-broker/.env.default delete mode 100644 feasibility-portal/dsf-broker/bpe/app/last_event/.gitkeep delete mode 100644 feasibility-portal/dsf-broker/bpe/cache/.gitkeep delete mode 100644 feasibility-portal/dsf-broker/certs/ca.pem delete mode 100644 feasibility-portal/dsf-broker/docker-compose.yml delete mode 100755 feasibility-portal/dsf-broker/down.sh delete mode 100644 feasibility-portal/dsf-broker/fhir/app/conf/bundle.xml delete mode 100644 feasibility-portal/dsf-broker/proxy/nginx.conf delete mode 100755 feasibility-portal/dsf-broker/start.sh delete mode 100755 feasibility-portal/dsf-broker/stop.sh delete mode 100644 feasibility-triangle/dsf-client/.env.default delete mode 100644 feasibility-triangle/dsf-client/bpe/app/last_event/.gitkeep delete mode 100644 feasibility-triangle/dsf-client/bpe/cache/.gitkeep delete mode 100644 feasibility-triangle/dsf-client/docker-compose.yml delete mode 100755 feasibility-triangle/dsf-client/down.sh delete mode 100644 feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml delete mode 100644 feasibility-triangle/dsf-client/proxy/nginx.conf delete mode 100755 feasibility-triangle/dsf-client/start.sh delete mode 100755 feasibility-triangle/dsf-client/stop.sh delete mode 100644 secrets/app_client_certificate_private_key.pem.password delete mode 100644 secrets/app_client_trust_certificates.pem delete mode 100644 secrets/app_dic_1_client_certificate.pem delete mode 100644 secrets/app_dic_1_client_certificate_private_key.pem delete mode 100644 secrets/app_zars_client_certificate.pem delete mode 100644 secrets/app_zars_client_certificate_private_key.pem delete mode 100644 secrets/db_dic_1_bpe_user.password delete mode 100644 secrets/db_dic_1_bpe_user_camunda.password delete mode 100644 secrets/db_fhir_dic_1_user.password delete mode 100644 secrets/db_fhir_dic_1_user_permanent_delete.password delete mode 100644 secrets/db_fhir_zars_user.password delete mode 100644 secrets/db_fhir_zars_user_permanent_delete.password delete mode 100644 secrets/db_liquibase.password delete mode 100644 secrets/db_zars_bpe_user.password delete mode 100644 secrets/db_zars_bpe_user_camunda.password delete mode 100644 secrets/proxy_certificate_and_int_cas.pem delete mode 100644 secrets/proxy_certificate_private_key.pem delete mode 100644 secrets/proxy_trusted_client_cas.pem rename {feasibility-portal/dsf-broker/certs => secrets}/test-user.p12 (100%) delete mode 100644 util/certs/Dockerfile delete mode 100755 util/certs/add_cert_to_truststore.sh delete mode 100755 util/certs/create_trust_store_with_additional_cert.sh delete mode 100644 util/certs/trust_store_output/.gitkeep delete mode 100644 util/certs/your_certs/.gitkeep delete mode 100755 util/checks/dsf-check.sh diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index edf17eb..a38d56b 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -68,7 +68,7 @@ services: - ${FEASIBILITY_BACKEND_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:/opt/codex-feasibility-backend/ontology/codex-code-tree.json - ${FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:/opt/codex-feasibility-backend/ontology/codex-term-code-mapping.json - ${FEASIBILITY_BACKEND_MIGRATION_PATH:-../ontology/migration/R__Load_latest_ui_profile.sql}:/opt/codex-feasibility-backend/ontology/migration/R__Load_latest_ui_profile.sql - - ${FEASIBILITY_BACKEND_CERTS_PATH:-../dsf-broker/certs}:/opt/codex-feasibility-security + - ${FEASIBILITY_BACKEND_CERTS_PATH:-../secrets}:/opt/codex-feasibility-security feasibility-gui-backend-db: image: 'postgres:13.1-alpine' diff --git a/feasibility-portal/dsf-broker/.env.default b/feasibility-portal/dsf-broker/.env.default deleted file mode 100644 index 3c2330a..0000000 --- a/feasibility-portal/dsf-broker/.env.default +++ /dev/null @@ -1,4 +0,0 @@ -FEASIBILITY_DSF_BROKER_PROCESS_USER_THUMBPRINTS=d134d0ba1c925703ab2ed3b7a243bd95934e313337640c98399d703d423707a5c6635cf884f4b240b2bc6634a0e770f0d565410016b71ce237c1952118f9295d,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202 -FEASIBILITY_DSF_BROKER_PROCESS_THUMBPRINTS_PERMANENT_DELETE=d134d0ba1c925703ab2ed3b7a243bd95934e313337640c98399d703d423707a5c6635cf884f4b240b2bc6634a0e770f0d565410016b71ce237c1952118f9295d,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202 -FEASIBILITY_DSF_BROKER_PROCESS_ORGANIZATION_IDENTIFIER=Test_ZARS -FEASIBILITY_DSF_BROKER_PROCESS_FHIR_SERVER_BASE_URL=https://dsf-zars-fhir-proxy/fhir diff --git a/feasibility-portal/dsf-broker/bpe/app/last_event/.gitkeep b/feasibility-portal/dsf-broker/bpe/app/last_event/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/feasibility-portal/dsf-broker/bpe/cache/.gitkeep b/feasibility-portal/dsf-broker/bpe/cache/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/feasibility-portal/dsf-broker/certs/ca.pem b/feasibility-portal/dsf-broker/certs/ca.pem deleted file mode 100644 index a5f16f3..0000000 --- a/feasibility-portal/dsf-broker/certs/ca.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/TCCAuWgAwIBAgIGAX0zqQXAMA0GCSqGSIb3DQEBDQUAMBwxCzAJBgNVBAYT -AkRFMQ0wCwYDVQQDDARUZXN0MB4XDTIxMTExODE1MjczNFoXDTMxMTExODE1Mjcz -NFowHDELMAkGA1UEBhMCREUxDTALBgNVBAMMBFRlc3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCEcTJ8fEGvYVH05Us0COJWx+Frde4m83+uM4knLZOT -BeCcsLck8ImYOsmGnuCeE2s/NXYup0amBCnTm8N+02qlBGsTBVtbA9Q4KagvvMt+ -RzBA+XiNKzddj5+86e88Pb6vZpIHzAZTczJx9suX1sVwdhUnItJ9H4vW2NboD6GS -HUI8jkqxo2/GgsJ8EDZ2gHqueDNUfSh0hLM9OOCFPMz4frZ2X0THxq4RExWiLxap -wibzTQSUlJoawicaqNnDVNkTXxAWIVp8ZQLt2ftQI1ejsSvHp3o25Yq/g0QHWUzl -dtdNRCCWZiCn6pDZEnjEFitMgI16lEGQk9/+7EFANmu26Zzcz9mesAPlrW3f3cBP -a5OWzKATjjS+6FmBO/rclSbRwpzYYf3ZNprWHH1CXFD75My4+bpdJMgIJHMw4UKe -EOAQ8gPnQymnhDHWf6CnFF4GF5iTOmhPcgY/KNFHQKetK3Ahr3+hNEvWc6gF5keu -lyX/LKqbU1UBS6nCbkC07QRs6nUu9EWvA6MkG2fsX4IzxI5zzzm8in6lDpbZKJpG -GN4gyloSn5W07jpxCLQOx511rgDE/giqOclcClquwC1kMVw6OOVkVAsoO617SlPv -g7BEW9kQOpw+b2N+rm2PzaGzGaIpEzaHsGlGpBEY0OxJUQLfMjC9zwI3Mrjp6T1O -lwIDAQABo0UwQzAdBgNVHQ4EFgQU63O2Ad7qkE/GOId7P60sa6ge7ycwEgYDVR0T -AQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIB -ACYMVsFoJcr/by6J/D7sDZjeJF++LMc6wERy2cwOpl+pOfzbkzOqbysGZq37Z136 -bxtufzJiSRvNbyxtCfbJkMA2/RcAdXrCPyUziMgMqj1eVdJ3proVzRGRs5DNLGNB -rmvGLWxqbdWAX86AoLmYbwddM9dpF5ZVliv7vh37I6Y4To3G5SHgmRm6wk0FgA3w -27+Kj/BKpn83wZHOBA6Dld6TDDjMxl7aQUd3kcTsWp/V1sBC0m+YZJW9U7SqsMAx -3hJOuF7uMEuTTtQkWs6yzGchTi/SFJolC8vvq7SgMSCH5Qt3ySZixtp01O53O7oG -7Iywdj2kN8qwI4+yLGm+dqzkChgPqjR3DIyOFQZvYlSRgglaKU2jSipoQneg/3Wu -JE1AjciSR8lblSLFJildLejVEWJ3chrPeeKwFu0lGBQRCgcIqlnexz7mSEriKZSw -EEp36WoO9eGZ45fbJdCEnQb+Ic7hrA1Ll3C1+GsWhZ9DDCr2VhHvZ5T9khGcpG+D -3Muq869YPMq0vpuZRUmyq/6mUGpZ5E7m5d1sgFghIqywl3ZJK+qkTXu1qa6mC2gq -8Eodnd0zTtyTlr/zBZgeCypNVG9dmAIZYqNulubGkFQkK5WD6UXrWFHqT/Z8bQ5a -V8XcC/3nBZa5g8OziVi03YkUpCunaYFJyyMg8UbZBW4q ------END CERTIFICATE----- diff --git a/feasibility-portal/dsf-broker/docker-compose.yml b/feasibility-portal/dsf-broker/docker-compose.yml deleted file mode 100644 index 3937d13..0000000 --- a/feasibility-portal/dsf-broker/docker-compose.yml +++ /dev/null @@ -1,195 +0,0 @@ -version: '3.7' - -services: - - # ---- Proxy ---------------------------------------------------------------- - dsf-zars-fhir-proxy: - image: nginx:1.21 - restart: on-failure - ports: - - "127.0.0.1:445:443" - secrets: - - proxy_certificate_and_int_cas.pem - - proxy_certificate_private_key.pem - - proxy_trusted_client_cas.pem - volumes: - - type: bind - source: ./proxy/nginx.conf - target: /etc/nginx/nginx.conf - read_only: true - environment: - TZ: Europe/Berlin - depends_on: - - dsf-zars-fhir-app - - dsf-zars-fhir-app: - image: ghcr.io/highmed/fhir:0.7.0 - restart: on-failure - healthcheck: - test: [ "CMD", "java", "-cp", "dsf_fhir.jar", "org.highmed.dsf.fhir.StatusClient" ] - interval: 10s - timeout: 15s - retries: 5 - ports: - - "127.0.0.1:11345:8080" - volumes: - - type: bind - source: ./fhir/app/conf/bundle.xml - target: /opt/fhir/conf/bundle.xml - secrets: - - db_liquibase.password - - db_fhir_zars_user.password - - db_fhir_zars_user_permanent_delete.password - - app_client_trust_certificates.pem - - app_zars_client_certificate.pem - - app_zars_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - environment: - ORG_HIGHMED_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PASSWORD_FILE: /run/secrets/db_fhir_zars_user.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE: /run/secrets/db_fhir_zars_user_permanent_delete.password - ORG_HIGHMED_DSF_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_zars_client_certificate.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_zars_client_certificate_private_key.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_FHIR_DB_URL: jdbc:postgresql://dsf-zars-fhir-db/fhir - ORG_HIGHMED_DSF_FHIR_DB_USER_GROUP: zars_fhir_users - ORG_HIGHMED_DSF_FHIR_DB_USER_USERNAME: zars_fhir_server_user - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP: zars_fhir_permanent_delete_users - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME: zars_fhir_server_permanent_delete_user - ORG_HIGHMED_DSF_FHIR_SERVER_BASE_URL: ${FEASIBILITY_DSF_BROKER_PROCESS_FHIR_SERVER_BASE_URL} - ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: ${FEASIBILITY_DSF_BROKER_PROCESS_ORGANIZATION_IDENTIFIER} - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS: ${FEASIBILITY_DSF_BROKER_PROCESS_USER_THUMBPRINTS} - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE: ${FEASIBILITY_DSF_BROKER_PROCESS_USER_THUMBPRINTS_PERMANENT_DELETE} - EXTRA_JVM_ARGS: ${CODEX_DSF_ZARS_FHIR_APP_JVM_ARGS} - TZ: Europe/Berlin - #CORS_ORIGINS: "http://zars-feasibility-gui-backend" - # ORGANIZATION_TYPE: "MeDIC" - needs to be put into the fhir resource organisation - depends_on: - - dsf-zars-fhir-db - - dsf-zars-fhir-db: - image: postgres:13 - restart: on-failure - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U liquibase_user -d fhir" ] - interval: 10s - timeout: 5s - retries: 5 - environment: - POSTGRES_PASSWORD_FILE: /run/secrets/db_liquibase.password - POSTGRES_USER: liquibase_user - POSTGRES_DB: fhir - volumes: - - type: volume - source: dsf-zars-fhir-db-data - target: /var/lib/postgresql/data - secrets: - - db_liquibase.password - - # ZARS BPE ------------------------------------------------------------------ - dsf-zars-bpe-app: - image: ghcr.io/highmed/bpe:0.7.0 - restart: on-failure - healthcheck: - test: [ "CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient" ] - interval: 10s - timeout: 15s - retries: 5 - volumes: - - type: bind - source: ../../assets/feasibility-dsf-process-0.3.0.jar - target: /opt/bpe/process/feasibility-dsf-process-0.3.0.jar - read_only: true - - type: bind - source: ./bpe/app/last_event - target: /opt/bpe/last_event - - type: bind - source: ./bpe/cache - target: /opt/bpe/cache - - type: bind - source: ../../assets/hapi-fhir-client-5.1.0.jar - target: /opt/bpe/plugin/hapi-fhir-client-5.1.0.jar - secrets: - - db_liquibase.password - - db_zars_bpe_user.password - - db_zars_bpe_user_camunda.password - - app_client_trust_certificates.pem - - app_zars_client_certificate.pem - - app_zars_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - environment: - ORG_HIGHMED_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_BPE_DB_USER_PASSWORD_FILE: /run/secrets/db_zars_bpe_user.password - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE: /run/secrets/db_zars_bpe_user_camunda.password - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_zars_client_certificate.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_zars_client_certificate_private_key.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_BPE_DB_URL: jdbc:postgresql://dsf-zars-bpe-db/bpe - ORG_HIGHMED_DSF_BPE_DB_USER_GROUP: zars_bpe_users - ORG_HIGHMED_DSF_BPE_DB_USER_USERNAME: zars_bpe_server_user - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_GROUP: zars_camunda_users - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_USERNAME: zars_camunda_server_user - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: ${FEASIBILITY_DSF_BROKER_PROCESS_ORGANIZATION_IDENTIFIER} - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: ${FEASIBILITY_DSF_BROKER_PROCESS_FHIR_SERVER_BASE_URL} - EXTRA_JVM_ARGS: ${CODEX_DSF_ZARS_BPE_APP_JVM_ARGS} - TZ: "Europe/Berlin" - # WEBSOCKET_URL: "wss://dsf-zars-fhir-proxy/fhir/ws" - depends_on: - - dsf-zars-bpe-db - - dsf-zars-fhir-proxy - - dsf-zars-bpe-db: - image: postgres:13 - restart: on-failure - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U liquibase_user -d bpe" ] - interval: 10s - timeout: 5s - retries: 5 - environment: - POSTGRES_PASSWORD_FILE: /run/secrets/db_liquibase.password - POSTGRES_USER: liquibase_user - POSTGRES_DB: bpe - volumes: - - type: volume - source: dsf-zars-bpe-db-data - target: /var/lib/postgresql/data - secrets: - - db_liquibase.password - -secrets: - proxy_certificate_and_int_cas.pem: - file: ../../secrets/proxy_certificate_and_int_cas.pem - proxy_certificate_private_key.pem: - file: ../../secrets/proxy_certificate_private_key.pem - proxy_trusted_client_cas.pem: - file: ../../secrets/proxy_trusted_client_cas.pem - - app_client_trust_certificates.pem: - file: ../../secrets/app_client_trust_certificates.pem - app_client_certificate_private_key.pem.password: - file: ../../secrets/app_client_certificate_private_key.pem.password - - db_liquibase.password: - file: ../../secrets/db_liquibase.password - - db_zars_bpe_user.password: - file: ../../secrets/db_zars_bpe_user.password - db_zars_bpe_user_camunda.password: - file: ../../secrets/db_zars_bpe_user_camunda.password - app_zars_client_certificate.pem: - file: ../../secrets/app_zars_client_certificate.pem - app_zars_client_certificate_private_key.pem: - file: ../../secrets/app_zars_client_certificate_private_key.pem - db_fhir_zars_user.password: - file: ../../secrets/db_fhir_zars_user.password - db_fhir_zars_user_permanent_delete.password: - file: ../../secrets/db_fhir_zars_user_permanent_delete.password - -volumes: - dsf-zars-fhir-db-data: - name: "dsf-zars-fhir-db-data" - dsf-zars-bpe-db-data: - name: "dsf-zars-bpe-db-data" diff --git a/feasibility-portal/dsf-broker/down.sh b/feasibility-portal/dsf-broker/down.sh deleted file mode 100755 index 93adcf5..0000000 --- a/feasibility-portal/dsf-broker/down.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -# Arguments -# 1: docker-compose project token - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" - -docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml down diff --git a/feasibility-portal/dsf-broker/fhir/app/conf/bundle.xml b/feasibility-portal/dsf-broker/fhir/app/conf/bundle.xml deleted file mode 100644 index f4b9977..0000000 --- a/feasibility-portal/dsf-broker/fhir/app/conf/bundle.xml +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/feasibility-portal/dsf-broker/proxy/nginx.conf b/feasibility-portal/dsf-broker/proxy/nginx.conf deleted file mode 100644 index 13b2b26..0000000 --- a/feasibility-portal/dsf-broker/proxy/nginx.conf +++ /dev/null @@ -1,59 +0,0 @@ - -user nginx; -worker_processes 1; - -error_log /var/log/nginx/error.log warn; -pid /var/run/nginx.pid; - - -events { - worker_connections 1024; -} - - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - #tcp_nopush on; - - keepalive_timeout 65; - - #gzip on; - - ssl_certificate /run/secrets/proxy_certificate_and_int_cas.pem; - ssl_certificate_key /run/secrets/proxy_certificate_private_key.pem; - ssl_protocols TLSv1.3; - ssl_prefer_server_ciphers off; - add_header Strict-Transport-Security "max-age=63072000" always; - - ssl_client_certificate /run/secrets/proxy_trusted_client_cas.pem; - ssl_verify_client on; - ssl_verify_depth 2; - - include /etc/nginx/conf.d/*.conf; - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name dsf-zars-fhir-proxy; - - location / { - proxy_set_header X-ClientCert $ssl_client_escaped_cert; - - proxy_pass http://dsf-zars-fhir-app:8080; - - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 43200s; - } - } -} diff --git a/feasibility-portal/dsf-broker/start.sh b/feasibility-portal/dsf-broker/start.sh deleted file mode 100755 index 595b592..0000000 --- a/feasibility-portal/dsf-broker/start.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -# Arguments -# 1: docker-compose project token - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" - -# FHIR ------------------------------------------------------------------------ - -echo "Starting ZARS FHIR app..." -docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml up -d dsf-zars-fhir-proxy -echo -n "Waiting for full startup of the DSF ZARS FHIR app..." -( docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml logs -f dsf-zars-fhir-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' -echo "DONE" - -# BPE ------------------------------------------------------------------------- - -echo -n "Setting permissions for ZARS BPE app..." -chmod a+w -R bpe/app/last_event -echo "DONE" - -echo "Starting ZARS BPE app..." -docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml up -d dsf-zars-bpe-app -echo -n "Waiting for full startup of the DSF ZARS BPE app..." -( docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml logs -f dsf-zars-bpe-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' -echo "DONE" diff --git a/feasibility-portal/dsf-broker/stop.sh b/feasibility-portal/dsf-broker/stop.sh deleted file mode 100755 index 3a1f2ae..0000000 --- a/feasibility-portal/dsf-broker/stop.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -# Arguments -# 1: docker-compose project token - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" - -docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml stop diff --git a/feasibility-triangle/dsf-client/.env.default b/feasibility-triangle/dsf-client/.env.default deleted file mode 100644 index f1936ae..0000000 --- a/feasibility-triangle/dsf-client/.env.default +++ /dev/null @@ -1,9 +0,0 @@ -FEASIBILITY_DSF_CLIENT_PROCESS_USER_THUMBPRINTS=e2b39f27f51553a9f51a4dbda11cf7ac36339778af0d38a51cc85538dfde8b04837acc1dc8ec0a401cbe7867dbc9e1ba82e950fea4ca304aa3909541ad49fd16,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202 -FEASIBILITY_DSF_CLIENT_PROCESS_USER_THUMBPRINTS_PERMANENT_DELETE=e2b39f27f51553a9f51a4dbda11cf7ac36339778af0d38a51cc85538dfde8b04837acc1dc8ec0a401cbe7867dbc9e1ba82e950fea4ca304aa3909541ad49fd16,d2e7338c3e9fc96a081b1a8983a847028859a68e5e318cb79cd6d0b2e9508e91698c373bbcdf56f774d6a9997e4a83a28fb6046ec80f8551ae38de49fe03b202 -FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER=Test_DIC_1 -FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY=structured-query -FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE=true -FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL=http://node-flare:5000/ -FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PATH=/opt/bpe/truststore.p12 -FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PATH=/opt/bpe/keystore -FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASE_URL=http://fhir-server:8080/fhir/ diff --git a/feasibility-triangle/dsf-client/bpe/app/last_event/.gitkeep b/feasibility-triangle/dsf-client/bpe/app/last_event/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/feasibility-triangle/dsf-client/bpe/cache/.gitkeep b/feasibility-triangle/dsf-client/bpe/cache/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/feasibility-triangle/dsf-client/docker-compose.yml b/feasibility-triangle/dsf-client/docker-compose.yml deleted file mode 100644 index 2c19724..0000000 --- a/feasibility-triangle/dsf-client/docker-compose.yml +++ /dev/null @@ -1,221 +0,0 @@ -version: '3.7' - -services: - - # ---- Proxy ---------------------------------------------------------------- - dsf-dic-fhir-proxy: - image: nginx:1.21 - restart: on-failure - secrets: - - proxy_certificate_and_int_cas.pem - - proxy_certificate_private_key.pem - - proxy_trusted_client_cas.pem - volumes: - - type: bind - source: ./proxy/nginx.conf - target: /etc/nginx/nginx.conf - read_only: true - environment: - TZ: Europe/Berlin - depends_on: - - dsf-dic-fhir-app - - dsf-dic-fhir-app: - image: ghcr.io/highmed/fhir:0.7.0 - restart: on-failure - healthcheck: - test: [ "CMD", "java", "-cp", "dsf_fhir.jar", "org.highmed.dsf.fhir.StatusClient" ] - interval: 10s - timeout: 15s - retries: 5 - volumes: - - type: bind - source: ./fhir/app/conf/bundle.xml - target: /opt/fhir/conf/bundle.xml - secrets: - - db_liquibase.password - - db_fhir_dic_1_user.password - - db_fhir_dic_1_user_permanent_delete.password - - app_client_trust_certificates.pem - - app_dic_1_client_certificate.pem - - app_dic_1_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - environment: - ORG_HIGHMED_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PASSWORD_FILE: /run/secrets/db_fhir_dic_1_user.password - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE: /run/secrets/db_fhir_dic_1_user_permanent_delete.password - ORG_HIGHMED_DSF_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_dic_1_client_certificate.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_dic_1_client_certificate_private_key.pem - ORG_HIGHMED_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_FHIR_DB_URL: jdbc:postgresql://dsf-dic-fhir-db/fhir - ORG_HIGHMED_DSF_FHIR_DB_USER_GROUP: dic_1_fhir_users - ORG_HIGHMED_DSF_FHIR_DB_USER_USERNAME: dic_1_fhir_server_user - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP: dic_1_fhir_permanent_delete_users - ORG_HIGHMED_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME: dic_1_fhir_server_permanent_delete_user - ORG_HIGHMED_DSF_FHIR_SERVER_BASE_URL: https://dsf-dic-fhir-proxy/fhir - ORG_HIGHMED_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: ${FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER} - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS: ${FEASIBILITY_DSF_CLIENT_PROCESS_USER_THUMBPRINTS} - ORG_HIGHMED_DSF_FHIR_SERVER_USER_THUMBPRINTS_PERMANENT_DELETE: ${FEASIBILITY_DSF_CLIENT_PROCESS_USER_THUMBPRINTS_PERMANENT_DELETE} - EXTRA_JVM_ARGS: ${CODEX_DSF_ZARS_FHIR_APP_JVM_ARGS} - TZ: Europe/Berlin - depends_on: - - dsf-dic-fhir-db - - dsf-dic-fhir-db: - image: postgres:13 - restart: on-failure - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U liquibase_user -d fhir" ] - interval: 10s - timeout: 5s - retries: 5 - environment: - POSTGRES_PASSWORD_FILE: /run/secrets/db_liquibase.password - POSTGRES_USER: liquibase_user - POSTGRES_DB: fhir - volumes: - - type: volume - source: dsf-dic-fhir-db-data - target: /var/lib/postgresql/data - secrets: - - db_liquibase.password - - dsf-dic-bpe-app: - image: ghcr.io/highmed/bpe:0.7.0 - restart: on-failure - healthcheck: - test: [ "CMD", "java", "-cp", "dsf_bpe.jar", "org.highmed.dsf.bpe.StatusClient" ] - interval: 10s - timeout: 15s - retries: 5 - volumes: - - type: bind - source: ../../assets/feasibility-dsf-process-0.3.0.jar - target: /opt/bpe/process/feasibility-dsf-process-0.3.0.jar - read_only: true - - type: bind - source: ./bpe/app/last_event - target: /opt/bpe/last_event - - type: bind - source: ./bpe/cache - target: /opt/bpe/cache - - type: bind - source: ../../assets/hapi-fhir-client-5.1.0.jar - target: /opt/bpe/plugin/hapi-fhir-client-5.1.0.jar - read_only: true - # Use the following settings if you need to. - # - type: bind - # source: - # target: ${DSF_CLIENT_PROCESS_TRUST_STORE_PATH} - # read_only: true - # - type: bind - # source: - # target: ${DSF_CLIENT_PROCESS_KEY_STORE_PATH} - # read_only: true - secrets: - - db_liquibase.password - - db_dic_1_bpe_user.password - - db_dic_1_bpe_user_camunda.password - - app_client_trust_certificates.pem - - app_dic_1_client_certificate.pem - - app_dic_1_client_certificate_private_key.pem - - app_client_certificate_private_key.pem.password - environment: - ORG_HIGHMED_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE: /run/secrets/db_liquibase.password - ORG_HIGHMED_DSF_BPE_DB_USER_PASSWORD_FILE: /run/secrets/db_dic_1_bpe_user.password - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE: /run/secrets/db_dic_1_bpe_user_camunda.password - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_TRUST_CERTIFICATES: /run/secrets/app_client_trust_certificates.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE: /run/secrets/app_dic_1_client_certificate.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY: /run/secrets/app_dic_1_client_certificate_private_key.pem - ORG_HIGHMED_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password - ORG_HIGHMED_DSF_BPE_DB_URL: jdbc:postgresql://dsf-dic-bpe-db/bpe - ORG_HIGHMED_DSF_BPE_DB_USER_GROUP: dic_1_bpe_users - ORG_HIGHMED_DSF_BPE_DB_USER_USERNAME: dic_1_bpe_server_user - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_GROUP: dic_1_camunda_users - ORG_HIGHMED_DSF_BPE_DB_USER_CAMUNDA_USERNAME: dic_1_camunda_server_user - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE: ${FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER} - ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://dsf-dic-fhir-proxy/fhir - DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_FLARE_WEBSERVICE_BASE_URL: ${FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL} - DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_FLARE_WEBSERVICE_CONNECT_TIMEOUT: 2000 - DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_EVALUATION_STRATEGY: ${FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY} - DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_EVALUATION_OBFUSCATE: ${FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE} - DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_BASE_URL: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASE_URL} - # Use the following settings if you need to. - # For more information see: https://github.com/medizininformatik-initiative/feasibility-dsf-process/tree/develop/feasibility-dsf-process#configuration - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_PROXY_HOST: ${FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_HOST} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_PROXY_PORT: ${FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PORT} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_PROXY_USERNAME: ${FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_USERNAME} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_PROXY_PASSWORD: ${FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PASSWORD} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_AUTH_BEARER_TOKEN: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BEARER_AUTH_TOKEN} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_AUTH_BASIC_USERNAME: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_USERNAME} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_AUTH_BASIC_PASSWORD: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_PASSWORD} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TIMEOUT_CONNECT: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_TIMEOUT} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TIMEOUT_CONNECT_REQUEST: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_REQUEST_TIMEOUT} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TIMEOUT_SOCKET: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_NETWORK_OPS_TIMEOUT} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TRUST_STORE_PATH: ${FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PATH} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_TRUST_STORE_PASSWORD: ${FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PASSWORD} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_KEY_STORE_PATH: ${FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PATH} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_KEY_STORE_PASSWORD: ${FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PASSWORD} - # DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_BASE_URL: ${FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASE_URL} - EXTRA_JVM_ARGS: ${CODEX_DSF_ZARS_BPE_APP_JVM_ARGS} - TZ: "Europe/Berlin" - depends_on: - - dsf-dic-fhir-proxy - - dsf-dic-bpe-db - - dsf-dic-bpe-db: - image: postgres:13 - restart: on-failure - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U liquibase_user -d bpe" ] - interval: 10s - timeout: 5s - retries: 5 - environment: - POSTGRES_PASSWORD_FILE: /run/secrets/db_liquibase.password - POSTGRES_USER: liquibase_user - POSTGRES_DB: bpe - volumes: - - type: volume - source: dsf-dic-bpe-db-data - target: /var/lib/postgresql/data - secrets: - - db_liquibase.password - -secrets: - proxy_certificate_and_int_cas.pem: - file: ../../secrets/proxy_certificate_and_int_cas.pem - proxy_certificate_private_key.pem: - file: ../../secrets/proxy_certificate_private_key.pem - proxy_trusted_client_cas.pem: - file: ../../secrets/proxy_trusted_client_cas.pem - - app_client_trust_certificates.pem: - file: ../../secrets/app_client_trust_certificates.pem - app_client_certificate_private_key.pem.password: - file: ../../secrets/app_client_certificate_private_key.pem.password - - db_liquibase.password: - file: ../../secrets/db_liquibase.password - - db_dic_1_bpe_user.password: - file: ../../secrets/db_dic_1_bpe_user.password - db_dic_1_bpe_user_camunda.password: - file: ../../secrets/db_dic_1_bpe_user_camunda.password - app_dic_1_client_certificate.pem: - file: ../../secrets/app_dic_1_client_certificate.pem - app_dic_1_client_certificate_private_key.pem: - file: ../../secrets/app_dic_1_client_certificate_private_key.pem - db_fhir_dic_1_user.password: - file: ../../secrets/db_fhir_dic_1_user.password - db_fhir_dic_1_user_permanent_delete.password: - file: ../../secrets/db_fhir_dic_1_user_permanent_delete.password - - - -volumes: - dsf-dic-fhir-db-data: - name: "dsf-dic-fhir-db-data" - dsf-dic-bpe-db-data: - name: "dsf-dic-bpe-db-data" diff --git a/feasibility-triangle/dsf-client/down.sh b/feasibility-triangle/dsf-client/down.sh deleted file mode 100755 index 93adcf5..0000000 --- a/feasibility-triangle/dsf-client/down.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -# Arguments -# 1: docker-compose project token - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" - -docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml down diff --git a/feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml b/feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml deleted file mode 100644 index d560421..0000000 --- a/feasibility-triangle/dsf-client/fhir/app/conf/bundle.xml +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/feasibility-triangle/dsf-client/proxy/nginx.conf b/feasibility-triangle/dsf-client/proxy/nginx.conf deleted file mode 100644 index 9d770e4..0000000 --- a/feasibility-triangle/dsf-client/proxy/nginx.conf +++ /dev/null @@ -1,56 +0,0 @@ - -user nginx; -worker_processes 1; - -error_log /var/log/nginx/error.log warn; -pid /var/run/nginx.pid; - - -events { - worker_connections 1024; -} - - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - #tcp_nopush on; - - keepalive_timeout 65; - - #gzip on; - - ssl_certificate /run/secrets/proxy_certificate_and_int_cas.pem; - ssl_certificate_key /run/secrets/proxy_certificate_private_key.pem; - ssl_protocols TLSv1.3; - ssl_prefer_server_ciphers off; - add_header Strict-Transport-Security "max-age=63072000" always; - - ssl_client_certificate /run/secrets/proxy_trusted_client_cas.pem; - ssl_verify_client on; - ssl_verify_depth 2; - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name dsf-dic-fhir-proxy; - - location / { - proxy_set_header X-ClientCert $ssl_client_escaped_cert; - proxy_pass http://dsf-dic-fhir-app:8080; - - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 43200s; - } - } -} diff --git a/feasibility-triangle/dsf-client/start.sh b/feasibility-triangle/dsf-client/start.sh deleted file mode 100755 index d21c8f5..0000000 --- a/feasibility-triangle/dsf-client/start.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -# Arguments -# 1: docker-compose project token - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" - -# FHIR ------------------------------------------------------------------------ - -echo "Starting ZARS FHIR app..." -docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml up -d dsf-dic-fhir-proxy -echo -n "Waiting for full startup of the DSF DIC FHIR app..." -( docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml logs -f dsf-dic-fhir-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' -echo "DONE" - -# BPE ------------------------------------------------------------------------- - -echo -n "Setting permissions for ZARS BPE app..." -chmod a+w -R "$BASE_DIR"/bpe/app/last_event -echo "DONE" - -echo "Starting ZARS BPE app..." -docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml up -d dsf-dic-bpe-app -echo -n "Waiting for full startup of the DSF DIC BPE app..." -( docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml logs -f dsf-dic-bpe-app & ) | grep -E -q '^.* Server\.doStart.* \| Started.*' -echo "DONE" diff --git a/feasibility-triangle/dsf-client/stop.sh b/feasibility-triangle/dsf-client/stop.sh deleted file mode 100755 index 3a1f2ae..0000000 --- a/feasibility-triangle/dsf-client/stop.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -# Arguments -# 1: docker-compose project token - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" - -docker-compose -p "$1" -f "$BASE_DIR"/docker-compose.yml stop diff --git a/secrets/app_client_certificate_private_key.pem.password b/secrets/app_client_certificate_private_key.pem.password deleted file mode 100644 index 7aa311a..0000000 --- a/secrets/app_client_certificate_private_key.pem.password +++ /dev/null @@ -1 +0,0 @@ -password \ No newline at end of file diff --git a/secrets/app_client_trust_certificates.pem b/secrets/app_client_trust_certificates.pem deleted file mode 100644 index a5f16f3..0000000 --- a/secrets/app_client_trust_certificates.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/TCCAuWgAwIBAgIGAX0zqQXAMA0GCSqGSIb3DQEBDQUAMBwxCzAJBgNVBAYT -AkRFMQ0wCwYDVQQDDARUZXN0MB4XDTIxMTExODE1MjczNFoXDTMxMTExODE1Mjcz -NFowHDELMAkGA1UEBhMCREUxDTALBgNVBAMMBFRlc3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCEcTJ8fEGvYVH05Us0COJWx+Frde4m83+uM4knLZOT -BeCcsLck8ImYOsmGnuCeE2s/NXYup0amBCnTm8N+02qlBGsTBVtbA9Q4KagvvMt+ -RzBA+XiNKzddj5+86e88Pb6vZpIHzAZTczJx9suX1sVwdhUnItJ9H4vW2NboD6GS -HUI8jkqxo2/GgsJ8EDZ2gHqueDNUfSh0hLM9OOCFPMz4frZ2X0THxq4RExWiLxap -wibzTQSUlJoawicaqNnDVNkTXxAWIVp8ZQLt2ftQI1ejsSvHp3o25Yq/g0QHWUzl -dtdNRCCWZiCn6pDZEnjEFitMgI16lEGQk9/+7EFANmu26Zzcz9mesAPlrW3f3cBP -a5OWzKATjjS+6FmBO/rclSbRwpzYYf3ZNprWHH1CXFD75My4+bpdJMgIJHMw4UKe -EOAQ8gPnQymnhDHWf6CnFF4GF5iTOmhPcgY/KNFHQKetK3Ahr3+hNEvWc6gF5keu -lyX/LKqbU1UBS6nCbkC07QRs6nUu9EWvA6MkG2fsX4IzxI5zzzm8in6lDpbZKJpG -GN4gyloSn5W07jpxCLQOx511rgDE/giqOclcClquwC1kMVw6OOVkVAsoO617SlPv -g7BEW9kQOpw+b2N+rm2PzaGzGaIpEzaHsGlGpBEY0OxJUQLfMjC9zwI3Mrjp6T1O -lwIDAQABo0UwQzAdBgNVHQ4EFgQU63O2Ad7qkE/GOId7P60sa6ge7ycwEgYDVR0T -AQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIB -ACYMVsFoJcr/by6J/D7sDZjeJF++LMc6wERy2cwOpl+pOfzbkzOqbysGZq37Z136 -bxtufzJiSRvNbyxtCfbJkMA2/RcAdXrCPyUziMgMqj1eVdJ3proVzRGRs5DNLGNB -rmvGLWxqbdWAX86AoLmYbwddM9dpF5ZVliv7vh37I6Y4To3G5SHgmRm6wk0FgA3w -27+Kj/BKpn83wZHOBA6Dld6TDDjMxl7aQUd3kcTsWp/V1sBC0m+YZJW9U7SqsMAx -3hJOuF7uMEuTTtQkWs6yzGchTi/SFJolC8vvq7SgMSCH5Qt3ySZixtp01O53O7oG -7Iywdj2kN8qwI4+yLGm+dqzkChgPqjR3DIyOFQZvYlSRgglaKU2jSipoQneg/3Wu -JE1AjciSR8lblSLFJildLejVEWJ3chrPeeKwFu0lGBQRCgcIqlnexz7mSEriKZSw -EEp36WoO9eGZ45fbJdCEnQb+Ic7hrA1Ll3C1+GsWhZ9DDCr2VhHvZ5T9khGcpG+D -3Muq869YPMq0vpuZRUmyq/6mUGpZ5E7m5d1sgFghIqywl3ZJK+qkTXu1qa6mC2gq -8Eodnd0zTtyTlr/zBZgeCypNVG9dmAIZYqNulubGkFQkK5WD6UXrWFHqT/Z8bQ5a -V8XcC/3nBZa5g8OziVi03YkUpCunaYFJyyMg8UbZBW4q ------END CERTIFICATE----- diff --git a/secrets/app_dic_1_client_certificate.pem b/secrets/app_dic_1_client_certificate.pem deleted file mode 100644 index 5a32fab..0000000 --- a/secrets/app_dic_1_client_certificate.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFNTCCAx2gAwIBAgIGAX0zqRBKMA0GCSqGSIb3DQEBDQUAMBwxCzAJBgNVBAYT -AkRFMQ0wCwYDVQQDDARUZXN0MB4XDTIxMTExODE1MjczN1oXDTIyMTExODE1Mjcz -N1owJDELMAkGA1UEBhMCREUxFTATBgNVBAMMDGRpYy0xLWNsaWVudDCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKKQGOu5WqSU+jCdpCGrxb3d3p5Ic40e -Yr7K8qmu/6zVXsIoZo6F+DrnYj09IIUr6+AzK5cuIPRUKjBhhN+KcyC2wY24b29W -ZADXJxV95E3I917fjrAcDXmHLNGgIPYZhTfSOMjvtt/CmQA1OOuy6A+XbGImCgrg -iC+Qbsk0dNDTamriTlVG7D/VAUhiv12D7K0TtvrvJMsRtmoV5qURmauRkIYTF+00 -e1L8MAOEwR92t9S1kwYmOTJtPHF2PRPnHibAkLQ8mXOF1wSBoy33lWzKkUshpCvr -HD/GvCIYLTDeKn6MTs5RFYBN6fXw8Pm0DUIJrfueH2xdcrDDTXDvNPcUFSNZ1ltJ -mBwKwefIsPltJJXPQoDghLEhDTIiSDO1xIhRYs5M4IC8ENxwZp3BIgMVogeAgPL0 -noqfEZgGyX5Msra+bPaNqB0qybVi64Pk+KOEFQLjoQEyfgC9/kX4XHcXzrCNmg3P -VW/2JviZ95XBDQwO0Hk5uF6EBPCYOs1mkZqjuC7tGgK/J9101FPu6eqiXdDj7YcF -eTYiTpz7eHGjlbl+Ele6xoo8Snk0bxKAPobHeVmJgMp3nsYtilXizNGPDxZYC06L -cOvfJwHbDPrwQO8aoEhPRvId4E0np2+Gt+95Wbd1zEFL4iAsIzsD8I60zCIxVmDH -NQwbAgJwOsmtAgMBAAGjdTBzMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgXg -MB0GA1UdDgQWBBQkuyqbNycKzX6fVH8dBVyQXM7qXjAfBgNVHSMEGDAWgBTrc7YB -3uqQT8Y4h3s/rSxrqB7vJzATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0B -AQ0FAAOCAgEAOREHvSaon7wET8fH2Fl8nvRhvi+i/1TIbMnRHWLiUu4GV4J5+Dig -Ks+12QxvSz+9KEUZSYQHtkC7GJqgB6af7CfFc4a36AZ15keiCME6xDKK6HuBcYPA -0puw18UdtwYs6M6qxVdIuM2R/tdEvXGCkRLGfjNqfn4RKkYCW8zxZtQG4eUgaYqk -CohJiddaeKvktQDfHLWuKLNp19WTM0RAOVtNB89G9iCFtna19K/lQTapo0PMu4le -ITiGme3YmfCFASatDGNlToZ6LhT0gmdT0pPT2+OFLanEwTH3GvtfFNnKldsEifq7 -w31uucLXkCIZnvXZt96OloRSq0NieY/orVMshEk2LjK2rK8Tsu4Pk2UvasN2BOgp -om6rmpwBvfe0DfMI5zVEXrF1bYeISCQJNyjbzsTeBDHq58La1E1QmFrakN0lASAk -KvUyKdIE/Y/gYPx9y52NDWPhI01Fi24/vpD0SwNq1bZAiBP771hxcsVWZVYdkDa6 -F+qdhHPMsm99iAy8GwUrVouJUzjgY7qIxLLo3H+g2dgHdTCUiUX3Q5OQIibakE7E -ac1nuP0lf6k2hTEZFovenYJXBjTAnLHuaDDhGG6fkJCBoLZRpeaDb+9EztOQsJaS -0bTK41Gl7EvUdm6fyPywc06B6Ts4pCXVlwvgwtUU+OwX1fc2B0vsvhQ= ------END CERTIFICATE----- diff --git a/secrets/app_dic_1_client_certificate_private_key.pem b/secrets/app_dic_1_client_certificate_private_key.pem deleted file mode 100644 index e20a248..0000000 --- a/secrets/app_dic_1_client_certificate_private_key.pem +++ /dev/null @@ -1,55 +0,0 @@ ------BEGIN ENCRYPTED PRIVATE KEY----- -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 -pwnhqv4h7xPe ------END ENCRYPTED PRIVATE KEY----- diff --git a/secrets/app_zars_client_certificate.pem b/secrets/app_zars_client_certificate.pem deleted file mode 100644 index 4c56a9b..0000000 --- a/secrets/app_zars_client_certificate.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFNDCCAxygAwIBAgIGAX0zqRG2MA0GCSqGSIb3DQEBDQUAMBwxCzAJBgNVBAYT -AkRFMQ0wCwYDVQQDDARUZXN0MB4XDTIxMTExODE1MjczN1oXDTIyMTExODE1Mjcz -N1owIzELMAkGA1UEBhMCREUxFDASBgNVBAMMC3phcnMtY2xpZW50MIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAm9yxScJierpxRy1EnXO5tN8qF2sCXd1O -OVUyJ7unm4UXF3JiKyDUXRG/4+F00+O+SFIYLLox1Mn3wbWqiFGRz/RTUiwU8pWg -bv/jAPRuuLri7rxLb9rCc/luh54pIdNzsT6aMd6FphUH8icibOnO+rZslCQ6WZDI -fkwpKeHG0RqMWuZ4ithB4FBMjX0EnDEnWatNYE2CFHvlQAZqzIN7Lq8Y09yV9C99 -tT+X8iD+iSdMyp5TDra2cyq1HIk9K6H24CJfNE4N1UQqt5V1HRaiIv387TcIKQX9 -icyGeREQwT9Du1Hy8W5plQwyDBju+A01fq0sb6wp7CwtG9DUNHpQCbUQECLAU2fg -uBhSiQJd6p1vkw0bB+HR8r5huYy6JGWxOeIIG9CPgAu9ykSW3LF79DGP0Lw8AUEu -NesSM73z95eIdyD0bApjtXA34k+dJXcYC1Ttufxmz+ywAwOqVNgM+GcI22KYDeW1 -AhrUrYB8zIwszkJhhy+4SbhyJM5+O1asziqv1fOTLbRTOu43oBW5j2l/d71kndC3 -mMGEpDlg4yBniM6zWm7rXRPI0ExJcu0IYNTiku9F7Scc/q60Rg5FnSEulXeyOSzV -S4ahfFiOr40aWK3Z663pV161VGy65uJ+MdgfrI0BuCfDUcUL1GhEi198vdqHtR2Z -O3yoLDsx9UcCAwEAAaN1MHMwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBeAw -HQYDVR0OBBYEFPw+ZvKNIGfNPLsLOI2g1a2FMuUHMB8GA1UdIwQYMBaAFOtztgHe -6pBPxjiHez+tLGuoHu8nMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEB -DQUAA4ICAQAb4HJlYmpLli/FGKPO2I3rYCT1EYNRFqQTSH7yN7rJsvpKIcIey+yA -K55G8fDMTGVUkq1G2xS7vs0dmezs7WowiMKgWsaKqfpG3nvVsOYlCYx2pr5p6TdN -BQ8hR8MUhHFI1eofilU5speBs1UGbUO8lAHqR+WycPDCrP8x2TEVQiCOts8CcLKC -GL9SGBklKziU8pmaitlQivW2ia+0DvszN63R+IFAQjqlrpeOiW04u+uV1xOQBAF0 -pWufK7NMpP+swEzLwBpsx4B2TF29Zetu9BEAHYhuqF44ygPTuIqkqAEAlcaqSYy6 -YrvDePL6U3nLa8QS5oSlc/Big4ANX1/7ox3GZDFk+ta/wRlqgNTt/jwEsLcsNhEX -mV3DdACPyoms0f6BWJLOYiCSV+mdgMgujwzcx5fmeAYKp9BtPDfU0jnxhEbYY5JF -k1GZvcBm5EQsDyHrrEVb4n7l7Mq+N7lVq0n9Fak2bvqvkE3ruRNSv5muLPKw65Tl -IM2v/KEWNtrxBk0P8LEkvBJ6Jg8e2dVatZR1TijbKNhNPp7DKaA8PcPHvsa5SV9+ -ZfHhYLcXHztiOewjUICi+TVM5RiDRU4UgiayiZjxsP6ZRatm1VeeNMlglgupB3Wf -HE4WP0BEGWfK46kw+osjzNHsN+b/QVnNhi6kx8BuL2fzDy5QFAediw== ------END CERTIFICATE----- diff --git a/secrets/app_zars_client_certificate_private_key.pem b/secrets/app_zars_client_certificate_private_key.pem deleted file mode 100644 index 598cce9..0000000 --- a/secrets/app_zars_client_certificate_private_key.pem +++ /dev/null @@ -1,55 +0,0 @@ ------BEGIN ENCRYPTED PRIVATE KEY----- -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 -UtEZyWeXSxw3 ------END ENCRYPTED PRIVATE KEY----- diff --git a/secrets/db_dic_1_bpe_user.password b/secrets/db_dic_1_bpe_user.password deleted file mode 100644 index a29523e..0000000 --- a/secrets/db_dic_1_bpe_user.password +++ /dev/null @@ -1 +0,0 @@ -UJ5kkCmZ7NiiPwP91F1vI05ffgolkw0G \ No newline at end of file diff --git a/secrets/db_dic_1_bpe_user_camunda.password b/secrets/db_dic_1_bpe_user_camunda.password deleted file mode 100644 index e50c302..0000000 --- a/secrets/db_dic_1_bpe_user_camunda.password +++ /dev/null @@ -1 +0,0 @@ -5wK1DhDiyrhPLNWwnX2zY8bMMjlZHNvt \ No newline at end of file diff --git a/secrets/db_fhir_dic_1_user.password b/secrets/db_fhir_dic_1_user.password deleted file mode 100644 index eb580f9..0000000 --- a/secrets/db_fhir_dic_1_user.password +++ /dev/null @@ -1 +0,0 @@ -jnZkystPHM52FG3ryr7YHSTsWC9wu7KW \ No newline at end of file diff --git a/secrets/db_fhir_dic_1_user_permanent_delete.password b/secrets/db_fhir_dic_1_user_permanent_delete.password deleted file mode 100644 index fa8124f..0000000 --- a/secrets/db_fhir_dic_1_user_permanent_delete.password +++ /dev/null @@ -1 +0,0 @@ -DrWZ4ja4vAWhcgEmrnp3iZWqZT5daVUc \ No newline at end of file diff --git a/secrets/db_fhir_zars_user.password b/secrets/db_fhir_zars_user.password deleted file mode 100644 index 0bc4d05..0000000 --- a/secrets/db_fhir_zars_user.password +++ /dev/null @@ -1 +0,0 @@ -jzrMLm6sKjkwCemEuwn98cjH2X3dV2LY \ No newline at end of file diff --git a/secrets/db_fhir_zars_user_permanent_delete.password b/secrets/db_fhir_zars_user_permanent_delete.password deleted file mode 100644 index 546dead..0000000 --- a/secrets/db_fhir_zars_user_permanent_delete.password +++ /dev/null @@ -1 +0,0 @@ -FIzpR7jGuVS2uBQowC9OYB2vEAWu3THN \ No newline at end of file diff --git a/secrets/db_liquibase.password b/secrets/db_liquibase.password deleted file mode 100644 index d8a0612..0000000 --- a/secrets/db_liquibase.password +++ /dev/null @@ -1 +0,0 @@ -Ar5PjcJCb3cyTR4DsAeSkP6QCCkWt7hAw4RYE5HLCJYbPpcRKHTvWFtteubFfnhS \ No newline at end of file diff --git a/secrets/db_zars_bpe_user.password b/secrets/db_zars_bpe_user.password deleted file mode 100644 index d37473f..0000000 --- a/secrets/db_zars_bpe_user.password +++ /dev/null @@ -1 +0,0 @@ -cADBwBUsCVlwuhFin5b5ZhVdO8qY7ApC \ No newline at end of file diff --git a/secrets/db_zars_bpe_user_camunda.password b/secrets/db_zars_bpe_user_camunda.password deleted file mode 100644 index bd79744..0000000 --- a/secrets/db_zars_bpe_user_camunda.password +++ /dev/null @@ -1 +0,0 @@ -57V695NgKq3k0euc48PwJuwlZWo2r5CW \ No newline at end of file diff --git a/secrets/proxy_certificate_and_int_cas.pem b/secrets/proxy_certificate_and_int_cas.pem deleted file mode 100644 index 23a74f0..0000000 --- a/secrets/proxy_certificate_and_int_cas.pem +++ /dev/null @@ -1,63 +0,0 @@ -subject= CN=localhost,C=DE ------BEGIN CERTIFICATE----- -MIIFczCCA1ugAwIBAgIGAX0zqQ5mMA0GCSqGSIb3DQEBDQUAMBwxCzAJBgNVBAYT -AkRFMQ0wCwYDVQQDDARUZXN0MB4XDTIxMTExODE1MjczN1oXDTIyMTExODE1Mjcz -N1owITELMAkGA1UEBhMCREUxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAJSNER3dRatpZGiOh2PKmt/qK+tJoIuQQdqz -10Y7G9e5sfIBmInUd3jrRc3olWPrdEC3lL/HtTXhB6QnxQo9+NRkFwoqy0+2whjZ -OzTG6i8GDDHXPci/ZlrxbUIJuLpkr26JrICC7wnOpUqKEh2/0crX3BsbEOY4s3dr -QInASpDIDeiBJFbO7+SWp5q+ExlnNJmB2+3E+D1aIH/eOdw1yN9qh0GhC0gqvIf2 -Q+d8WyyORX6et12OJ/zzDXtLTK4pj39RgGl7yVs1NvlxRH1mG5VSB0XTpRzSg1hJ -b9594qW8Dvq4u/5pODQ1JLAVzweT4Q1UXMnRN1LbxZzMVItW13ciz3a56QT+4mj7 -VNOuPWr6vKQa24AnLa+NKeFTEhk6N3N7vWGBqYermLwVww+mScRPAu5UwLpfbt3g -a7EjplNtCKoLCJVOglyyqKFHKwsrqAw/+4oXpflYcjNM8RK79d7NnrSCYqCssbRt -NmXuQwLfMyVCcaykRl0EqoNCezhv4WiUz2umBModCrlGudcQiuAKRnjScfLoCGTI -dai+i6SBgMPaS8yK5RvSecUFkmgz4qnK0vml3f+nWaOZeguvG/nutM+6OhOlgRPc -6qp5eJeP+pAq0DsMk69NfhcbwR/Nkk0Dt6ESXL0rATxes49wxk2/wjN+7mMsvpRV -HH8FuKvzAgMBAAGjgbUwgbIwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBPAw -HQYDVR0OBBYEFA0LOQAaS8/YUThEnHKYBzcKg41lMD0GA1UdEQQ2MDSCCWxvY2Fs -aG9zdIISZHNmLWRpYy1maGlyLXByb3h5ghNkc2YtemFycy1maGlyLXByb3h5MB8G -A1UdIwQYMBaAFOtztgHe6pBPxjiHez+tLGuoHu8nMBMGA1UdJQQMMAoGCCsGAQUF -BwMBMA0GCSqGSIb3DQEBDQUAA4ICAQB2zLWht3FwUHH0/9C4b61wm/pNOAVNFAef -Noc69TMUa+gSn0jkyZE4XgSoMTlndKz7FmkEXy8hiqtALzekREJ7eKTRLXG995Aj -loBw/9OqJakuit6+jfB4h5dYXbAq1zZoCnWSgyClJrsgKZp5KtQXGGQJ5qNAiaFb -dh1c/p7YxcFc5HdjrkHxmzAC8I5PokWcSx9ItQ+dowAD5Qxa02YgmJZ/Q7U7hmws -ys41f7Dy9lKcSEz5r/UVl7KARA8E71ePsMaQqWxF3hyT8WroyEV44dzsvlSZ0faH -zoE9GzEUECkPnQLbUK6ZCpRRTp9LCyItmt57WV5pfafQMaCB9+h5NNX0EgLIHzdA -Stu03CticA96uHId/rTfMOoaCuAdLeJ9P4+jBERbkx/RFSVe6/jbFtcbtYdd1cBr -xo1L0RlhUCSy4JsKdo1iqszK/22mGpxDEq5O9H14h2qfTrFR7+FUKJoDB7Peki4i -Va2xloLQIgKx9eDMDi89hQ5O3Sl/hfkdGfRwahuATct4u6ack5l+QAKfIwODmqa1 -Qwib6W2VWam03EoiSEa06vEPBMUq8tOA7pDkutxKsFpda0+Ur0uuvck/1fDdQk6a -X6td5etVd3VVdRMGqppGgFhrEDEO3oSvpMBPvtRHgC31Jbj4oSiMSxQYyVI5w4Aj -q1oWuMEWkw== ------END CERTIFICATE----- -subject= CN=Test,C=DE ------BEGIN CERTIFICATE----- -MIIE/TCCAuWgAwIBAgIGAX0zqQXAMA0GCSqGSIb3DQEBDQUAMBwxCzAJBgNVBAYT -AkRFMQ0wCwYDVQQDDARUZXN0MB4XDTIxMTExODE1MjczNFoXDTMxMTExODE1Mjcz -NFowHDELMAkGA1UEBhMCREUxDTALBgNVBAMMBFRlc3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCEcTJ8fEGvYVH05Us0COJWx+Frde4m83+uM4knLZOT -BeCcsLck8ImYOsmGnuCeE2s/NXYup0amBCnTm8N+02qlBGsTBVtbA9Q4KagvvMt+ -RzBA+XiNKzddj5+86e88Pb6vZpIHzAZTczJx9suX1sVwdhUnItJ9H4vW2NboD6GS -HUI8jkqxo2/GgsJ8EDZ2gHqueDNUfSh0hLM9OOCFPMz4frZ2X0THxq4RExWiLxap -wibzTQSUlJoawicaqNnDVNkTXxAWIVp8ZQLt2ftQI1ejsSvHp3o25Yq/g0QHWUzl -dtdNRCCWZiCn6pDZEnjEFitMgI16lEGQk9/+7EFANmu26Zzcz9mesAPlrW3f3cBP -a5OWzKATjjS+6FmBO/rclSbRwpzYYf3ZNprWHH1CXFD75My4+bpdJMgIJHMw4UKe -EOAQ8gPnQymnhDHWf6CnFF4GF5iTOmhPcgY/KNFHQKetK3Ahr3+hNEvWc6gF5keu -lyX/LKqbU1UBS6nCbkC07QRs6nUu9EWvA6MkG2fsX4IzxI5zzzm8in6lDpbZKJpG -GN4gyloSn5W07jpxCLQOx511rgDE/giqOclcClquwC1kMVw6OOVkVAsoO617SlPv -g7BEW9kQOpw+b2N+rm2PzaGzGaIpEzaHsGlGpBEY0OxJUQLfMjC9zwI3Mrjp6T1O -lwIDAQABo0UwQzAdBgNVHQ4EFgQU63O2Ad7qkE/GOId7P60sa6ge7ycwEgYDVR0T -AQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIB -ACYMVsFoJcr/by6J/D7sDZjeJF++LMc6wERy2cwOpl+pOfzbkzOqbysGZq37Z136 -bxtufzJiSRvNbyxtCfbJkMA2/RcAdXrCPyUziMgMqj1eVdJ3proVzRGRs5DNLGNB -rmvGLWxqbdWAX86AoLmYbwddM9dpF5ZVliv7vh37I6Y4To3G5SHgmRm6wk0FgA3w -27+Kj/BKpn83wZHOBA6Dld6TDDjMxl7aQUd3kcTsWp/V1sBC0m+YZJW9U7SqsMAx -3hJOuF7uMEuTTtQkWs6yzGchTi/SFJolC8vvq7SgMSCH5Qt3ySZixtp01O53O7oG -7Iywdj2kN8qwI4+yLGm+dqzkChgPqjR3DIyOFQZvYlSRgglaKU2jSipoQneg/3Wu -JE1AjciSR8lblSLFJildLejVEWJ3chrPeeKwFu0lGBQRCgcIqlnexz7mSEriKZSw -EEp36WoO9eGZ45fbJdCEnQb+Ic7hrA1Ll3C1+GsWhZ9DDCr2VhHvZ5T9khGcpG+D -3Muq869YPMq0vpuZRUmyq/6mUGpZ5E7m5d1sgFghIqywl3ZJK+qkTXu1qa6mC2gq -8Eodnd0zTtyTlr/zBZgeCypNVG9dmAIZYqNulubGkFQkK5WD6UXrWFHqT/Z8bQ5a -V8XcC/3nBZa5g8OziVi03YkUpCunaYFJyyMg8UbZBW4q ------END CERTIFICATE----- diff --git a/secrets/proxy_certificate_private_key.pem b/secrets/proxy_certificate_private_key.pem deleted file mode 100644 index 774f1e0..0000000 --- a/secrets/proxy_certificate_private_key.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -6QsTyf8pc1IcoQ/4vzNBzsPvs7jV ------END PRIVATE KEY----- diff --git a/secrets/proxy_trusted_client_cas.pem b/secrets/proxy_trusted_client_cas.pem deleted file mode 100644 index a5f16f3..0000000 --- a/secrets/proxy_trusted_client_cas.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/TCCAuWgAwIBAgIGAX0zqQXAMA0GCSqGSIb3DQEBDQUAMBwxCzAJBgNVBAYT -AkRFMQ0wCwYDVQQDDARUZXN0MB4XDTIxMTExODE1MjczNFoXDTMxMTExODE1Mjcz -NFowHDELMAkGA1UEBhMCREUxDTALBgNVBAMMBFRlc3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCEcTJ8fEGvYVH05Us0COJWx+Frde4m83+uM4knLZOT -BeCcsLck8ImYOsmGnuCeE2s/NXYup0amBCnTm8N+02qlBGsTBVtbA9Q4KagvvMt+ -RzBA+XiNKzddj5+86e88Pb6vZpIHzAZTczJx9suX1sVwdhUnItJ9H4vW2NboD6GS -HUI8jkqxo2/GgsJ8EDZ2gHqueDNUfSh0hLM9OOCFPMz4frZ2X0THxq4RExWiLxap -wibzTQSUlJoawicaqNnDVNkTXxAWIVp8ZQLt2ftQI1ejsSvHp3o25Yq/g0QHWUzl -dtdNRCCWZiCn6pDZEnjEFitMgI16lEGQk9/+7EFANmu26Zzcz9mesAPlrW3f3cBP -a5OWzKATjjS+6FmBO/rclSbRwpzYYf3ZNprWHH1CXFD75My4+bpdJMgIJHMw4UKe -EOAQ8gPnQymnhDHWf6CnFF4GF5iTOmhPcgY/KNFHQKetK3Ahr3+hNEvWc6gF5keu -lyX/LKqbU1UBS6nCbkC07QRs6nUu9EWvA6MkG2fsX4IzxI5zzzm8in6lDpbZKJpG -GN4gyloSn5W07jpxCLQOx511rgDE/giqOclcClquwC1kMVw6OOVkVAsoO617SlPv -g7BEW9kQOpw+b2N+rm2PzaGzGaIpEzaHsGlGpBEY0OxJUQLfMjC9zwI3Mrjp6T1O -lwIDAQABo0UwQzAdBgNVHQ4EFgQU63O2Ad7qkE/GOId7P60sa6ge7ycwEgYDVR0T -AQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIB -ACYMVsFoJcr/by6J/D7sDZjeJF++LMc6wERy2cwOpl+pOfzbkzOqbysGZq37Z136 -bxtufzJiSRvNbyxtCfbJkMA2/RcAdXrCPyUziMgMqj1eVdJ3proVzRGRs5DNLGNB -rmvGLWxqbdWAX86AoLmYbwddM9dpF5ZVliv7vh37I6Y4To3G5SHgmRm6wk0FgA3w -27+Kj/BKpn83wZHOBA6Dld6TDDjMxl7aQUd3kcTsWp/V1sBC0m+YZJW9U7SqsMAx -3hJOuF7uMEuTTtQkWs6yzGchTi/SFJolC8vvq7SgMSCH5Qt3ySZixtp01O53O7oG -7Iywdj2kN8qwI4+yLGm+dqzkChgPqjR3DIyOFQZvYlSRgglaKU2jSipoQneg/3Wu -JE1AjciSR8lblSLFJildLejVEWJ3chrPeeKwFu0lGBQRCgcIqlnexz7mSEriKZSw -EEp36WoO9eGZ45fbJdCEnQb+Ic7hrA1Ll3C1+GsWhZ9DDCr2VhHvZ5T9khGcpG+D -3Muq869YPMq0vpuZRUmyq/6mUGpZ5E7m5d1sgFghIqywl3ZJK+qkTXu1qa6mC2gq -8Eodnd0zTtyTlr/zBZgeCypNVG9dmAIZYqNulubGkFQkK5WD6UXrWFHqT/Z8bQ5a -V8XcC/3nBZa5g8OziVi03YkUpCunaYFJyyMg8UbZBW4q ------END CERTIFICATE----- diff --git a/feasibility-portal/dsf-broker/certs/test-user.p12 b/secrets/test-user.p12 similarity index 100% rename from feasibility-portal/dsf-broker/certs/test-user.p12 rename to secrets/test-user.p12 diff --git a/util/certs/Dockerfile b/util/certs/Dockerfile deleted file mode 100644 index b850ede..0000000 --- a/util/certs/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM eclipse-temurin:17-jre-focal - - -WORKDIR /opt/certs -COPY add_cert_to_truststore.sh /opt/certs/add_cert_to_truststore.sh - -ENTRYPOINT ["./add_cert_to_truststore.sh"] diff --git a/util/certs/add_cert_to_truststore.sh b/util/certs/add_cert_to_truststore.sh deleted file mode 100755 index b44f6ec..0000000 --- a/util/certs/add_cert_to_truststore.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -i=0 -for f in /opt/certs/your_certs/*.pem; do - if [ -f "$f" ]; then - echo "Importing additional certificate at $f into truststore." - - if ! keytool -importcert -file "${f}" -alias "additional-cert-${i}" -storepass changeit -noprompt \ - -cacerts - then - echo "Importing additional certificate at $f into truststore failed." - exit 1 - fi - - i=$((i+1)) - fi -done - -echo -n "Copying truststore to output directory..." -if ! cp "$JAVA_HOME"/lib/security/cacerts /opt/certs/output/ -then - echo "FAILED" -else - echo "OK" -fi diff --git a/util/certs/create_trust_store_with_additional_cert.sh b/util/certs/create_trust_store_with_additional_cert.sh deleted file mode 100755 index 5ff8f82..0000000 --- a/util/certs/create_trust_store_with_additional_cert.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || pwd -P )" - -docker build -t feasibility-deploy-create-trust-store "${BASE_DIR}"/ -docker run --name create-trust-store --rm \ - -v "${BASE_DIR}/your_certs":/opt/certs/your_certs \ - -v "${BASE_DIR}/trust_store_output":/opt/certs/output \ - feasibility-deploy-create-trust-store diff --git a/util/certs/trust_store_output/.gitkeep b/util/certs/trust_store_output/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/util/certs/your_certs/.gitkeep b/util/certs/your_certs/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/util/checks/dsf-check.sh b/util/checks/dsf-check.sh deleted file mode 100755 index 25d1145..0000000 --- a/util/checks/dsf-check.sh +++ /dev/null @@ -1,255 +0,0 @@ -#!/usr/bin/env bash - -function fdpg_connection { -read -dr '' USAGE << EOF -Checks whether the connection to the FDPG can be established. - -Usage: ./dsf-check fdpg-connection --cacert --cert --key --connect-to -Flags: - --cacert Path to a PEM formatted file containing trusted CA certificates. Necessary when trying to connect to an FDPG instance serving a self-signed certificate. - --cert Path to a PEM formatted client certificate to authenticate yourself against the FDPG instance. - --key Path to a private key file associated with the client certificate to authenticate yourself against the FDPG instance. - --connect-to URL to an FDPG instance to run the check against. (Default: https://dsf.forschen-fuer-gesundheit.de/fhir) -EOF - -CACERT='' -CERT='' -KEY='' -CONNECT_TO="https://dsf.forschen-fuer-gesundheit.de/fhir" - -while test $# -gt 0; do - case "$1" in - --cacert) - shift - if test $# -gt 0; then - export CACERT=$1 - else - echo "No path to a file containing trusted CA certificates specified." - echo "${USAGE}" - exit 1 - fi - shift - ;; - --cert) - shift - if test $# -gt 0; then - export CERT=$1 - else - echo "No path to a client certificate specified." - echo "${USAGE}" - exit 1 - fi - shift - ;; - --key) - shift - if test $# -gt 0; then - export KEY=$1 - else - echo "No path to the private key, associated with the client certificate, specified." - echo "${USAGE}" - exit 1 - fi - shift - ;; - --connect-to) - shift - if test $# -gt 0; then - CONNECT_TO=$1 - else - echo "No URL target specified." - echo "${USAGE}" - exit 1 - fi - shift - ;; - help|--help|-h) echo "${USAGE}";; - *) echo "${USAGE}"; exit 1;; - - esac -done - -COMMAND_FLAGS="" -if [[ -n "${CACERT}" ]]; then - COMMAND_FLAGS="${COMMAND_FLAGS} --cacert ${CACERT}" -fi -if [[ -n "${CERT}" ]]; then - COMMAND_FLAGS="${COMMAND_FLAGS} --cert ${CERT}" -fi -if [[ -n "${KEY}" ]]; then - COMMAND_FLAGS="${COMMAND_FLAGS} --key ${KEY}" -fi -if [[ ! "${CONNECT_TO}" == */ ]]; then - CONNECT_TO="${CONNECT_TO}/" -fi - -STATUS_CODE=$(curl -s --write-out "%{http_code}" -H "Accept: application/fhir+json" "${COMMAND_FLAGS}" "${CONNECT_TO}"metadata) -if [[ ${STATUS_CODE} -ne 200 ]]; then - echo "FAILED" - exit 1 -else - echo "SUCCESS" -fi -} - - -function result { -read -dr '' USAGE << EOF -Gets the result of a specific query run from the FHIR inbox of a site (DIC). The query is uniquely identified by -the specified business key. - -Usage: ./dsf-check result --cacert --cert --key --connect-to --dic-identifier business-key -Flags: - --cacert Path to a PEM formatted file containing trusted CA certificates. Necessary when trying to connect to an FDPG instance serving a self-signed certificate. - --cert Path to a PEM formatted client certificate to authenticate yourself against the FDPG instance. - --key Path to a private key file associated with the client certificate to authenticate yourself against the FDPG instance. - --connect-to URL to an FDPG instance to run the check against. (Default: https://dsf.forschen-fuer-gesundheit.de/fhir) - --dic-identifier DSF specific string for identifying a participating site (DIC). -EOF - -CACERT='' -CERT='' -KEY='' -DIC_IDENTIFIER='' -CONNECT_TO="https://dsf.forschen-fuer-gesundheit.de/fhir" - -while test $# -gt 0; do - case "$1" in - --cacert) - shift - if test $# -gt 0; then - export CACERT=$1 - else - echo "No path to a file containing trusted CA certificates specified." - echo "${USAGE}" - exit 1 - fi - shift - ;; - --cert) - shift - if test $# -gt 0; then - export CERT=$1 - else - echo "No path to a client certificate specified." - echo "${USAGE}" - exit 1 - fi - shift - ;; - --key) - shift - if test $# -gt 0; then - export KEY=$1 - else - echo "No path to the private key, associated with the client certificate, specified." - echo "${USAGE}" - exit 1 - fi - shift - ;; - --connect-to) - shift - if test $# -gt 0; then - CONNECT_TO=$1 - else - echo "No URL target specified." - echo "${USAGE}" - exit 1 - fi - shift - ;; - --dic-identifier) - shift - if test $# -gt 0; then - DIC_IDENTIFIER=$1 - else - echo "No DIC identifier specified." - echo "${USAGE}" - exit 1 - fi - shift - ;; - help|--help|-h) echo "${USAGE}";; - --*) echo "${USAGE}"; exit 1;; - *) - BUSINESS_KEY=$1 - shift - ;; - - esac -done - -if [[ -z "${DIC_IDENTIFIER}" ]]; then - echo "No DIC identifier specified." - echo "${USAGE}" - exit 1 -fi - -COMMAND_FLAGS="" -if [[ -n "${CACERT}" ]]; then - COMMAND_FLAGS="${COMMAND_FLAGS} --cacert ${CACERT}" -fi -if [[ -n "${CERT}" ]]; then - COMMAND_FLAGS="${COMMAND_FLAGS} --cert ${CERT}" -fi -if [[ -n "${KEY}" ]]; then - COMMAND_FLAGS="${COMMAND_FLAGS} --key ${KEY}" -fi -if [[ ! "${CONNECT_TO}" == */ ]]; then - CONNECT_TO="${CONNECT_TO}/" -fi - -CORRELATING_TASK_URL=$(curl -s -H "Accept: application/fhir+json" "${COMMAND_FLAGS}" "${CONNECT_TO}Task?_sort=-_lastUpdated" | jq --arg bkey "${BUSINESS_KEY}" --arg dicid "${DIC_IDENTIFIER}" -r '.entry[] | select(.resource | .input[] | .type.coding[0].code == "business-key" and .valueString == $bkey) | select(.resource.requester.identifier.value == $dicid) | .fullUrl') - -if [[ -z "${CORRELATING_TASK_URL}" ]]; then - echo "Could not find a corresponding task." - exit 2 -fi - -CORRELATING_TASK=$(curl -s -H "Accept: application/fhir+json" "${COMMAND_FLAGS}" "${CORRELATING_TASK_URL}") -TASK_ID=$(echo "${CORRELATING_TASK}" | jq -r .id) -TASK_STATUS=$(echo "${CORRELATING_TASK}" | jq -r .status) -MEASURE_REPORT_REF=$(echo "${CORRELATING_TASK}" | jq -r 'select(.input[] | .type.coding[0].code == "message-name" and .valueString == "feasibilitySingleDicResultMessage") | .input[] | select(.type.coding[0].code == "measure-report-reference") | .valueReference.reference') - -if [[ -z "${MEASURE_REPORT_REF}" ]]; then - echo "Could not find a corresponding measure report." - exit 2 -fi - -MEASURE_REPORT=$(curl -s -H "Accept: application/fhir+json" "${COMMAND_FLAGS}" "${MEASURE_REPORT_REF}") -MEASURE_REPORT_ID=$(echo "${MEASURE_REPORT}" | jq -r .id) -MEASURE_REPORT_POPULATION_COUNT=$(echo "${MEASURE_REPORT}" | jq -r '.group[] | select(has("population")) | .population[] | select(.code.coding[0].code == "initial-population") | .count') - -echo -e "Task ID: \t\t${TASK_ID}" -echo -e "Task Status: \t\t${TASK_STATUS}" -echo -e "Business Key: \t\t${BUSINESS_KEY}" -echo -e "Measure Report ID: \t${MEASURE_REPORT_ID}" -echo -e "Population Count: \t${MEASURE_REPORT_POPULATION_COUNT}" -} - -# The main entrypoint of this script. -function entrypoint() { -read -rd '' USAGE << EOF -Command line utility to check a DSF installation. - -Dependencies: - curl For running the actual requests. See https://github.com/curl/curl - jq For operating on data in JSON format. See https://github.com/stedolan/jq - -Usage: ./dsf-check [command] -Commands are - fdpg-connection Checks whether the connection to the FDPG can be established. - result Checks results from a distributed query run for your site (DIC). - help Shows help for commands. -EOF - - case "$1" in - fdpg-connection) fdpg_connection "${@:2}";; - result) result "${@:2}";; - help|--help|-h) echo "${USAGE}";; - *) echo "${USAGE}"; exit 1;; - esac -} - -entrypoint "${@:1}" From b37c67ef73d9920956f2ffa9862e59a545869201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 17:52:21 +0200 Subject: [PATCH 088/118] update backend db --- feasibility-portal/backend/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index a38d56b..39d1b07 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -71,7 +71,7 @@ services: - ${FEASIBILITY_BACKEND_CERTS_PATH:-../secrets}:/opt/codex-feasibility-security feasibility-gui-backend-db: - image: 'postgres:13.1-alpine' + image: 'postgres:15-alpine' ports: - ${FEASIBILITY_BACKEND_DB_PORT:-127.0.0.1:5432}:5432 environment: From 0291f2d229ff94908890ad458c29eea0583a38b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 20:51:24 +0200 Subject: [PATCH 089/118] remove unnecessary .pem example files --- .gitignore | 1 + auth/cert.pem.example | 29 ----------- auth/key.pem.example | 52 ------------------- .../start-feasibility-portal-local.sh | 3 -- secrets/ca.pem | 29 +++++++++++ 5 files changed, 30 insertions(+), 84 deletions(-) delete mode 100644 auth/cert.pem.example delete mode 100644 auth/key.pem.example create mode 100644 secrets/ca.pem diff --git a/.gitignore b/.gitignore index 5b92ec1..9e22373 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ start-zars-and-num-node-all.sh .env deploy-config.json *.pem +!ca.pem .htpasswd \ No newline at end of file diff --git a/auth/cert.pem.example b/auth/cert.pem.example deleted file mode 100644 index 2efd9ee..0000000 --- a/auth/cert.pem.example +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFCzCCAvOgAwIBAgIUWoVK9ABtDTEnmyV7kI2ymrPzlDMwDQYJKoZIhvcNAQEL -BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTIxMTEwOTE0NTIxN1oYDzIyOTUw -ODI0MTQ1MjE3WjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDmg8xMXKhrCjS68ZSwJQHfwMTddJD0yPNp8q99tMOs -GPJAb1kALKmyXMHJKkbO+7RIJAL8iE74ypcs3peyuux8+RlIExwNJM7xAgWr6Tsq -X7eGgp/1qZxUFRfv2EUjIX3+WQ+Tk764wO2n0O2qO/ORbTTq8v2UJ/5Oy5Kr+sHR -O26err20FJBDjLe5khyayA2j3NhYwADhaS82H8pLSQazxjw4JTOV3fV1X/ILtNrL -3N5N0iDV1zEbCqhT/DKy5VIdVcuNa4iGjvg2RDCSoFT8MWCwUSa8RqgRaYgYNnIE -+4C/DOs9cN/PgyNT0QOT/DL781qVzmnNXDJi0Gc5EjlDsllYBh5r5i63R4DjkXFV -zm2vuOsq4/bCMCmwuQxeq4Sp6rzap5jOhZBiPo6DxlmEpZIvT5veVhJxSQw+fXmr -/TWS5j+xawx+LuULuViFYuY0OSk7b5LPrQEQ3Jf/DcWxDzxYYP/RRhGc/gSA3xEq -SZB8B56szBax6E9HqZx6f8bWWeoNam427bTq9Kd1HL4AhzQoWwsMSgmItMZNKPxI -bRtxBqe54ZqEOpG74qdIdmT2DTvaIVP1t1Wms9kgJqpr2942Y8FGA0n6gFpKyies -Sj+XWslywKrvaU30oWZrKGRpd50NPmRj0jzRioii3QavmfiPjlJcRs76Q+YYo0Ko -qQIDAQABo1MwUTAdBgNVHQ4EFgQU92BGBU0qDcAKADrjWo09AYnqwiAwHwYDVR0j -BBgwFoAU92BGBU0qDcAKADrjWo09AYnqwiAwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQsFAAOCAgEAof09zqk+b5Cs6lW8c/nkpDg3V+lE3Wr7Vg1pts4OUsHK -ssxtNU8Oxt5wRWYShhbvl1XStwvf3OBPdZ9m3us7Uv/4CuDfMHbcsXMOzgYjsfkZ -tBuYwbb4ZqhVw73B6o0Qns2dtmFHlwPPFg8pVRLXYmGufJ7g40wdUd9hdgDbag/t -4/ha417wqHNUikYXWFIRCA6NSeqweKuJzN0vrWPOSfGX4cQbfia3NxiSyGzuADCi -qsOfcViXvgORgUvW6r8xJ4JZ6/UvTeMCAb4TSD3IPt+kPop4AFS9CytZxjAM2Miz -5Lzn4eEsBo/WdJZml0uC04Ovos+IFsqxMETSvJ6E4w8Bv8U96/ZUYVLsWjDbduXk -L+SWNp01eBGxBe7BoWMBkcMldQBW4GdHM/tfVGH3ASVbV3cDDRZ9MJw7JHI00SRD -fcYEKku+eLrANisP0Kjgl9/cYD73zOH13QDrm4YWu8OMO+CMWpCue3ySPsVuVMGX -8UmMCd7/iBqIveamcc4ksPad+bKQTC+tkNZ1pCVJt+QquuQZF3YPHYv3OyKQVvbL -wvCwlHcwmLw2qS7JoUDjiue14SYT1zJhtwuFa/29BqhiI0Hof2LehJYTaCa+o6G5 -MGRRlLezhRQhinw5xPRfWj588zB2ZbiR9nurMIc4RAji+pNPXoraXpoT3H4nSfU= ------END CERTIFICATE----- diff --git a/auth/key.pem.example b/auth/key.pem.example deleted file mode 100644 index 9f9e63b..0000000 --- a/auth/key.pem.example +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -J48aZZreEvcSzCyzsc5cntuQmiIF ------END PRIVATE KEY----- diff --git a/feasibility-portal/start-feasibility-portal-local.sh b/feasibility-portal/start-feasibility-portal-local.sh index 18f1e71..c594a45 100755 --- a/feasibility-portal/start-feasibility-portal-local.sh +++ b/feasibility-portal/start-feasibility-portal-local.sh @@ -19,6 +19,3 @@ fi docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/keycloak/docker-compose.yml up -d docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/backend/docker-compose.yml up -d docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/gui/docker-compose.yml up -d - - - diff --git a/secrets/ca.pem b/secrets/ca.pem new file mode 100644 index 0000000..d817e45 --- /dev/null +++ b/secrets/ca.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE/TCCAuWgAwIBAgIGAX0zqQXAMA0GCSqGSIb3DQEBDQUAMBwxCzAJBgNVBAYT +AkRFMQ0wCwYDVQQDDARUZXN0MB4XDTIxMTExODE1MjczNFoXDTMxMTExODE1Mjcz +NFowHDELMAkGA1UEBhMCREUxDTALBgNVBAMMBFRlc3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCEcTJ8fEGvYVH05Us0COJWx+Frde4m83+uM4knLZOT +BeCcsLck8ImYOsmGnuCeE2s/NXYup0amBCnTm8N+02qlBGsTBVtbA9Q4KagvvMt+ +RzBA+XiNKzddj5+86e88Pb6vZpIHzAZTczJx9suX1sVwdhUnItJ9H4vW2NboD6GS +HUI8jkqxo2/GgsJ8EDZ2gHqueDNUfSh0hLM9OOCFPMz4frZ2X0THxq4RExWiLxap +wibzTQSUlJoawicaqNnDVNkTXxAWIVp8ZQLt2ftQI1ejsSvHp3o25Yq/g0QHWUzl +dtdNRCCWZiCn6pDZEnjEFitMgI16lEGQk9/+7EFANmu26Zzcz9mesAPlrW3f3cBP +a5OWzKATjjS+6FmBO/rclSbRwpzYYf3ZNprWHH1CXFD75My4+bpdJMgIJHMw4UKe +EOAQ8gPnQymnhDHWf6CnFF4GF5iTOmhPcgY/KNFHQKetK3Ahr3+hNEvWc6gF5keu +lyX/LKqbU1UBS6nCbkC07QRs6nUu9EWvA6MkG2fsX4IzxI5zzzm8in6lDpbZKJpG +GN4gyloSn5W07jpxCLQOx511rgDE/giqOclcClquwC1kMVw6OOVkVAsoO617SlPv +g7BEW9kQOpw+b2N+rm2PzaGzGaIpEzaHsGlGpBEY0OxJUQLfMjC9zwI3Mrjp6T1O +lwIDAQABo0UwQzAdBgNVHQ4EFgQU63O2Ad7qkE/GOId7P60sa6ge7ycwEgYDVR0T +AQH/BAgwBgEB/wIBATAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIB +ACYMVsFoJcr/by6J/D7sDZjeJF++LMc6wERy2cwOpl+pOfzbkzOqbysGZq37Z136 +bxtufzJiSRvNbyxtCfbJkMA2/RcAdXrCPyUziMgMqj1eVdJ3proVzRGRs5DNLGNB +rmvGLWxqbdWAX86AoLmYbwddM9dpF5ZVliv7vh37I6Y4To3G5SHgmRm6wk0FgA3w +27+Kj/BKpn83wZHOBA6Dld6TDDjMxl7aQUd3kcTsWp/V1sBC0m+YZJW9U7SqsMAx +3hJOuF7uMEuTTtQkWs6yzGchTi/SFJolC8vvq7SgMSCH5Qt3ySZixtp01O53O7oG +7Iywdj2kN8qwI4+yLGm+dqzkChgPqjR3DIyOFQZvYlSRgglaKU2jSipoQneg/3Wu +JE1AjciSR8lblSLFJildLejVEWJ3chrPeeKwFu0lGBQRCgcIqlnexz7mSEriKZSw +EEp36WoO9eGZ45fbJdCEnQb+Ic7hrA1Ll3C1+GsWhZ9DDCr2VhHvZ5T9khGcpG+D +3Muq869YPMq0vpuZRUmyq/6mUGpZ5E7m5d1sgFghIqywl3ZJK+qkTXu1qa6mC2gq +8Eodnd0zTtyTlr/zBZgeCypNVG9dmAIZYqNulubGkFQkK5WD6UXrWFHqT/Z8bQ5a +V8XcC/3nBZa5g8OziVi03YkUpCunaYFJyyMg8UbZBW4q +-----END CERTIFICATE----- \ No newline at end of file From 85be2a9ccf5e455a93ada8176c1f3135ff2c7a61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 20:58:15 +0200 Subject: [PATCH 090/118] remove unnecessary assets folder --- assets/feasibility-dsf-process-0.3.0.jar | Bin 92089 -> 0 bytes assets/hapi-fhir-client-5.1.0.jar | Bin 246441 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/feasibility-dsf-process-0.3.0.jar delete mode 100644 assets/hapi-fhir-client-5.1.0.jar diff --git a/assets/feasibility-dsf-process-0.3.0.jar b/assets/feasibility-dsf-process-0.3.0.jar deleted file mode 100644 index 06c8f1653c4b4159b730d45012c6052dc2115fd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92089 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 A~R3(+m|eU7gg4ap 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 Y0>*k&AUi}s5e5G60Ciy_fJ3ABAF&y_PXGV_ From 2261e98aef52b233b912f7109cbc3d382ba2756a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 21:53:32 +0200 Subject: [PATCH 091/118] update troubleshooting and flare test queries --- .../test-queries/test-condition.json | 4 +- .../test-queries/test-consent.json | 17 +++++++ .../test-queries/test-observation.json | 4 +- .../test-queries/test-patient.json | 46 ++++++++---------- .../test-queries/test-procedure.json | 4 +- .../test-queries/test-specimen.json | 24 ++-------- troubleshooting/troubleshooting.md | 48 ++++++++----------- 7 files changed, 64 insertions(+), 83 deletions(-) create mode 100644 troubleshooting/test-queries/test-consent.json diff --git a/troubleshooting/test-queries/test-condition.json b/troubleshooting/test-queries/test-condition.json index bb58122..2438efe 100644 --- a/troubleshooting/test-queries/test-condition.json +++ b/troubleshooting/test-queries/test-condition.json @@ -11,9 +11,7 @@ "version": "2021", "display": "Benigne essentielle Hypertonie" } - ], - "attributeFilters": [], - "timeRestriction": {} + ] } ] ] diff --git a/troubleshooting/test-queries/test-consent.json b/troubleshooting/test-queries/test-consent.json new file mode 100644 index 0000000..45e95d3 --- /dev/null +++ b/troubleshooting/test-queries/test-consent.json @@ -0,0 +1,17 @@ +{ + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "central-consent", + "system": "mii.abide", + "display": "MDAT wissenschaftlich nutzen - EU DSGVO Niveau" + } + ] + } + ] + ] +} \ No newline at end of file diff --git a/troubleshooting/test-queries/test-observation.json b/troubleshooting/test-queries/test-observation.json index 9da45b5..a449a53 100644 --- a/troubleshooting/test-queries/test-observation.json +++ b/troubleshooting/test-queries/test-observation.json @@ -11,8 +11,6 @@ "display": "Hämoglobin" } ], - "attributeFilters": [], - "timeRestriction": {}, "valueFilter": { "selectedConcepts": [], "type": "quantity-range", @@ -26,4 +24,4 @@ } ] ] -} \ No newline at end of file +} diff --git a/troubleshooting/test-queries/test-patient.json b/troubleshooting/test-queries/test-patient.json index fd520c5..5ba1e3a 100644 --- a/troubleshooting/test-queries/test-patient.json +++ b/troubleshooting/test-queries/test-patient.json @@ -1,33 +1,27 @@ { "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", "inclusionCriteria": [ - [ + [ + { + "termCodes": [ { - "termCodes": [ - { - "code": "gender", - "system": "mii.abide", - "display": "Geschlecht" - } - ], - "attributeFilters": [ - { - "type": "concept", - "selectedConcepts": [ - { - "code": "female", - "system": "http://hl7.org/fhir/administrative-gender", - "display": "Female" - } - ], - "attributeCode": { - "code": "gender", - "system": "mii.abide", - "display": "Geschlecht" - } - } - ] + "code": "263495000", + "system": "http://snomed.info/sct", + "display": "Geschlecht" } - ] + ], + "valueFilter": { + "selectedConcepts": [ + { + "code": "female", + "system": "http://hl7.org/fhir/administrative-gender", + "display": "Female" + } + ], + "type": "concept" + } + } + ] ] } \ No newline at end of file diff --git a/troubleshooting/test-queries/test-procedure.json b/troubleshooting/test-queries/test-procedure.json index dc7221d..d18fc6c 100644 --- a/troubleshooting/test-queries/test-procedure.json +++ b/troubleshooting/test-queries/test-procedure.json @@ -11,9 +11,7 @@ "version": "2021", "display": "Computergestützte Bilddatenanalyse mit 3D-Auswertung" } - ], - "attributeFilters": [], - "timeRestriction": {} + ] } ] ] diff --git a/troubleshooting/test-queries/test-specimen.json b/troubleshooting/test-queries/test-specimen.json index 65b568f..25a0173 100644 --- a/troubleshooting/test-queries/test-specimen.json +++ b/troubleshooting/test-queries/test-specimen.json @@ -8,28 +8,10 @@ { "code": "119364003", "system": "http://snomed.info/sct", - "version": "http://snomed.info/sct/900000000000207008/version/20210731", - "display": "Serum specimen (specimen)" + "version": "http://snomed.info/sct/900000000000207008/version/20220930", + "display": "Serum specimen" } - ], - "attributeFilters": [ - { - "selectedConcepts": [ - { - "code": "available", - "system": "http://hl7.org/fhir/specimen-status", - "display": "Available" - } - ], - "type": "concept", - "attributeCode": { - "code": "status", - "system": "mii.abide", - "display": "Status" - } - } - ], - "timeRestriction": {} + ] } ] ] diff --git a/troubleshooting/troubleshooting.md b/troubleshooting/troubleshooting.md index 5734951..67165e0 100644 --- a/troubleshooting/troubleshooting.md +++ b/troubleshooting/troubleshooting.md @@ -73,35 +73,29 @@ curl --location --request POST 'http://localhost:8084/query/execute' \ --header 'Content-Type: application/sq+json' \ --data-raw '{ "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", "inclusionCriteria": [ - [ + [ + { + "termCodes": [ { - "termCodes": [ - { - "code": "gender", - "system": "mii.abide", - "display": "Geschlecht" - } - ], - "attributeFilters": [ - { - "type": "concept", - "selectedConcepts": [ - { - "code": "female", - "system": "http://hl7.org/fhir/administrative-gender", - "display": "Female" - } - ], - "attributeCode": { - "code": "gender", - "system": "mii.abide", - "display": "Geschlecht" - } - } - ] + "code": "263495000", + "system": "http://snomed.info/sct", + "display": "Geschlecht" } - ] + ], + "valueFilter": { + "selectedConcepts": [ + { + "code": "female", + "system": "http://hl7.org/fhir/administrative-gender", + "display": "Female" + } + ], + "type": "concept" + } + } + ] ] }' ``` @@ -109,7 +103,7 @@ curl --location --request POST 'http://localhost:8084/query/execute' \ should give you an output similar to: ``` -[[["http://fhir-server:8080/fhir/Patient?gender=female"]],[]] +{"name":"intersection","operands":[{"name":"union","operands":["[base]/Patient?gender=female"]}]} ``` The FHIR search string can then be used with your FHIR Server directly, to recieve the response from the server. From 8647a9cce1f6a648287b19477d9dd6efd242302a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 22:51:45 +0200 Subject: [PATCH 092/118] add changelog --- changelog.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 changelog.md diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..5b5d038 --- /dev/null +++ b/changelog.md @@ -0,0 +1,23 @@ +# Changelog + +All notable changes to this project will be documented in this file. + + +## [2.0.0] - 2023-03-29 + +### Added + + +### Changed +- Limit amount of queries a user can post before being locked out ([#101](https://github.com/medizininformatik-initiative/feasibility-backend/pull/101)) +- Query results are no longer persisted but only kept in memory for a configurable time ([#62](https://github.com/medizininformatik-initiative/feasibility-backend/pull/62)), ([#80](https://github.com/medizininformatik-initiative/feasibility-backend/pull/80)), ([#87](https://github.com/medizininformatik-initiative/feasibility-backend/pull/87)) +- Return restricted results if certain thresholds are not surpassed ([#63](https://github.com/medizininformatik-initiative/feasibility-backend/pull/63)), ([#64](https://github.com/medizininformatik-initiative/feasibility-backend/pull/64)) +### Removed +* Remove obsolete REST endpoints under /api/v1/ ([#109](https://github.com/medizininformatik-initiative/feasibility-backend/pull/109)) +### Fixed +- Fix codesystem alias for consent ([#85](https://github.com/medizininformatik-initiative/feasibility-backend/pull/85)). +### Security +* Update Spring Boot to v3.0.5 ([#104](https://github.com/medizininformatik-initiative/feasibility-backend/pull/104)) +* Update HAPI to 6.4.2 ([#73](https://github.com/medizininformatik-initiative/feasibility-backend/pull/73)) + +The full changelog can be found [here](https://github.com/medizininformatik-initiative/feasibility-backend/milestone/4?closed=1). \ No newline at end of file From b54f200d924d72148badb5d11f33e35191428f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 22:57:38 +0200 Subject: [PATCH 093/118] add version badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ea80c5b..61cfcf8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Feasibility Deploy +[![version](https://img.shields.io/badge/version-2.0.0-green.svg)](https://semver.org) + This feasibility deployment repository offers an example deployment repository using docker-compose and official images to setup a feasibility portal (central) as well as feasibility triangle (decentral - at site) It is divided into two parts: From eec39094622f57b7149fb24fad38323d8abb7f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 22:58:58 +0200 Subject: [PATCH 094/118] update version badge link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61cfcf8..ed414e4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Feasibility Deploy -[![version](https://img.shields.io/badge/version-2.0.0-green.svg)](https://semver.org) +[![version](https://img.shields.io/badge/version-2.0.0-green.svg)](https://github.com/medizininformatik-initiative/feasibility-deploy/releases) This feasibility deployment repository offers an example deployment repository using docker-compose and official images to setup a feasibility portal (central) as well as feasibility triangle (decentral - at site) From e838106c00a1073027baefb9e87f745838cbedca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 29 Mar 2023 23:17:20 +0200 Subject: [PATCH 095/118] remove old develop keycloak dump --- .../keycloak/keycloak-dump-deploy.json | 3735 ----------------- 1 file changed, 3735 deletions(-) delete mode 100644 feasibility-portal/keycloak/keycloak-dump-deploy.json diff --git a/feasibility-portal/keycloak/keycloak-dump-deploy.json b/feasibility-portal/keycloak/keycloak-dump-deploy.json deleted file mode 100644 index e2c5d0e..0000000 --- a/feasibility-portal/keycloak/keycloak-dump-deploy.json +++ /dev/null @@ -1,3735 +0,0 @@ -[ { - "id" : "codex-develop", - "realm" : "codex-develop", - "displayName" : "codex develop realm", - "notBefore" : 0, - "revokeRefreshToken" : false, - "refreshTokenMaxReuse" : 0, - "accessTokenLifespan" : 300, - "accessTokenLifespanForImplicitFlow" : 900, - "ssoSessionIdleTimeout" : 1800, - "ssoSessionMaxLifespan" : 36000, - "ssoSessionIdleTimeoutRememberMe" : 0, - "ssoSessionMaxLifespanRememberMe" : 0, - "offlineSessionIdleTimeout" : 2592000, - "offlineSessionMaxLifespanEnabled" : false, - "offlineSessionMaxLifespan" : 5184000, - "clientSessionIdleTimeout" : 0, - "clientSessionMaxLifespan" : 0, - "clientOfflineSessionIdleTimeout" : 0, - "clientOfflineSessionMaxLifespan" : 0, - "accessCodeLifespan" : 60, - "accessCodeLifespanUserAction" : 300, - "accessCodeLifespanLogin" : 1800, - "actionTokenGeneratedByAdminLifespan" : 43200, - "actionTokenGeneratedByUserLifespan" : 300, - "enabled" : true, - "sslRequired" : "external", - "registrationAllowed" : false, - "registrationEmailAsUsername" : false, - "rememberMe" : false, - "verifyEmail" : false, - "loginWithEmailAllowed" : true, - "duplicateEmailsAllowed" : false, - "resetPasswordAllowed" : false, - "editUsernameAllowed" : false, - "bruteForceProtected" : false, - "permanentLockout" : false, - "maxFailureWaitSeconds" : 900, - "minimumQuickLoginWaitSeconds" : 60, - "waitIncrementSeconds" : 60, - "quickLoginCheckMilliSeconds" : 1000, - "maxDeltaTimeSeconds" : 43200, - "failureFactor" : 30, - "roles" : { - "realm" : [ { - "id" : "234d9488-fd72-47ff-aaaa-9182cf4e9c94", - "name" : "CODEX_USER", - "description" : "this is for development purposes only and allows full access to all features", - "composite" : false, - "clientRole" : false, - "containerId" : "codex-develop", - "attributes" : { } - }, { - "id" : "2115205d-7d9d-4588-ba58-c7119f5cadb8", - "name" : "uma_authorization", - "description" : "${role_uma_authorization}", - "composite" : false, - "clientRole" : false, - "containerId" : "codex-develop", - "attributes" : { } - }, { - "id" : "7575186c-ee41-492b-8c2c-a3046a28baaa", - "name" : "offline_access", - "description" : "${role_offline-access}", - "composite" : false, - "clientRole" : false, - "containerId" : "codex-develop", - "attributes" : { } - } ], - "client" : { - "realm-management" : [ { - "id" : "6ef2f4a0-e69f-48e2-ade5-789867a1f506", - "name" : "create-client", - "description" : "${role_create-client}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "06bce4fa-6063-4f40-b07f-57bf13ac02d6", - "name" : "view-events", - "description" : "${role_view-events}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "d3a727f9-dc79-43e0-8538-f503472a981c", - "name" : "manage-events", - "description" : "${role_manage-events}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "620cec8e-9472-49a6-9c87-0d38cb612ce6", - "name" : "manage-realm", - "description" : "${role_manage-realm}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "041baff5-7dba-4610-ac57-cbe6e322c5ee", - "name" : "query-groups", - "description" : "${role_query-groups}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "ded66799-c4cc-40eb-a41c-6664f737133a", - "name" : "view-realm", - "description" : "${role_view-realm}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "7bc76c46-fa6d-4865-8de6-541d9c5cf3be", - "name" : "manage-authorization", - "description" : "${role_manage-authorization}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "49a92e81-0540-47e0-bb65-d53439ed033d", - "name" : "manage-identity-providers", - "description" : "${role_manage-identity-providers}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "ea9b2dfb-3b8f-4091-8b21-b93cbf468e76", - "name" : "impersonation", - "description" : "${role_impersonation}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "cae8e208-6dd0-48d7-b576-1b74ee2325dc", - "name" : "view-users", - "description" : "${role_view-users}", - "composite" : true, - "composites" : { - "client" : { - "realm-management" : [ "query-users", "query-groups" ] - } - }, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "e22e2a6d-2095-4491-a7a5-fa851a260f8a", - "name" : "manage-users", - "description" : "${role_manage-users}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "0d64002a-678e-4edf-afb5-164b01e583ce", - "name" : "query-users", - "description" : "${role_query-users}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "f67c03c2-940a-4dc7-94b1-c3b02c879cc8", - "name" : "view-identity-providers", - "description" : "${role_view-identity-providers}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "5d80b412-33f2-4829-bf93-654a3a1d4729", - "name" : "query-realms", - "description" : "${role_query-realms}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "1432e629-14a9-4cd5-a7e8-eb2604596bca", - "name" : "query-clients", - "description" : "${role_query-clients}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "b1f9fa5d-6c81-462c-b057-84e95428afc1", - "name" : "manage-clients", - "description" : "${role_manage-clients}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "b469f4e7-4488-4562-969f-a00e4d27a6af", - "name" : "realm-admin", - "description" : "${role_realm-admin}", - "composite" : true, - "composites" : { - "client" : { - "realm-management" : [ "create-client", "view-events", "manage-realm", "manage-events", "query-groups", "view-realm", "manage-identity-providers", "manage-authorization", "view-users", "impersonation", "manage-users", "query-users", "view-identity-providers", "query-realms", "query-clients", "manage-clients", "view-authorization", "view-clients" ] - } - }, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "39334f25-7fac-4535-b37b-45bd4b9e30ca", - "name" : "view-authorization", - "description" : "${role_view-authorization}", - "composite" : false, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - }, { - "id" : "53d2e35b-1391-455a-89dc-f91566062994", - "name" : "view-clients", - "description" : "${role_view-clients}", - "composite" : true, - "composites" : { - "client" : { - "realm-management" : [ "query-clients" ] - } - }, - "clientRole" : true, - "containerId" : "97968df9-46f9-4444-9863-e200f600bc7b", - "attributes" : { } - } ], - "feasibility-gui" : [ ], - "security-admin-console" : [ ], - "diz-uker" : [ ], - "admin-cli" : [ ], - "account-console" : [ ], - "broker" : [ { - "id" : "bd3f8312-52f1-4bc9-b708-152285b87b94", - "name" : "read-token", - "description" : "${role_read-token}", - "composite" : false, - "clientRole" : true, - "containerId" : "f3955d64-565f-46c3-bf0d-2e8a9716e504", - "attributes" : { } - } ], - "account" : [ { - "id" : "c078d5c6-80bc-4811-b31a-24f54216d22b", - "name" : "delete-account", - "description" : "${role_delete-account}", - "composite" : false, - "clientRole" : true, - "containerId" : "58de4034-0047-40f4-a0c7-7d746cd19d72", - "attributes" : { } - }, { - "id" : "3b4e41be-e77d-4a7a-a82a-90a064c0b3ed", - "name" : "manage-consent", - "description" : "${role_manage-consent}", - "composite" : true, - "composites" : { - "client" : { - "account" : [ "view-consent" ] - } - }, - "clientRole" : true, - "containerId" : "58de4034-0047-40f4-a0c7-7d746cd19d72", - "attributes" : { } - }, { - "id" : "f45d884b-1c5a-44bb-b617-1fc59ad30ff2", - "name" : "view-applications", - "description" : "${role_view-applications}", - "composite" : false, - "clientRole" : true, - "containerId" : "58de4034-0047-40f4-a0c7-7d746cd19d72", - "attributes" : { } - }, { - "id" : "a69ead20-97b1-47ac-b3e1-ac89d180802b", - "name" : "view-profile", - "description" : "${role_view-profile}", - "composite" : false, - "clientRole" : true, - "containerId" : "58de4034-0047-40f4-a0c7-7d746cd19d72", - "attributes" : { } - }, { - "id" : "25cc13e9-4b87-40c0-b894-4ff14a760581", - "name" : "manage-account-links", - "description" : "${role_manage-account-links}", - "composite" : false, - "clientRole" : true, - "containerId" : "58de4034-0047-40f4-a0c7-7d746cd19d72", - "attributes" : { } - }, { - "id" : "173548bf-ff7b-49a4-99f2-be38c0be0453", - "name" : "manage-account", - "description" : "${role_manage-account}", - "composite" : true, - "composites" : { - "client" : { - "account" : [ "manage-account-links" ] - } - }, - "clientRole" : true, - "containerId" : "58de4034-0047-40f4-a0c7-7d746cd19d72", - "attributes" : { } - }, { - "id" : "93c6eaad-2278-4617-8ac2-b9838a4fc8a6", - "name" : "view-consent", - "description" : "${role_view-consent}", - "composite" : false, - "clientRole" : true, - "containerId" : "58de4034-0047-40f4-a0c7-7d746cd19d72", - "attributes" : { } - } ] - } - }, - "groups" : [ { - "id" : "cce70ab0-7355-4210-baf7-93d07343f852", - "name" : "codex-develop", - "path" : "/codex-develop", - "attributes" : { }, - "realmRoles" : [ "CODEX_USER" ], - "clientRoles" : { }, - "subGroups" : [ ] - } ], - "defaultRoles" : [ "uma_authorization", "offline_access" ], - "requiredCredentials" : [ "password" ], - "otpPolicyType" : "totp", - "otpPolicyAlgorithm" : "HmacSHA1", - "otpPolicyInitialCounter" : 0, - "otpPolicyDigits" : 6, - "otpPolicyLookAheadWindow" : 1, - "otpPolicyPeriod" : 30, - "otpSupportedApplications" : [ "FreeOTP", "Google Authenticator" ], - "webAuthnPolicyRpEntityName" : "keycloak", - "webAuthnPolicySignatureAlgorithms" : [ "ES256" ], - "webAuthnPolicyRpId" : "", - "webAuthnPolicyAttestationConveyancePreference" : "not specified", - "webAuthnPolicyAuthenticatorAttachment" : "not specified", - "webAuthnPolicyRequireResidentKey" : "not specified", - "webAuthnPolicyUserVerificationRequirement" : "not specified", - "webAuthnPolicyCreateTimeout" : 0, - "webAuthnPolicyAvoidSameAuthenticatorRegister" : false, - "webAuthnPolicyAcceptableAaguids" : [ ], - "webAuthnPolicyPasswordlessRpEntityName" : "keycloak", - "webAuthnPolicyPasswordlessSignatureAlgorithms" : [ "ES256" ], - "webAuthnPolicyPasswordlessRpId" : "", - "webAuthnPolicyPasswordlessAttestationConveyancePreference" : "not specified", - "webAuthnPolicyPasswordlessAuthenticatorAttachment" : "not specified", - "webAuthnPolicyPasswordlessRequireResidentKey" : "not specified", - "webAuthnPolicyPasswordlessUserVerificationRequirement" : "not specified", - "webAuthnPolicyPasswordlessCreateTimeout" : 0, - "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister" : false, - "webAuthnPolicyPasswordlessAcceptableAaguids" : [ ], - "users" : [ { - "id" : "654df1f8-3025-4351-b79d-c067c7021f60", - "createdTimestamp" : 1609928667083, - "username" : "codex-developer", - "enabled" : true, - "totp" : false, - "emailVerified" : false, - "firstName" : "Codex", - "lastName" : "Developer", - "credentials" : [ { - "id" : "129eab44-8297-488c-93cd-2db12ea13e31", - "type" : "password", - "createdDate" : 1611911996052, - "secretData" : "{\"value\":\"oQIr2jQwagVXu4ryvs2OLiRTGyTndUxsYXbIbN5Sf20sWTe/9hvoXL5oAHndidSJPg4gvMKa01eEQKsbUl/j9g==\",\"salt\":\"SB3h9+/wNADO4Vsh4myTmw==\",\"additionalParameters\":{}}", - "credentialData" : "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}" - } ], - "disableableCredentialTypes" : [ ], - "requiredActions" : [ ], - "realmRoles" : [ "uma_authorization", "offline_access" ], - "clientRoles" : { - "account" : [ "view-profile", "manage-account" ] - }, - "notBefore" : 0, - "groups" : [ "/codex-develop" ] - }, { - "id" : "e1d5f479-21fb-4838-b79b-1138f283ac9f", - "createdTimestamp" : 1611752991562, - "username" : "service-account-diz-uker", - "enabled" : true, - "totp" : false, - "emailVerified" : false, - "serviceAccountClientId" : "diz-uker", - "credentials" : [ ], - "disableableCredentialTypes" : [ ], - "requiredActions" : [ ], - "realmRoles" : [ "uma_authorization", "offline_access" ], - "clientRoles" : { - "account" : [ "view-profile", "manage-account" ] - }, - "notBefore" : 0, - "groups" : [ ] - } ], - "scopeMappings" : [ { - "clientScope" : "offline_access", - "roles" : [ "offline_access" ] - } ], - "clientScopeMappings" : { - "account" : [ { - "client" : "account-console", - "roles" : [ "manage-account" ] - } ] - }, - "clients" : [ { - "id" : "58de4034-0047-40f4-a0c7-7d746cd19d72", - "clientId" : "account", - "name" : "${client_account}", - "rootUrl" : "${authBaseUrl}", - "baseUrl" : "/realms/codex-develop/account/", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "**********", - "defaultRoles" : [ "view-profile", "manage-account" ], - "redirectUris" : [ "/realms/codex-develop/account/*" ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "role_list", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "3787bcaa-e3cf-47fc-a103-01bad3079cfd", - "clientId" : "account-console", - "name" : "${client_account-console}", - "rootUrl" : "${authBaseUrl}", - "baseUrl" : "/realms/codex-develop/account/", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "**********", - "redirectUris" : [ "/realms/codex-develop/account/*" ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { - "pkce.code.challenge.method" : "S256" - }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "protocolMappers" : [ { - "id" : "f2c4a481-3653-4873-b2d8-9f43a010c7d3", - "name" : "audience resolve", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-audience-resolve-mapper", - "consentRequired" : false, - "config" : { } - } ], - "defaultClientScopes" : [ "web-origins", "role_list", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "104a7fea-42b6-494f-b1c0-0e6bd39e80e2", - "clientId" : "admin-cli", - "name" : "${client_admin-cli}", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "**********", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : false, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : true, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "role_list", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "f3955d64-565f-46c3-bf0d-2e8a9716e504", - "clientId" : "broker", - "name" : "${client_broker}", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "**********", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "role_list", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "b7c8fb32-3b2c-4b68-ac16-3dd7fd52c0db", - "clientId" : "diz-uker", - "name" : "DIZ Klinikum Erlangen", - "surrogateAuthRequired" : false, - "enabled" : false, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "4f390e12-487f-402f-9c63-86c1476ed462", - "redirectUris" : [ "*" ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : true, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { - "saml.assertion.signature" : "false", - "saml.force.post.binding" : "false", - "saml.multivalued.roles" : "false", - "saml.encrypt" : "false", - "backchannel.logout.revoke.offline.tokens" : "false", - "saml.server.signature" : "false", - "saml.server.signature.keyinfo.ext" : "false", - "exclude.session.state.from.auth.response" : "false", - "backchannel.logout.session.required" : "true", - "client_credentials.use_refresh_token" : "false", - "saml_force_name_id_format" : "false", - "saml.client.signature" : "false", - "tls.client.certificate.bound.access.tokens" : "false", - "saml.authnstatement" : "false", - "display.on.consent.screen" : "false", - "saml.onetimeuse.condition" : "false" - }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : true, - "nodeReRegistrationTimeout" : -1, - "protocolMappers" : [ { - "id" : "7d24f353-3c53-4999-a751-9fd4e68af32b", - "name" : "Client Host", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usersessionmodel-note-mapper", - "consentRequired" : false, - "config" : { - "user.session.note" : "clientHost", - "userinfo.token.claim" : "true", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "clientHost", - "jsonType.label" : "String" - } - }, { - "id" : "d824e8bd-4575-4ec0-987b-781eea1eb344", - "name" : "site-name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-hardcoded-claim-mapper", - "consentRequired" : false, - "config" : { - "claim.value" : "Universitätsklinikum Erlangen", - "userinfo.token.claim" : "false", - "id.token.claim" : "false", - "access.token.claim" : "true", - "claim.name" : "site-name", - "jsonType.label" : "String", - "access.tokenResponse.claim" : "false" - } - }, { - "id" : "a36c9375-c3cc-478a-b346-688c3e1ecf39", - "name" : "Client ID", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usersessionmodel-note-mapper", - "consentRequired" : false, - "config" : { - "user.session.note" : "clientId", - "userinfo.token.claim" : "true", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "clientId", - "jsonType.label" : "String" - } - }, { - "id" : "8702c166-1c0f-4a4b-a547-a596a4fb604c", - "name" : "Client IP Address", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usersessionmodel-note-mapper", - "consentRequired" : false, - "config" : { - "user.session.note" : "clientAddress", - "userinfo.token.claim" : "true", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "clientAddress", - "jsonType.label" : "String" - } - }, { - "id" : "97b2a224-abda-478b-9a5c-52e3c80275ce", - "name" : "site-id", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-hardcoded-claim-mapper", - "consentRequired" : false, - "config" : { - "claim.value" : "uker", - "userinfo.token.claim" : "false", - "id.token.claim" : "false", - "access.token.claim" : "true", - "claim.name" : "site-id", - "jsonType.label" : "String", - "access.tokenResponse.claim" : "false" - } - } ], - "defaultClientScopes" : [ "web-origins", "role_list", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "d2b31de6-0333-468a-a104-2ff8f759d786", - "clientId" : "feasibility-gui", - "name" : "feasibility gui", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "**********", - "redirectUris" : [ "/home", "/api" ], - "webOrigins" : [ "+" ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : true, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { - "saml.assertion.signature" : "false", - "saml.force.post.binding" : "false", - "saml.multivalued.roles" : "false", - "saml.encrypt" : "false", - "backchannel.logout.revoke.offline.tokens" : "false", - "saml.server.signature" : "false", - "saml.server.signature.keyinfo.ext" : "false", - "exclude.session.state.from.auth.response" : "false", - "backchannel.logout.session.required" : "true", - "client_credentials.use_refresh_token" : "false", - "saml_force_name_id_format" : "false", - "saml.client.signature" : "false", - "tls.client.certificate.bound.access.tokens" : "false", - "saml.authnstatement" : "false", - "display.on.consent.screen" : "false", - "saml.onetimeuse.condition" : "false" - }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : true, - "nodeReRegistrationTimeout" : -1, - "protocolMappers" : [ { - "id" : "3c9dc1e7-63c0-4d5f-add7-a0e4443999c7", - "name" : "groups", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-realm-role-mapper", - "consentRequired" : false, - "config" : { - "multivalued" : "true", - "userinfo.token.claim" : "true", - "user.attribute" : "foo", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "groups", - "jsonType.label" : "String" - } - } ], - "defaultClientScopes" : [ "web-origins", "role_list", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "97968df9-46f9-4444-9863-e200f600bc7b", - "clientId" : "realm-management", - "name" : "${client_realm-management}", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "**********", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : true, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "role_list", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "cdd22346-0e4a-449b-879f-d9ba7b90e12c", - "clientId" : "security-admin-console", - "name" : "${client_security-admin-console}", - "rootUrl" : "${authAdminUrl}", - "baseUrl" : "/admin/codex-develop/console/", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "**********", - "redirectUris" : [ "/admin/codex-develop/console/*" ], - "webOrigins" : [ "+" ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { - "pkce.code.challenge.method" : "S256" - }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "protocolMappers" : [ { - "id" : "5dce29d4-cbb8-4936-b847-8581717e98e8", - "name" : "locale", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "locale", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "locale", - "jsonType.label" : "String" - } - } ], - "defaultClientScopes" : [ "web-origins", "role_list", "profile", "roles", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - } ], - "clientScopes" : [ { - "id" : "ebd9ef35-eef3-4173-ae10-68e31431543c", - "name" : "address", - "description" : "OpenID Connect built-in scope: address", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${addressScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "c28c14c3-eaaf-4b35-bb27-47e6a0082221", - "name" : "address", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-address-mapper", - "consentRequired" : false, - "config" : { - "user.attribute.formatted" : "formatted", - "user.attribute.country" : "country", - "user.attribute.postal_code" : "postal_code", - "userinfo.token.claim" : "true", - "user.attribute.street" : "street", - "id.token.claim" : "true", - "user.attribute.region" : "region", - "access.token.claim" : "true", - "user.attribute.locality" : "locality" - } - } ] - }, { - "id" : "7076f74a-d3ca-4358-ac4e-4327fb6abccc", - "name" : "email", - "description" : "OpenID Connect built-in scope: email", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${emailScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "2154d906-8036-47f3-bdc8-95168bbf98fb", - "name" : "email verified", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "emailVerified", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "email_verified", - "jsonType.label" : "boolean" - } - }, { - "id" : "addbcb30-55d6-4719-912f-6fd3ba096608", - "name" : "email", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "email", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "email", - "jsonType.label" : "String" - } - } ] - }, { - "id" : "aa7a47ca-fb6c-4e68-a958-e2c7c0df4cb6", - "name" : "microprofile-jwt", - "description" : "Microprofile - JWT built-in scope", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "false" - }, - "protocolMappers" : [ { - "id" : "e914b43f-8809-44b9-a263-d833a4abbb0a", - "name" : "upn", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "username", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "upn", - "jsonType.label" : "String" - } - }, { - "id" : "ac2e9505-f796-4086-8d49-d6fc112c3af6", - "name" : "groups", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-realm-role-mapper", - "consentRequired" : false, - "config" : { - "multivalued" : "true", - "userinfo.token.claim" : "true", - "user.attribute" : "foo", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "groups", - "jsonType.label" : "String" - } - } ] - }, { - "id" : "fc03e27c-af69-4555-ac90-0f798a13d662", - "name" : "offline_access", - "description" : "OpenID Connect built-in scope: offline_access", - "protocol" : "openid-connect", - "attributes" : { - "consent.screen.text" : "${offlineAccessScopeConsentText}", - "display.on.consent.screen" : "true" - } - }, { - "id" : "ecdb49aa-e141-4456-b705-2c9056b357ca", - "name" : "phone", - "description" : "OpenID Connect built-in scope: phone", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${phoneScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "54ed815a-74e9-448c-9dc4-06f58d1e8e79", - "name" : "phone number verified", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "phoneNumberVerified", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "phone_number_verified", - "jsonType.label" : "boolean" - } - }, { - "id" : "76e6bc11-144e-4b98-9844-9f22bbc1a81b", - "name" : "phone number", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "phoneNumber", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "phone_number", - "jsonType.label" : "String" - } - } ] - }, { - "id" : "217f533d-3b86-4c18-ba3f-9cd3a2ee2020", - "name" : "profile", - "description" : "OpenID Connect built-in scope: profile", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${profileScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "56a95df4-a2aa-4084-bb0c-a1c582bc49de", - "name" : "full name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-full-name-mapper", - "consentRequired" : false, - "config" : { - "id.token.claim" : "true", - "access.token.claim" : "true", - "userinfo.token.claim" : "true" - } - }, { - "id" : "cda8131f-1089-461c-b7d7-9095f9f09039", - "name" : "given name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "firstName", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "given_name", - "jsonType.label" : "String" - } - }, { - "id" : "472e35d5-bdca-4b2e-a254-a039e8d38055", - "name" : "middle name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "middleName", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "middle_name", - "jsonType.label" : "String" - } - }, { - "id" : "fc05cdc0-8af3-4ef3-9e4f-13739a27b8eb", - "name" : "updated at", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "updatedAt", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "updated_at", - "jsonType.label" : "String" - } - }, { - "id" : "e7687a07-343d-468f-94a9-eb164b116def", - "name" : "username", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "username", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "preferred_username", - "jsonType.label" : "String" - } - }, { - "id" : "24b05ecf-9e9d-4339-b0a0-a3a74d31a6b7", - "name" : "website", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "website", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "website", - "jsonType.label" : "String" - } - }, { - "id" : "1680e452-542a-4cd8-8dc3-3a1a5f81a0fd", - "name" : "nickname", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "nickname", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "nickname", - "jsonType.label" : "String" - } - }, { - "id" : "b8e7ac11-ffa9-4d9f-b69a-b943a413b712", - "name" : "gender", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "gender", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "gender", - "jsonType.label" : "String" - } - }, { - "id" : "f236c5c8-7c33-423d-8d7e-f50aad004994", - "name" : "zoneinfo", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "zoneinfo", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "zoneinfo", - "jsonType.label" : "String" - } - }, { - "id" : "6d1e7cb0-cafc-4e1a-bcff-1ad7455543a0", - "name" : "profile", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "profile", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "profile", - "jsonType.label" : "String" - } - }, { - "id" : "fe9d04d9-7335-4c1b-bb79-243ef9879adf", - "name" : "locale", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "locale", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "locale", - "jsonType.label" : "String" - } - }, { - "id" : "4566115f-0422-4f85-b725-c73e648db062", - "name" : "picture", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "picture", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "picture", - "jsonType.label" : "String" - } - }, { - "id" : "1cba28ae-5118-47e5-9f50-9389ef84486e", - "name" : "birthdate", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "birthdate", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "birthdate", - "jsonType.label" : "String" - } - }, { - "id" : "cfed8843-761c-4842-9504-51413cfd1175", - "name" : "family name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "lastName", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "family_name", - "jsonType.label" : "String" - } - } ] - }, { - "id" : "ddc37a1c-c9f0-4a65-8df4-aa4734d3eab0", - "name" : "role_list", - "description" : "SAML role list", - "protocol" : "saml", - "attributes" : { - "consent.screen.text" : "${samlRoleListScopeConsentText}", - "display.on.consent.screen" : "true" - }, - "protocolMappers" : [ { - "id" : "4f09c2b1-6fa3-4139-9ead-d117cc8f837a", - "name" : "role list", - "protocol" : "saml", - "protocolMapper" : "saml-role-list-mapper", - "consentRequired" : false, - "config" : { - "single" : "false", - "attribute.nameformat" : "Basic", - "attribute.name" : "Role" - } - } ] - }, { - "id" : "66979aa9-f8b2-4849-8047-c5c514b0894d", - "name" : "roles", - "description" : "OpenID Connect scope for add user roles to the access token", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "false", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${rolesScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "b9d4c8ed-8349-4036-a316-f5da88e1affd", - "name" : "realm roles", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-realm-role-mapper", - "consentRequired" : false, - "config" : { - "user.attribute" : "foo", - "access.token.claim" : "true", - "claim.name" : "realm_access.roles", - "jsonType.label" : "String", - "multivalued" : "true" - } - }, { - "id" : "86df93b0-95d2-4ddf-8a67-c95cd8548b4c", - "name" : "client roles", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-client-role-mapper", - "consentRequired" : false, - "config" : { - "user.attribute" : "foo", - "access.token.claim" : "true", - "claim.name" : "resource_access.${client_id}.roles", - "jsonType.label" : "String", - "multivalued" : "true" - } - }, { - "id" : "9512f843-d701-447a-81ad-c37c514f5e85", - "name" : "audience resolve", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-audience-resolve-mapper", - "consentRequired" : false, - "config" : { } - } ] - }, { - "id" : "643899ea-61ae-41e1-a16e-cfaa4f6e9cbf", - "name" : "web-origins", - "description" : "OpenID Connect scope for add allowed web origins to the access token", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "false", - "display.on.consent.screen" : "false", - "consent.screen.text" : "" - }, - "protocolMappers" : [ { - "id" : "73052104-9074-4c49-bc66-604c394b56e9", - "name" : "allowed web origins", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-allowed-origins-mapper", - "consentRequired" : false, - "config" : { } - } ] - } ], - "defaultDefaultClientScopes" : [ "profile", "web-origins", "roles", "email", "role_list" ], - "defaultOptionalClientScopes" : [ "microprofile-jwt", "address", "phone", "offline_access" ], - "browserSecurityHeaders" : { - "contentSecurityPolicyReportOnly" : "", - "xContentTypeOptions" : "nosniff", - "xRobotsTag" : "none", - "xFrameOptions" : "SAMEORIGIN", - "contentSecurityPolicy" : "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", - "xXSSProtection" : "1; mode=block", - "strictTransportSecurity" : "max-age=31536000; includeSubDomains" - }, - "smtpServer" : { }, - "eventsEnabled" : false, - "eventsListeners" : [ "jboss-logging" ], - "enabledEventTypes" : [ ], - "adminEventsEnabled" : false, - "adminEventsDetailsEnabled" : false, - "identityProviders" : [ ], - "identityProviderMappers" : [ ], - "components" : { - "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy" : [ { - "id" : "d678125d-4a20-4730-a629-939e768de9ff", - "name" : "Full Scope Disabled", - "providerId" : "scope", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { } - }, { - "id" : "a5327830-86ac-426c-a77b-00bd81dba0db", - "name" : "Max Clients Limit", - "providerId" : "max-clients", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "max-clients" : [ "200" ] - } - }, { - "id" : "f516ba7a-0b6b-44cf-8719-78ce76a349b9", - "name" : "Allowed Client Scopes", - "providerId" : "allowed-client-templates", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "allow-default-scopes" : [ "true" ] - } - }, { - "id" : "8b8c1d8c-7d01-4985-8c81-b18f671e555e", - "name" : "Trusted Hosts", - "providerId" : "trusted-hosts", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "host-sending-registration-request-must-match" : [ "true" ], - "client-uris-must-match" : [ "true" ] - } - }, { - "id" : "9c7e9418-c113-431e-a26b-4d300e44cfd6", - "name" : "Consent Required", - "providerId" : "consent-required", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { } - }, { - "id" : "129768ec-66db-4de0-9b67-dd3889e092e8", - "name" : "Allowed Protocol Mapper Types", - "providerId" : "allowed-protocol-mappers", - "subType" : "authenticated", - "subComponents" : { }, - "config" : { - "allowed-protocol-mapper-types" : [ "oidc-usermodel-attribute-mapper", "oidc-full-name-mapper", "oidc-usermodel-property-mapper", "oidc-address-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-user-attribute-mapper", "saml-user-property-mapper", "saml-role-list-mapper" ] - } - }, { - "id" : "a3b792d9-2819-496e-b48e-91dd51ec9d2a", - "name" : "Allowed Client Scopes", - "providerId" : "allowed-client-templates", - "subType" : "authenticated", - "subComponents" : { }, - "config" : { - "allow-default-scopes" : [ "true" ] - } - }, { - "id" : "e533cdfb-5afc-4685-a0a1-4a1fd6d4716d", - "name" : "Allowed Protocol Mapper Types", - "providerId" : "allowed-protocol-mappers", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-role-list-mapper", "saml-user-attribute-mapper", "saml-user-property-mapper", "oidc-address-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper" ] - } - } ], - "org.keycloak.keys.KeyProvider" : [ { - "id" : "485b2c16-6c0a-4274-9ab4-a957ed56eabd", - "name" : "hmac-generated", - "providerId" : "hmac-generated", - "subComponents" : { }, - "config" : { - "kid" : [ "3045150d-477c-41df-b1b2-a53a835e2527" ], - "secret" : [ "71ndvqgD3mUCMMp2mYc8oFPyrMQV21AoZl_8C61MjUAJ1FpW-1CEQesWrXrNRIAMPEVyYPxdFliIaWhSvgbJVQ" ], - "priority" : [ "100" ], - "algorithm" : [ "HS256" ] - } - }, { - "id" : "aa37ed27-fa9d-40bd-90c8-d26478531db6", - "name" : "rsa-generated", - "providerId" : "rsa-generated", - "subComponents" : { }, - "config" : { - "privateKey" : [ "MIIEpAIBAAKCAQEAsXqfyR80A+mKnnCwsdpU1zGx+so7CvpnIBeXcUiDWYMIZUYy0G9YSYVgLwJX7C7ZLaBjn5mfgu6lZkIvkwdxzG5EhO84jGgE+VACwf/xdf7oNDDm7QY7SNSJ04qPl0E/XZWU9BV+L1UmXE7vPGeFXiMpR0RSFABSOXZYmYcIn7NbHJfaPTQ4/oNzKC9ms3RibcqfPBmbQ/aqw6Ei8ZuMJtKZ5T9Mee2Xcpq83AA/CpmpPY0buZZcRwYxZFSrWEviyHF0j2DPWxAFmowj4htFcmu3AVRfTXJ+C/LmYvL9owrD5mD+Fj0gsL/jzp6zCFWvJJsJLclsO21G8eP5b4aEAwIDAQABAoIBAQCL15pFh/+dQYyG8TZYvTbyZObfPC+vo8RUJiKfEUrl4fhgjCKH1+QR8jTqdYc/w14+tE0rOYnVSiMrYuVHjaseMJhuwmulPmUE6QVzRS9GETd3wDyE8M8PwOBkvZ4MyU2beLxoYvMNaqOSQmQBDXSpyzzAOdYOin4/Zr/DIQIrioAD2bEPApNae9SI3TmpgK/k6i7aZ59KjnAumqUkOVtBpb6UrA7t5wD6tDW2NlhvBKblqw8g9XaSqi4VFuMx5kR7bHrr1Bs/ljFqSpaSqyuZR14pih7o7PSm/ZsmvHTv0h2djhTrBL+j044PUB364f8iOb5EE12gnwKKceu+mtGJAoGBAN4X76nVbnozzFmKwQnZFXJolnOiidmg2o2A70OdxKzsD02SftlX2EssszKZtgV+hi0CAtoqu06NUZfXUP14WypTFty7CH1RVqcCGTK7Z0A8zpK0xzgv1NQQkMgabvXyxpjJDWGaO+2QzkavEK0mePACUJBLYAbHbrnMKiuMD4P3AoGBAMyTBdTlfwy0Gmsbleu/yDaDTV2NuH+jHHUpYLRgXU1M/dhSH7rS2lWHuB1Yfoh2tXoMuMIlOTLgUM6FM5ZF8D4jhU4dbuWBTnsiJfe5OmghB84Ws6FxDRh9XhKAqAXnCA07f9l+6phg9JV4NCwCprmH578J70Zeo6Zjf7OU2yVVAoGBALDvGtUPnyMl7xAK9b0Vv/tUjT/0ZqQFfPgslvEkWJJ2wb5IDlyymjNRmjWetZ9s7BIhPwp17qEm/rDcLb6xStfOODGDo8DKsyD8D/0Vxa0shFnmQaxmlsSXqfBw9qNkVYlU6x8t075wlZVEVSHMu55iCbLbCdZ8vZ6xo4rr21SDAoGAEBXLUpcM61HJ9fwASL4Wnvqp/Z4kEJ0horCzMtuU2nwgRX8Hkaf8lNcMCfqoUFCNKmCPsmw82Bw9Hk/o43ryTeB7Hc5ApvkI07O2qoi85+0Y8QJl816xOei5mdjV3UjyICA6iD5rcbnF4W7HI2K9+z6NYT8FulG8qluOce9VX9UCgYB7kZWeeEXT4U/sK6qBmPG8c4qrnOj1ZdBm7qOf4hVfVLdjpb9nMO+UmT+OD3HAVPHPtj7i3rD0kT0M4F5WbOXNnILHgddZngMk+NfJKFuX0/8UtN+WMgptP5hoiXg7JVlH9lTpj0prmHT1XXQ2Q2RJABXfZV5N3rTuPJp1eBJtDw==" ], - "certificate" : [ "MIICqTCCAZECBgF21ziLuTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1jb2RleC1kZXZlbG9wMB4XDTIxMDEwNjEwMjExNVoXDTMxMDEwNjEwMjI1NVowGDEWMBQGA1UEAwwNY29kZXgtZGV2ZWxvcDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALF6n8kfNAPpip5wsLHaVNcxsfrKOwr6ZyAXl3FIg1mDCGVGMtBvWEmFYC8CV+wu2S2gY5+Zn4LupWZCL5MHccxuRITvOIxoBPlQAsH/8XX+6DQw5u0GO0jUidOKj5dBP12VlPQVfi9VJlxO7zxnhV4jKUdEUhQAUjl2WJmHCJ+zWxyX2j00OP6DcygvZrN0Ym3KnzwZm0P2qsOhIvGbjCbSmeU/THntl3KavNwAPwqZqT2NG7mWXEcGMWRUq1hL4shxdI9gz1sQBZqMI+IbRXJrtwFUX01yfgvy5mLy/aMKw+Zg/hY9ILC/486eswhVrySbCS3JbDttRvHj+W+GhAMCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEADj0BiZWloTnfxSbk4CM4KEovyWwI0tEbvlNRN5OtjUjs2SusOI9vj8FmdJQhGqXnVjQ5gGVEHUXqTD/f7epugirsMqs4i5Rf4oRIHgxWDzIZiBb3rXPHS0AxkdyXh74c3fekG2rRhejaHbfBvPASSkqEBGF+1Q9UtG3186oQCWX/9kl/+rqZNixIy5nASZgQodxRPKoZo/5xiJyH+C43gijme886FI2PQ0DN26Rx0YA/5J5agoHNH96UKCbSyLC145KFUwDymUzOv85HTFL9bGalMpvynDlfa0f6mjxmprjhESY9Edk+V4WHhKRUaV9Y5v1QLl+4lX3pgaTjM+ydMA==" ], - "priority" : [ "100" ] - } - }, { - "id" : "5bbd86a4-df07-4b06-8c4e-6bf4a38caa53", - "name" : "aes-generated", - "providerId" : "aes-generated", - "subComponents" : { }, - "config" : { - "kid" : [ "630ed6ad-1a26-437a-be85-adfc6ba688eb" ], - "secret" : [ "I-1hns034JdoYP3chTbBGA" ], - "priority" : [ "100" ] - } - } ] - }, - "internationalizationEnabled" : false, - "supportedLocales" : [ ], - "authenticationFlows" : [ { - "id" : "32758648-6669-4bdf-81cf-9c888d8e4c84", - "alias" : "Account verification options", - "description" : "Method with which to verity the existing account", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "idp-email-verification", - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "ALTERNATIVE", - "priority" : 20, - "flowAlias" : "Verify Existing Account by Re-authentication", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "05521a8b-dd7b-4a11-a0ac-fd7c5680874d", - "alias" : "Authentication Options", - "description" : "Authentication options.", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "basic-auth", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "basic-auth-otp", - "requirement" : "DISABLED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-spnego", - "requirement" : "DISABLED", - "priority" : 30, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "35cc964c-6bc2-409a-8a0b-e3cbfca6acca", - "alias" : "Browser - Conditional OTP", - "description" : "Flow to determine if the OTP is required for the authentication", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-otp-form", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "5b4c25a9-fe76-470c-b31d-33b4658f4029", - "alias" : "Direct Grant - Conditional OTP", - "description" : "Flow to determine if the OTP is required for the authentication", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "direct-grant-validate-otp", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "6c774497-ef68-48ef-84a6-86d0e0f1b929", - "alias" : "First broker login - Conditional OTP", - "description" : "Flow to determine if the OTP is required for the authentication", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-otp-form", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "5e4ba039-906b-47ac-bfc1-e82b24f9f988", - "alias" : "Handle Existing Account", - "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "idp-confirm-link", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "REQUIRED", - "priority" : 20, - "flowAlias" : "Account verification options", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "f5bf93b8-db7a-4522-a3f8-ef823616b99f", - "alias" : "Reset - Conditional OTP", - "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "reset-otp", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "0423ec86-befe-475b-842a-c189bf05f68a", - "alias" : "User creation or linking", - "description" : "Flow for the existing/non-existing user alternatives", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticatorConfig" : "create unique user config", - "authenticator" : "idp-create-user-if-unique", - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "ALTERNATIVE", - "priority" : 20, - "flowAlias" : "Handle Existing Account", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "a7b8b1ef-c8cc-4dad-9939-bcbb8237f3a0", - "alias" : "Verify Existing Account by Re-authentication", - "description" : "Reauthentication of existing account", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "idp-username-password-form", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "CONDITIONAL", - "priority" : 20, - "flowAlias" : "First broker login - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "6820d842-3dd5-49e4-bd09-e36f198ee282", - "alias" : "browser", - "description" : "browser based authentication", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "auth-cookie", - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-spnego", - "requirement" : "DISABLED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "identity-provider-redirector", - "requirement" : "ALTERNATIVE", - "priority" : 25, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "ALTERNATIVE", - "priority" : 30, - "flowAlias" : "forms", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "2d01e1ea-4438-42d1-900b-f4274d6518cc", - "alias" : "clients", - "description" : "Base authentication for clients", - "providerId" : "client-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "client-secret", - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "client-jwt", - "requirement" : "ALTERNATIVE", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "client-secret-jwt", - "requirement" : "ALTERNATIVE", - "priority" : 30, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "client-x509", - "requirement" : "ALTERNATIVE", - "priority" : 40, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "65139319-eb35-4583-8136-46c08a8fff98", - "alias" : "direct grant", - "description" : "OpenID Connect Resource Owner Grant", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "direct-grant-validate-username", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "direct-grant-validate-password", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "CONDITIONAL", - "priority" : 30, - "flowAlias" : "Direct Grant - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "bd5abebe-ceea-4acb-a682-8808cb0e3ff1", - "alias" : "docker auth", - "description" : "Used by Docker clients to authenticate against the IDP", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "docker-http-basic-authenticator", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "5cacb799-e1b6-41f1-a33e-2ce79cb4fcfd", - "alias" : "first broker login", - "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticatorConfig" : "review profile config", - "authenticator" : "idp-review-profile", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "REQUIRED", - "priority" : 20, - "flowAlias" : "User creation or linking", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "16738660-38b9-4c1b-9194-886349faebc0", - "alias" : "forms", - "description" : "Username, password, otp and other auth forms.", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "auth-username-password-form", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "CONDITIONAL", - "priority" : 20, - "flowAlias" : "Browser - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "0209db8c-1ed2-4b04-9dcd-dc8ac7db1a6a", - "alias" : "http challenge", - "description" : "An authentication flow based on challenge-response HTTP Authentication Schemes", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "no-cookie-redirect", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "REQUIRED", - "priority" : 20, - "flowAlias" : "Authentication Options", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "348fb242-dc01-49c7-a4fc-8c96ac72eedc", - "alias" : "registration", - "description" : "registration flow", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "registration-page-form", - "requirement" : "REQUIRED", - "priority" : 10, - "flowAlias" : "registration form", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "c5d0b00b-4f35-4f8e-8f3e-2d0c380b88fb", - "alias" : "registration form", - "description" : "registration form", - "providerId" : "form-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "registration-user-creation", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "registration-profile-action", - "requirement" : "REQUIRED", - "priority" : 40, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "registration-password-action", - "requirement" : "REQUIRED", - "priority" : 50, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "registration-recaptcha-action", - "requirement" : "DISABLED", - "priority" : 60, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "32e0216f-79b3-40d9-a302-fc94967b13ed", - "alias" : "reset credentials", - "description" : "Reset credentials for a user if they forgot their password or something", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "reset-credentials-choose-user", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "reset-credential-email", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "reset-password", - "requirement" : "REQUIRED", - "priority" : 30, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "CONDITIONAL", - "priority" : 40, - "flowAlias" : "Reset - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "73a936d3-340d-43ab-aa5c-016862b4e0b6", - "alias" : "saml ecp", - "description" : "SAML ECP Profile Authentication Flow", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "http-basic-authenticator", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - } ], - "authenticatorConfig" : [ { - "id" : "ed2c029b-c6dc-477e-b944-1389576ad8f9", - "alias" : "create unique user config", - "config" : { - "require.password.update.after.registration" : "false" - } - }, { - "id" : "fbff98ae-f3dd-4ae8-9bef-bb3db3ca3159", - "alias" : "review profile config", - "config" : { - "update.profile.on.first.login" : "missing" - } - } ], - "requiredActions" : [ { - "alias" : "CONFIGURE_TOTP", - "name" : "Configure OTP", - "providerId" : "CONFIGURE_TOTP", - "enabled" : true, - "defaultAction" : false, - "priority" : 10, - "config" : { } - }, { - "alias" : "terms_and_conditions", - "name" : "Terms and Conditions", - "providerId" : "terms_and_conditions", - "enabled" : false, - "defaultAction" : false, - "priority" : 20, - "config" : { } - }, { - "alias" : "UPDATE_PASSWORD", - "name" : "Update Password", - "providerId" : "UPDATE_PASSWORD", - "enabled" : true, - "defaultAction" : false, - "priority" : 30, - "config" : { } - }, { - "alias" : "UPDATE_PROFILE", - "name" : "Update Profile", - "providerId" : "UPDATE_PROFILE", - "enabled" : true, - "defaultAction" : false, - "priority" : 40, - "config" : { } - }, { - "alias" : "VERIFY_EMAIL", - "name" : "Verify Email", - "providerId" : "VERIFY_EMAIL", - "enabled" : true, - "defaultAction" : false, - "priority" : 50, - "config" : { } - }, { - "alias" : "delete_account", - "name" : "Delete Account", - "providerId" : "delete_account", - "enabled" : false, - "defaultAction" : false, - "priority" : 60, - "config" : { } - }, { - "alias" : "update_user_locale", - "name" : "Update User Locale", - "providerId" : "update_user_locale", - "enabled" : true, - "defaultAction" : false, - "priority" : 1000, - "config" : { } - } ], - "browserFlow" : "browser", - "registrationFlow" : "registration", - "directGrantFlow" : "direct grant", - "resetCredentialsFlow" : "reset credentials", - "clientAuthenticationFlow" : "clients", - "dockerAuthenticationFlow" : "docker auth", - "attributes" : { - "clientOfflineSessionMaxLifespan" : "0", - "clientSessionIdleTimeout" : "0", - "clientSessionMaxLifespan" : "0", - "clientOfflineSessionIdleTimeout" : "0" - }, - "keycloakVersion" : "12.0.1", - "userManagedAccessAllowed" : false -}, { - "id" : "master", - "realm" : "master", - "displayName" : "Keycloak", - "displayNameHtml" : "
    Keycloak
    ", - "notBefore" : 0, - "revokeRefreshToken" : false, - "refreshTokenMaxReuse" : 0, - "accessTokenLifespan" : 60, - "accessTokenLifespanForImplicitFlow" : 900, - "ssoSessionIdleTimeout" : 1800, - "ssoSessionMaxLifespan" : 36000, - "ssoSessionIdleTimeoutRememberMe" : 0, - "ssoSessionMaxLifespanRememberMe" : 0, - "offlineSessionIdleTimeout" : 2592000, - "offlineSessionMaxLifespanEnabled" : false, - "offlineSessionMaxLifespan" : 5184000, - "clientSessionIdleTimeout" : 0, - "clientSessionMaxLifespan" : 0, - "clientOfflineSessionIdleTimeout" : 0, - "clientOfflineSessionMaxLifespan" : 0, - "accessCodeLifespan" : 60, - "accessCodeLifespanUserAction" : 300, - "accessCodeLifespanLogin" : 1800, - "actionTokenGeneratedByAdminLifespan" : 43200, - "actionTokenGeneratedByUserLifespan" : 300, - "enabled" : true, - "sslRequired" : "external", - "registrationAllowed" : false, - "registrationEmailAsUsername" : false, - "rememberMe" : false, - "verifyEmail" : false, - "loginWithEmailAllowed" : false, - "duplicateEmailsAllowed" : false, - "resetPasswordAllowed" : false, - "editUsernameAllowed" : false, - "bruteForceProtected" : false, - "permanentLockout" : false, - "maxFailureWaitSeconds" : 900, - "minimumQuickLoginWaitSeconds" : 60, - "waitIncrementSeconds" : 60, - "quickLoginCheckMilliSeconds" : 1000, - "maxDeltaTimeSeconds" : 43200, - "failureFactor" : 30, - "roles" : { - "realm" : [ { - "id" : "57bda7a6-32fd-4bcc-b2a5-8113b8c042fe", - "name" : "create-realm", - "description" : "${role_create-realm}", - "composite" : false, - "clientRole" : false, - "containerId" : "master", - "attributes" : { } - }, { - "id" : "6adef679-b1b7-439d-b2aa-49aadda60b04", - "name" : "offline_access", - "description" : "${role_offline-access}", - "composite" : false, - "clientRole" : false, - "containerId" : "master", - "attributes" : { } - }, { - "id" : "700d3e0d-fd5b-403e-9610-dd5d5a19256a", - "name" : "admin", - "description" : "${role_admin}", - "composite" : true, - "composites" : { - "realm" : [ "create-realm" ], - "client" : { - "codex-develop-realm" : [ "view-clients", "manage-realm", "query-clients", "view-identity-providers", "query-users", "impersonation", "view-authorization", "view-users", "query-realms", "manage-identity-providers", "manage-authorization", "create-client", "manage-users", "view-realm", "manage-clients", "query-groups", "manage-events", "view-events" ], - "master-realm" : [ "query-users", "manage-users", "create-client", "view-authorization", "query-clients", "manage-clients", "manage-identity-providers", "view-events", "manage-authorization", "query-realms", "view-identity-providers", "manage-events", "view-users", "impersonation", "manage-realm", "query-groups", "view-realm", "view-clients" ] - } - }, - "clientRole" : false, - "containerId" : "master", - "attributes" : { } - }, { - "id" : "a7a37cec-e994-4c71-bf66-85a29cb70d8d", - "name" : "uma_authorization", - "description" : "${role_uma_authorization}", - "composite" : false, - "clientRole" : false, - "containerId" : "master", - "attributes" : { } - } ], - "client" : { - "security-admin-console" : [ ], - "admin-cli" : [ ], - "account-console" : [ ], - "codex-develop-realm" : [ { - "id" : "afc419c3-3426-4d3d-b005-a53f50165acd", - "name" : "manage-identity-providers", - "description" : "${role_manage-identity-providers}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "16e2edb1-47c7-4ad9-a3a7-d2dd7f44a87a", - "name" : "query-realms", - "description" : "${role_query-realms}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "210206bc-0980-4ffb-8ae8-f8ae38b552f6", - "name" : "view-clients", - "description" : "${role_view-clients}", - "composite" : true, - "composites" : { - "client" : { - "codex-develop-realm" : [ "query-clients" ] - } - }, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "6016a0bb-5070-4e19-961b-14c12707ea1c", - "name" : "manage-authorization", - "description" : "${role_manage-authorization}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "41717978-ea98-43c1-8b29-acb11c7c9184", - "name" : "create-client", - "description" : "${role_create-client}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "c2c33c0a-14ae-4578-b285-0e3710edab53", - "name" : "manage-realm", - "description" : "${role_manage-realm}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "8f5a4222-3286-497b-a9d5-e86dd9f33ae6", - "name" : "query-clients", - "description" : "${role_query-clients}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "36fbb7a0-a949-4d42-b959-ad492512d648", - "name" : "view-identity-providers", - "description" : "${role_view-identity-providers}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "409b3327-1e3b-496a-b8fc-f1a39dc04519", - "name" : "manage-users", - "description" : "${role_manage-users}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "fbef2ef6-61af-4d95-9fd5-5525e2a55da6", - "name" : "view-realm", - "description" : "${role_view-realm}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "0eb03368-46ff-4dfe-a613-6a32fb9a30cd", - "name" : "manage-clients", - "description" : "${role_manage-clients}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "17079efd-2f96-40ba-8e59-1804b6a1560c", - "name" : "query-users", - "description" : "${role_query-users}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "119ba01e-2194-4f5b-8e7e-2c98ae303c6b", - "name" : "query-groups", - "description" : "${role_query-groups}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "83566a4c-485a-4162-850a-7cd66e47328f", - "name" : "manage-events", - "description" : "${role_manage-events}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "91f76687-eda3-4de3-a4e7-b673fa714f83", - "name" : "impersonation", - "description" : "${role_impersonation}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "703822de-32dd-4547-a072-03dfe5e0e63e", - "name" : "view-authorization", - "description" : "${role_view-authorization}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "3f6d5621-ff62-4720-b6ff-b3bc3ce70ac9", - "name" : "view-events", - "description" : "${role_view-events}", - "composite" : false, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - }, { - "id" : "cbb60aa5-fda5-462b-8be8-217833f701fe", - "name" : "view-users", - "description" : "${role_view-users}", - "composite" : true, - "composites" : { - "client" : { - "codex-develop-realm" : [ "query-groups", "query-users" ] - } - }, - "clientRole" : true, - "containerId" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "attributes" : { } - } ], - "broker" : [ { - "id" : "c4d98485-7111-4e17-a306-b82740e24679", - "name" : "read-token", - "description" : "${role_read-token}", - "composite" : false, - "clientRole" : true, - "containerId" : "ec161ab4-99bd-437d-b6ba-50a79e47f657", - "attributes" : { } - } ], - "master-realm" : [ { - "id" : "839c9904-8933-48a2-be26-0c978c36865b", - "name" : "manage-identity-providers", - "description" : "${role_manage-identity-providers}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "2ffa06a6-8860-4113-991f-4d6b9a336f9e", - "name" : "view-events", - "description" : "${role_view-events}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "37f6fe43-c5f5-4540-9509-27a43ff57640", - "name" : "manage-authorization", - "description" : "${role_manage-authorization}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "c7423289-1e8f-4aac-ae96-f1fbc9cd9ca1", - "name" : "query-users", - "description" : "${role_query-users}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "655460ce-14df-40e6-8cb4-955d7b94dcb4", - "name" : "manage-users", - "description" : "${role_manage-users}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "5232f58f-454e-409d-8415-028882985afe", - "name" : "query-realms", - "description" : "${role_query-realms}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "e10f4f4e-352d-45f6-8577-a2d37ba0d439", - "name" : "view-identity-providers", - "description" : "${role_view-identity-providers}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "ec21f8f4-5ea7-4150-8bae-d0524c4a72dd", - "name" : "impersonation", - "description" : "${role_impersonation}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "04cbf008-50fa-488e-b3a0-e3fa2e2d095d", - "name" : "manage-events", - "description" : "${role_manage-events}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "c447561d-d771-4dfc-bf70-0c3ec6ed8da6", - "name" : "view-users", - "description" : "${role_view-users}", - "composite" : true, - "composites" : { - "client" : { - "master-realm" : [ "query-users", "query-groups" ] - } - }, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "e641d44d-74c4-4490-a4a3-56332e64674a", - "name" : "manage-realm", - "description" : "${role_manage-realm}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "148a8898-c573-4b3d-a20e-50e78cf942aa", - "name" : "create-client", - "description" : "${role_create-client}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "2568b37f-9387-4841-997a-e422737a371a", - "name" : "query-groups", - "description" : "${role_query-groups}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "fe8539e0-5da5-416a-9066-ce03459ad1d1", - "name" : "view-authorization", - "description" : "${role_view-authorization}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "97b340b1-041f-4b06-bf6c-da9397df42ef", - "name" : "query-clients", - "description" : "${role_query-clients}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "0d9716dc-bfb7-4660-82fa-e0c4be846cc3", - "name" : "view-realm", - "description" : "${role_view-realm}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "0caee47f-e62b-4103-9c48-6a6fc917ff1d", - "name" : "view-clients", - "description" : "${role_view-clients}", - "composite" : true, - "composites" : { - "client" : { - "master-realm" : [ "query-clients" ] - } - }, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - }, { - "id" : "f49f14bc-c652-4dae-8a62-793e592cbb8d", - "name" : "manage-clients", - "description" : "${role_manage-clients}", - "composite" : false, - "clientRole" : true, - "containerId" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "attributes" : { } - } ], - "account" : [ { - "id" : "b518ef56-7a68-41cc-9bae-24af4aee37b9", - "name" : "manage-account", - "description" : "${role_manage-account}", - "composite" : true, - "composites" : { - "client" : { - "account" : [ "manage-account-links" ] - } - }, - "clientRole" : true, - "containerId" : "21d9d509-9e7d-47be-9bf9-63a7ff9a3bca", - "attributes" : { } - }, { - "id" : "b0adb32f-8f1f-414b-8ca6-f61508760f00", - "name" : "view-consent", - "description" : "${role_view-consent}", - "composite" : false, - "clientRole" : true, - "containerId" : "21d9d509-9e7d-47be-9bf9-63a7ff9a3bca", - "attributes" : { } - }, { - "id" : "ffc46cf6-bdf6-4b5d-ae55-41e80eccad1d", - "name" : "view-profile", - "description" : "${role_view-profile}", - "composite" : false, - "clientRole" : true, - "containerId" : "21d9d509-9e7d-47be-9bf9-63a7ff9a3bca", - "attributes" : { } - }, { - "id" : "7e305ec4-2424-4558-92a2-95c24da005cc", - "name" : "delete-account", - "description" : "${role_delete-account}", - "composite" : false, - "clientRole" : true, - "containerId" : "21d9d509-9e7d-47be-9bf9-63a7ff9a3bca", - "attributes" : { } - }, { - "id" : "4da658d4-486c-45d4-a78f-520a90e38d49", - "name" : "manage-consent", - "description" : "${role_manage-consent}", - "composite" : true, - "composites" : { - "client" : { - "account" : [ "view-consent" ] - } - }, - "clientRole" : true, - "containerId" : "21d9d509-9e7d-47be-9bf9-63a7ff9a3bca", - "attributes" : { } - }, { - "id" : "0f2a6808-7e59-40d7-90dc-24490c90cb4d", - "name" : "manage-account-links", - "description" : "${role_manage-account-links}", - "composite" : false, - "clientRole" : true, - "containerId" : "21d9d509-9e7d-47be-9bf9-63a7ff9a3bca", - "attributes" : { } - }, { - "id" : "6d18bb4f-2b04-40bc-877c-8bb6bf6076bd", - "name" : "view-applications", - "description" : "${role_view-applications}", - "composite" : false, - "clientRole" : true, - "containerId" : "21d9d509-9e7d-47be-9bf9-63a7ff9a3bca", - "attributes" : { } - } ] - } - }, - "groups" : [ ], - "defaultRoles" : [ "offline_access", "uma_authorization" ], - "requiredCredentials" : [ "password" ], - "otpPolicyType" : "totp", - "otpPolicyAlgorithm" : "HmacSHA1", - "otpPolicyInitialCounter" : 0, - "otpPolicyDigits" : 6, - "otpPolicyLookAheadWindow" : 1, - "otpPolicyPeriod" : 30, - "otpSupportedApplications" : [ "FreeOTP", "Google Authenticator" ], - "webAuthnPolicyRpEntityName" : "keycloak", - "webAuthnPolicySignatureAlgorithms" : [ "ES256" ], - "webAuthnPolicyRpId" : "", - "webAuthnPolicyAttestationConveyancePreference" : "not specified", - "webAuthnPolicyAuthenticatorAttachment" : "not specified", - "webAuthnPolicyRequireResidentKey" : "not specified", - "webAuthnPolicyUserVerificationRequirement" : "not specified", - "webAuthnPolicyCreateTimeout" : 0, - "webAuthnPolicyAvoidSameAuthenticatorRegister" : false, - "webAuthnPolicyAcceptableAaguids" : [ ], - "webAuthnPolicyPasswordlessRpEntityName" : "keycloak", - "webAuthnPolicyPasswordlessSignatureAlgorithms" : [ "ES256" ], - "webAuthnPolicyPasswordlessRpId" : "", - "webAuthnPolicyPasswordlessAttestationConveyancePreference" : "not specified", - "webAuthnPolicyPasswordlessAuthenticatorAttachment" : "not specified", - "webAuthnPolicyPasswordlessRequireResidentKey" : "not specified", - "webAuthnPolicyPasswordlessUserVerificationRequirement" : "not specified", - "webAuthnPolicyPasswordlessCreateTimeout" : 0, - "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister" : false, - "webAuthnPolicyPasswordlessAcceptableAaguids" : [ ], - "users" : [ { - "id" : "d30a9975-4a2b-4feb-9602-7d29e7c639e6", - "createdTimestamp" : 1609928576419, - "username" : "admin", - "enabled" : true, - "totp" : false, - "emailVerified" : false, - "credentials" : [ { - "id" : "ba5e3ec4-5b62-43d5-aac4-d63dfb1013b5", - "type" : "password", - "createdDate" : 1609928576595, - "secretData" : "{\"value\":\"CRbzuShCgp6C8Q/3sV2WsRlZ9P1jyMa9kO070oiQQLxPJcdojK4ES6xNLnvoWxR9C/FeGJtadODcsqXq0CoYCA==\",\"salt\":\"ElTaXOmeliezNt9eLg7WDQ==\",\"additionalParameters\":{}}", - "credentialData" : "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}" - } ], - "disableableCredentialTypes" : [ ], - "requiredActions" : [ ], - "realmRoles" : [ "offline_access", "admin", "uma_authorization" ], - "clientRoles" : { - "account" : [ "manage-account", "view-profile" ] - }, - "notBefore" : 0, - "groups" : [ ] - } ], - "scopeMappings" : [ { - "clientScope" : "offline_access", - "roles" : [ "offline_access" ] - } ], - "clientScopeMappings" : { - "account" : [ { - "client" : "account-console", - "roles" : [ "manage-account" ] - } ] - }, - "clients" : [ { - "id" : "21d9d509-9e7d-47be-9bf9-63a7ff9a3bca", - "clientId" : "account", - "name" : "${client_account}", - "rootUrl" : "${authBaseUrl}", - "baseUrl" : "/realms/master/account/", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "b5d044fd-65f5-401e-85a9-e6594e12882b", - "defaultRoles" : [ "manage-account", "view-profile" ], - "redirectUris" : [ "/realms/master/account/*" ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "role_list", "roles", "profile", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "5f17003e-c510-4029-a42a-32e77e9c7618", - "clientId" : "account-console", - "name" : "${client_account-console}", - "rootUrl" : "${authBaseUrl}", - "baseUrl" : "/realms/master/account/", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "ef0823b7-cdbe-492a-8134-dcaf15450408", - "redirectUris" : [ "/realms/master/account/*" ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { - "pkce.code.challenge.method" : "S256" - }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "protocolMappers" : [ { - "id" : "556dc3d1-6a24-4b79-80cf-e8c58233a9c9", - "name" : "audience resolve", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-audience-resolve-mapper", - "consentRequired" : false, - "config" : { } - } ], - "defaultClientScopes" : [ "web-origins", "role_list", "roles", "profile", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "c80f35c5-b7e1-4100-a68e-b34d8ede513c", - "clientId" : "admin-cli", - "name" : "${client_admin-cli}", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "8bb55c95-477c-464b-984f-81f9c6f1dd0d", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : false, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : true, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "role_list", "roles", "profile", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "ec161ab4-99bd-437d-b6ba-50a79e47f657", - "clientId" : "broker", - "name" : "${client_broker}", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "dafb8686-7e91-48f7-a6c3-bd8c5e04e71b", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "role_list", "roles", "profile", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "6a568d94-adba-4742-8f92-ddbdcdf004c8", - "clientId" : "codex-develop-realm", - "name" : "codex-develop Realm", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "3402734c-cb09-47ef-9991-9c27e2b0ae29", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : true, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : true, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "role_list", "roles", "profile", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "b2669be8-fee3-4bc5-8ed0-23ab3519b0ac", - "clientId" : "master-realm", - "name" : "master Realm", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "0fd20961-c58b-4f38-be05-575c5d036052", - "redirectUris" : [ ], - "webOrigins" : [ ], - "notBefore" : 0, - "bearerOnly" : true, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : false, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : true, - "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "role_list", "roles", "profile", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - }, { - "id" : "cde5b7a9-c7bc-46b6-86c9-817ebfedeac8", - "clientId" : "security-admin-console", - "name" : "${client_security-admin-console}", - "rootUrl" : "${authAdminUrl}", - "baseUrl" : "/admin/master/console/", - "surrogateAuthRequired" : false, - "enabled" : true, - "alwaysDisplayInConsole" : false, - "clientAuthenticatorType" : "client-secret", - "secret" : "ccc0d87b-ee45-4178-9c67-a8b0ad0942b0", - "redirectUris" : [ "/admin/master/console/*" ], - "webOrigins" : [ "+" ], - "notBefore" : 0, - "bearerOnly" : false, - "consentRequired" : false, - "standardFlowEnabled" : true, - "implicitFlowEnabled" : false, - "directAccessGrantsEnabled" : false, - "serviceAccountsEnabled" : false, - "publicClient" : true, - "frontchannelLogout" : false, - "protocol" : "openid-connect", - "attributes" : { - "pkce.code.challenge.method" : "S256" - }, - "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, - "nodeReRegistrationTimeout" : 0, - "protocolMappers" : [ { - "id" : "fb9e242f-dd44-4b94-b878-edc50e2f8001", - "name" : "locale", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "locale", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "locale", - "jsonType.label" : "String" - } - } ], - "defaultClientScopes" : [ "web-origins", "role_list", "roles", "profile", "email" ], - "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] - } ], - "clientScopes" : [ { - "id" : "869b0d5c-3eab-4f16-8136-84770359acdf", - "name" : "address", - "description" : "OpenID Connect built-in scope: address", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${addressScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "32be15df-b593-4b6c-9c23-f0c13d4f7455", - "name" : "address", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-address-mapper", - "consentRequired" : false, - "config" : { - "user.attribute.formatted" : "formatted", - "user.attribute.country" : "country", - "user.attribute.postal_code" : "postal_code", - "userinfo.token.claim" : "true", - "user.attribute.street" : "street", - "id.token.claim" : "true", - "user.attribute.region" : "region", - "access.token.claim" : "true", - "user.attribute.locality" : "locality" - } - } ] - }, { - "id" : "1e151647-be5d-4ab4-b0ac-3be57cc277b3", - "name" : "email", - "description" : "OpenID Connect built-in scope: email", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${emailScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "efb4dd45-22ba-47cd-b204-9e3759646267", - "name" : "email", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "email", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "email", - "jsonType.label" : "String" - } - }, { - "id" : "59d7366a-59bc-4893-a090-5b8d405a776e", - "name" : "email verified", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "emailVerified", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "email_verified", - "jsonType.label" : "boolean" - } - } ] - }, { - "id" : "32fea8d3-229e-44d2-8426-592e847f3d73", - "name" : "microprofile-jwt", - "description" : "Microprofile - JWT built-in scope", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "false" - }, - "protocolMappers" : [ { - "id" : "169877df-dda6-4cbe-b0fd-4f06c25085b9", - "name" : "groups", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-realm-role-mapper", - "consentRequired" : false, - "config" : { - "multivalued" : "true", - "userinfo.token.claim" : "true", - "user.attribute" : "foo", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "groups", - "jsonType.label" : "String" - } - }, { - "id" : "f1ac5d9b-b771-42c1-a479-d12862c3b128", - "name" : "upn", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "username", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "upn", - "jsonType.label" : "String" - } - } ] - }, { - "id" : "379e7ce2-086c-4d6c-bec9-688444ba5c07", - "name" : "offline_access", - "description" : "OpenID Connect built-in scope: offline_access", - "protocol" : "openid-connect", - "attributes" : { - "consent.screen.text" : "${offlineAccessScopeConsentText}", - "display.on.consent.screen" : "true" - } - }, { - "id" : "8ab53452-f5b9-4bb1-bf1a-9c3b11a96269", - "name" : "phone", - "description" : "OpenID Connect built-in scope: phone", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${phoneScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "cb0ed777-353b-402a-8e31-e52c918a8bc8", - "name" : "phone number", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "phoneNumber", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "phone_number", - "jsonType.label" : "String" - } - }, { - "id" : "bec1abba-4535-4408-8a56-033ec4452aa2", - "name" : "phone number verified", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "phoneNumberVerified", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "phone_number_verified", - "jsonType.label" : "boolean" - } - } ] - }, { - "id" : "7aa238ed-2ca8-4275-8c32-bd94eafa2b2a", - "name" : "profile", - "description" : "OpenID Connect built-in scope: profile", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${profileScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "3344a2f8-2303-4bfb-ad97-2cef92a89933", - "name" : "birthdate", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "birthdate", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "birthdate", - "jsonType.label" : "String" - } - }, { - "id" : "30eed4f5-1b54-44a5-a68d-b644b1d02202", - "name" : "locale", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "locale", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "locale", - "jsonType.label" : "String" - } - }, { - "id" : "53c8ff46-dbba-410f-929a-f1518123ee7f", - "name" : "gender", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "gender", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "gender", - "jsonType.label" : "String" - } - }, { - "id" : "4f5a90c0-2f1e-47e3-b7dd-34b9329de907", - "name" : "full name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-full-name-mapper", - "consentRequired" : false, - "config" : { - "id.token.claim" : "true", - "access.token.claim" : "true", - "userinfo.token.claim" : "true" - } - }, { - "id" : "b0db14b4-3a54-420f-8bb8-494ec7552a4c", - "name" : "username", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "username", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "preferred_username", - "jsonType.label" : "String" - } - }, { - "id" : "4124cc51-2cfc-4398-ac77-158c339420b4", - "name" : "middle name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "middleName", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "middle_name", - "jsonType.label" : "String" - } - }, { - "id" : "2ab51ceb-ff7e-42d9-84b1-908e4bcfd45f", - "name" : "family name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "lastName", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "family_name", - "jsonType.label" : "String" - } - }, { - "id" : "8fe9b2a5-b429-4db2-997c-1f12c065a345", - "name" : "profile", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "profile", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "profile", - "jsonType.label" : "String" - } - }, { - "id" : "f722b266-57bf-4888-bac8-b5d5d2ad75b6", - "name" : "nickname", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "nickname", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "nickname", - "jsonType.label" : "String" - } - }, { - "id" : "6e19faae-7367-416a-a8da-84eb03b0a1ac", - "name" : "zoneinfo", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "zoneinfo", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "zoneinfo", - "jsonType.label" : "String" - } - }, { - "id" : "06620d98-c97d-4f6c-8b7d-8110e638f4dc", - "name" : "website", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "website", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "website", - "jsonType.label" : "String" - } - }, { - "id" : "cb3c3343-c803-491f-86d8-7e69d0fa3a91", - "name" : "picture", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "picture", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "picture", - "jsonType.label" : "String" - } - }, { - "id" : "0de024c4-4adb-44bc-b6bf-6e0554e27024", - "name" : "updated at", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-attribute-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "updatedAt", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "updated_at", - "jsonType.label" : "String" - } - }, { - "id" : "bd80e04f-cc0c-43f6-9fab-0558bb5b8392", - "name" : "given name", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-property-mapper", - "consentRequired" : false, - "config" : { - "userinfo.token.claim" : "true", - "user.attribute" : "firstName", - "id.token.claim" : "true", - "access.token.claim" : "true", - "claim.name" : "given_name", - "jsonType.label" : "String" - } - } ] - }, { - "id" : "5ee8d4b5-939b-4f9c-9cde-c6c4095344c6", - "name" : "role_list", - "description" : "SAML role list", - "protocol" : "saml", - "attributes" : { - "consent.screen.text" : "${samlRoleListScopeConsentText}", - "display.on.consent.screen" : "true" - }, - "protocolMappers" : [ { - "id" : "57b9ac6b-2081-43cd-8321-50e18bf0c0ca", - "name" : "role list", - "protocol" : "saml", - "protocolMapper" : "saml-role-list-mapper", - "consentRequired" : false, - "config" : { - "single" : "false", - "attribute.nameformat" : "Basic", - "attribute.name" : "Role" - } - } ] - }, { - "id" : "0d3b7baf-7644-4440-b5b5-8e56b459f781", - "name" : "roles", - "description" : "OpenID Connect scope for add user roles to the access token", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "false", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${rolesScopeConsentText}" - }, - "protocolMappers" : [ { - "id" : "c33fbf1c-4d6a-4cac-a4c7-9eb08363d9ea", - "name" : "realm roles", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-realm-role-mapper", - "consentRequired" : false, - "config" : { - "user.attribute" : "foo", - "access.token.claim" : "true", - "claim.name" : "realm_access.roles", - "jsonType.label" : "String", - "multivalued" : "true" - } - }, { - "id" : "7471e9c6-3c19-4340-a9d7-06c7e9534ae6", - "name" : "client roles", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-usermodel-client-role-mapper", - "consentRequired" : false, - "config" : { - "user.attribute" : "foo", - "access.token.claim" : "true", - "claim.name" : "resource_access.${client_id}.roles", - "jsonType.label" : "String", - "multivalued" : "true" - } - }, { - "id" : "97c5e4b1-7157-484e-8b03-8df750edd478", - "name" : "audience resolve", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-audience-resolve-mapper", - "consentRequired" : false, - "config" : { } - } ] - }, { - "id" : "0ae5cce3-3993-4db9-9dd6-d4aa91bdf48a", - "name" : "web-origins", - "description" : "OpenID Connect scope for add allowed web origins to the access token", - "protocol" : "openid-connect", - "attributes" : { - "include.in.token.scope" : "false", - "display.on.consent.screen" : "false", - "consent.screen.text" : "" - }, - "protocolMappers" : [ { - "id" : "7e2df4cb-c17b-4a58-a3e2-0a77672b4b84", - "name" : "allowed web origins", - "protocol" : "openid-connect", - "protocolMapper" : "oidc-allowed-origins-mapper", - "consentRequired" : false, - "config" : { } - } ] - } ], - "defaultDefaultClientScopes" : [ "web-origins", "roles", "email", "role_list", "profile" ], - "defaultOptionalClientScopes" : [ "microprofile-jwt", "offline_access", "address", "phone" ], - "browserSecurityHeaders" : { - "contentSecurityPolicyReportOnly" : "", - "xContentTypeOptions" : "nosniff", - "xRobotsTag" : "none", - "xFrameOptions" : "SAMEORIGIN", - "contentSecurityPolicy" : "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", - "xXSSProtection" : "1; mode=block", - "strictTransportSecurity" : "max-age=31536000; includeSubDomains" - }, - "smtpServer" : { }, - "eventsEnabled" : false, - "eventsListeners" : [ "jboss-logging" ], - "enabledEventTypes" : [ ], - "adminEventsEnabled" : false, - "adminEventsDetailsEnabled" : false, - "identityProviders" : [ ], - "identityProviderMappers" : [ ], - "components" : { - "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy" : [ { - "id" : "92088785-b126-470d-bb6a-faecdd1f539f", - "name" : "Allowed Client Scopes", - "providerId" : "allowed-client-templates", - "subType" : "authenticated", - "subComponents" : { }, - "config" : { - "allow-default-scopes" : [ "true" ] - } - }, { - "id" : "b03737b7-9cd5-41a3-9d1b-ffe240941ebf", - "name" : "Allowed Client Scopes", - "providerId" : "allowed-client-templates", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "allow-default-scopes" : [ "true" ] - } - }, { - "id" : "921585bd-0ec8-4abd-a5d1-6db9fa777738", - "name" : "Allowed Protocol Mapper Types", - "providerId" : "allowed-protocol-mappers", - "subType" : "authenticated", - "subComponents" : { }, - "config" : { - "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-address-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper", "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-usermodel-property-mapper" ] - } - }, { - "id" : "b6963c0c-4df8-4062-9592-919e1b0dee36", - "name" : "Full Scope Disabled", - "providerId" : "scope", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { } - }, { - "id" : "9a4ebf6c-d75f-442d-8cc1-079f1f793053", - "name" : "Trusted Hosts", - "providerId" : "trusted-hosts", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "host-sending-registration-request-must-match" : [ "true" ], - "client-uris-must-match" : [ "true" ] - } - }, { - "id" : "9b384b7b-8713-4b7c-88ef-65cf0ed81d24", - "name" : "Consent Required", - "providerId" : "consent-required", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { } - }, { - "id" : "87541ef8-98ff-4249-8fcc-2f24ca8f546c", - "name" : "Allowed Protocol Mapper Types", - "providerId" : "allowed-protocol-mappers", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "saml-role-list-mapper", "oidc-usermodel-property-mapper", "saml-user-attribute-mapper", "oidc-address-mapper", "oidc-usermodel-attribute-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper" ] - } - }, { - "id" : "d27ddf88-67fe-4d41-86e7-bc10aeb50747", - "name" : "Max Clients Limit", - "providerId" : "max-clients", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "max-clients" : [ "200" ] - } - } ], - "org.keycloak.keys.KeyProvider" : [ { - "id" : "fff53bd2-9416-41b9-8554-7a73fa0fb524", - "name" : "fallback-RS256", - "providerId" : "rsa-generated", - "subComponents" : { }, - "config" : { - "privateKey" : [ "MIIEogIBAAKCAQEAvQAeJIbd9iQ+RSTRiyuCSYXfkQUwfKwr2VdWLH8hVjgbL+blwn1Di9qFE1sbL6Ak2GkFdXu7n53RduW5cphbjfHJsDz5G9f9ODrLq0mfcA2iXlz9e2Di9HzGi3R8/dIu06wI4Nbk5myJSWXlL2DcOuf5UNDpikY76eRkV3ywiV0p5wyl4kqh9yA/4g7a3i6ChY1Zac9HlWlnslV/0feJNXbTXYIz4FsaapwtDgzd9kYptva1hZPxzuBGwY7+4KsXfmeQ/k2pkUrQGzWnAWMdeQZQRq9M2omEoSXSDRpOubu3E6TGmKIpbUS5vwbiiZR1Pf6VjegTDIRg8B4E6VhynQIDAQABAoIBAEXTxk8ueNEYwNzg5n4pfABX8qpspWZaYfTxnIfiDFoDbp/7CcYaa5s/B82H6nplC1fdLUQji8VEFIB+DU72VVUTELYJQOv1l7tvlZHaKIrIrsV4S7qKqC817lDVn9xTDDPuKnWPT5CGZw50FAG2Ioes7uLZ3H7Wxgn69MuR6NNGssLRa57vv34ea1DkL6j4rNzn5KRDilIoq3b0Z1IOzC4anlQ06plu2dnQDr16O0HoEPCTt3key5vkpJ2VdS2AxruV8gSPqgqx++muH9DqphOeIzTyVIrckig6IlYvLL1Jt4DuSEV/5boclMx8lHLgdyjdYoEveX7OTTDaqfkafQ0CgYEA4LN06SAXpaB2/zAU/+pevNVh1y7CjftSkBq4GbG3S7b9b/9RWp9ITOlqbxKhvB0WNEc7ReHwMYM1VcKoOqMrmt+7pmN1bveOFH+W5NCBn2EpCBPS4n1YeqvhEP/gDnUVjlO2bECtIyR6cNNk5MzPrLL2KekPQFTYkNWDKN03jecCgYEA11OgYZs+tNiv0FhS2f/JfmOwTDZf5TJmzEMbil1hvjVwbarvuNhCnC+azyAmGCw7x+HDiMswlYrWduCJFU1z8FM3dfstVXZZhYKgJh/7A/P6WT2+zm8Rq0qDpVupd6zskN04VuYuW87Rl3Ro1cnTuO8hdq+/bjg/3/jbpCFPwtsCgYBWkMxZg6OYi1lMtplgfkpBNXOcEsehK1GDcse6Hl0fLkA1BYeyAes4tjPq1qK4dfw357lOEt0WNhY2E+f7ryD9aXRBhc+YEIcMHptjS3CklinYksqLtv5/Q/hRNEJ9T14eluGQktogz8zb6pTUEJNxVQDA5KibgBRut9Lvy0m7wQKBgD5mTaP7iUB/SvPlpJzoM0wdN4neeAvDf2bSS7jdNuYYNmyRjMbUZPk+Em7TsjZvGyPhmPibaYjsoxnwF8nEmESc2QWntIt/sJGwORjTS7rpiTMzYYgRR92LynqxBXtY8XVJpnoIWobgeHybj4Xk5yZApkHuzFr0kg4l4ADAZozhAoGAUyw3JtlTRAzoOTX5i2OowLLbkOsmv8ES/3m1w8zftzo0sVE7y7y3RqnxXwuiVW6CZVIuCToQzuWP5BesE2x/Oi8RIf1a6XDJTTjsyC/nZTwY5dZiMBqqkGfHSq3fqw6p2DYrDt+7A2WDGR5xs/gqGHiIth3rwq/EW9zwM/i8aGI=" ], - "certificate" : [ "MIICmzCCAYMCBgF21znt9TANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjEwMTA2MTAyMjQ2WhcNMzEwMTA2MTAyNDI2WjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9AB4kht32JD5FJNGLK4JJhd+RBTB8rCvZV1YsfyFWOBsv5uXCfUOL2oUTWxsvoCTYaQV1e7ufndF25blymFuN8cmwPPkb1/04OsurSZ9wDaJeXP17YOL0fMaLdHz90i7TrAjg1uTmbIlJZeUvYNw65/lQ0OmKRjvp5GRXfLCJXSnnDKXiSqH3ID/iDtreLoKFjVlpz0eVaWeyVX/R94k1dtNdgjPgWxpqnC0ODN32Rim29rWFk/HO4EbBjv7gqxd+Z5D+TamRStAbNacBYx15BlBGr0zaiYShJdINGk65u7cTpMaYoiltRLm/BuKJlHU9/pWN6BMMhGDwHgTpWHKdAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAHVSjqgGibvldmR9sk8cHwke+ogaNc9u+gmtNs53zqsBvmpAiGiG1Tfz+zT0m4UoJz5jyL1U2A2/hNu/NFH78g1MRVD9wrfF6LVbOKV0x06JdCHKy5FJh6qxT5/VNWvX6KVV9cpUQeubiW/bBqoYg8IH64ol6ZYbvTlO6h2OGodTwjsbRQd58w9ugCu/umpbfqswsg6dKMSG4BE4Wpzb1lS+9whlXbivhNgytWcMtws2zNeqtk651lZyiWo2sUNi6VcCo0iLLtQnN49cDOdwvZQAE904Ve5/T2qZyQ4hdnSeNhjbYeVjTOMu6MwyrtlQ2Zj5EO3aSXCcHG6prFs41I4=" ], - "priority" : [ "-100" ], - "algorithm" : [ "RS256" ] - } - }, { - "id" : "49060930-4cd3-491b-9c08-028feff287a0", - "name" : "fallback-HS256", - "providerId" : "hmac-generated", - "subComponents" : { }, - "config" : { - "kid" : [ "57fc63a5-d19b-48f3-b797-f4214b00d3b7" ], - "secret" : [ "jezb81MS6K8oZGlTDQWtKzfRlj0leCBsNW8yUf3DdV2MbWLra8BX3FrdTmJhWPw2--nujBwHaORRnni9MD6Mpw" ], - "priority" : [ "-100" ], - "algorithm" : [ "HS256" ] - } - } ] - }, - "internationalizationEnabled" : false, - "supportedLocales" : [ ], - "authenticationFlows" : [ { - "id" : "be1ea611-b828-49b0-b256-e243683b954e", - "alias" : "Account verification options", - "description" : "Method with which to verity the existing account", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "idp-email-verification", - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "ALTERNATIVE", - "priority" : 20, - "flowAlias" : "Verify Existing Account by Re-authentication", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "2da72c18-1859-4970-bc3f-dba1f8f41541", - "alias" : "Authentication Options", - "description" : "Authentication options.", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "basic-auth", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "basic-auth-otp", - "requirement" : "DISABLED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-spnego", - "requirement" : "DISABLED", - "priority" : 30, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "6a419f20-016e-4b96-8767-d3728e476775", - "alias" : "Browser - Conditional OTP", - "description" : "Flow to determine if the OTP is required for the authentication", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-otp-form", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "477f94e2-c2f1-4c52-b021-a89fca240ec1", - "alias" : "Direct Grant - Conditional OTP", - "description" : "Flow to determine if the OTP is required for the authentication", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "direct-grant-validate-otp", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "62d5b413-9d70-40e9-812c-f7f981459ea5", - "alias" : "First broker login - Conditional OTP", - "description" : "Flow to determine if the OTP is required for the authentication", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-otp-form", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "929bfa4f-aced-45dc-9a30-8254e8e51717", - "alias" : "Handle Existing Account", - "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "idp-confirm-link", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "REQUIRED", - "priority" : 20, - "flowAlias" : "Account verification options", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "57c97d78-8826-4e41-afe0-40ccc38005af", - "alias" : "Reset - Conditional OTP", - "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "conditional-user-configured", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "reset-otp", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "b1e5580d-b8a9-4589-94a2-f0b43ce1f384", - "alias" : "User creation or linking", - "description" : "Flow for the existing/non-existing user alternatives", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticatorConfig" : "create unique user config", - "authenticator" : "idp-create-user-if-unique", - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "ALTERNATIVE", - "priority" : 20, - "flowAlias" : "Handle Existing Account", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "d36424c9-bcfd-4969-84a4-82eeaf792e9c", - "alias" : "Verify Existing Account by Re-authentication", - "description" : "Reauthentication of existing account", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "idp-username-password-form", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "CONDITIONAL", - "priority" : 20, - "flowAlias" : "First broker login - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "2d7cb2bf-f7c2-4b22-8dc2-c57e13d6467b", - "alias" : "browser", - "description" : "browser based authentication", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "auth-cookie", - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "auth-spnego", - "requirement" : "DISABLED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "identity-provider-redirector", - "requirement" : "ALTERNATIVE", - "priority" : 25, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "ALTERNATIVE", - "priority" : 30, - "flowAlias" : "forms", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "890275cd-ea96-4780-896f-82fc06d52624", - "alias" : "clients", - "description" : "Base authentication for clients", - "providerId" : "client-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "client-secret", - "requirement" : "ALTERNATIVE", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "client-jwt", - "requirement" : "ALTERNATIVE", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "client-secret-jwt", - "requirement" : "ALTERNATIVE", - "priority" : 30, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "client-x509", - "requirement" : "ALTERNATIVE", - "priority" : 40, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "796d828d-6ef8-4650-8f32-4f7976719924", - "alias" : "direct grant", - "description" : "OpenID Connect Resource Owner Grant", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "direct-grant-validate-username", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "direct-grant-validate-password", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "CONDITIONAL", - "priority" : 30, - "flowAlias" : "Direct Grant - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "52ff3e0f-a5e3-4d2b-abca-f98411be138f", - "alias" : "docker auth", - "description" : "Used by Docker clients to authenticate against the IDP", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "docker-http-basic-authenticator", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "68cc3970-00a0-4af0-a82d-c54669517a36", - "alias" : "first broker login", - "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticatorConfig" : "review profile config", - "authenticator" : "idp-review-profile", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "REQUIRED", - "priority" : 20, - "flowAlias" : "User creation or linking", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "662eba9d-e1fb-4b04-bf73-28e4dac125b2", - "alias" : "forms", - "description" : "Username, password, otp and other auth forms.", - "providerId" : "basic-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "auth-username-password-form", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "CONDITIONAL", - "priority" : 20, - "flowAlias" : "Browser - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "8187ab7c-4516-4f37-9012-d2daa6fc177b", - "alias" : "http challenge", - "description" : "An authentication flow based on challenge-response HTTP Authentication Schemes", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "no-cookie-redirect", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "REQUIRED", - "priority" : 20, - "flowAlias" : "Authentication Options", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "633e10ad-13d2-4cc5-94b5-c140c4b3564f", - "alias" : "registration", - "description" : "registration flow", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "registration-page-form", - "requirement" : "REQUIRED", - "priority" : 10, - "flowAlias" : "registration form", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "edffc1f4-d9d5-4d71-85cc-384d48caee3f", - "alias" : "registration form", - "description" : "registration form", - "providerId" : "form-flow", - "topLevel" : false, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "registration-user-creation", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "registration-profile-action", - "requirement" : "REQUIRED", - "priority" : 40, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "registration-password-action", - "requirement" : "REQUIRED", - "priority" : 50, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "registration-recaptcha-action", - "requirement" : "DISABLED", - "priority" : 60, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - }, { - "id" : "f5a8a121-0fb9-42bb-af42-447ec67e3dc4", - "alias" : "reset credentials", - "description" : "Reset credentials for a user if they forgot their password or something", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "reset-credentials-choose-user", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "reset-credential-email", - "requirement" : "REQUIRED", - "priority" : 20, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "authenticator" : "reset-password", - "requirement" : "REQUIRED", - "priority" : 30, - "userSetupAllowed" : false, - "autheticatorFlow" : false - }, { - "requirement" : "CONDITIONAL", - "priority" : 40, - "flowAlias" : "Reset - Conditional OTP", - "userSetupAllowed" : false, - "autheticatorFlow" : true - } ] - }, { - "id" : "f33eb50f-d0f0-408a-897c-d698ac51351f", - "alias" : "saml ecp", - "description" : "SAML ECP Profile Authentication Flow", - "providerId" : "basic-flow", - "topLevel" : true, - "builtIn" : true, - "authenticationExecutions" : [ { - "authenticator" : "http-basic-authenticator", - "requirement" : "REQUIRED", - "priority" : 10, - "userSetupAllowed" : false, - "autheticatorFlow" : false - } ] - } ], - "authenticatorConfig" : [ { - "id" : "87a51372-d7a7-4a69-b02a-b8b6b2eb5ac4", - "alias" : "create unique user config", - "config" : { - "require.password.update.after.registration" : "false" - } - }, { - "id" : "5268f200-6ee5-42c9-9671-6e1f22148231", - "alias" : "review profile config", - "config" : { - "update.profile.on.first.login" : "missing" - } - } ], - "requiredActions" : [ { - "alias" : "CONFIGURE_TOTP", - "name" : "Configure OTP", - "providerId" : "CONFIGURE_TOTP", - "enabled" : true, - "defaultAction" : false, - "priority" : 10, - "config" : { } - }, { - "alias" : "terms_and_conditions", - "name" : "Terms and Conditions", - "providerId" : "terms_and_conditions", - "enabled" : false, - "defaultAction" : false, - "priority" : 20, - "config" : { } - }, { - "alias" : "UPDATE_PASSWORD", - "name" : "Update Password", - "providerId" : "UPDATE_PASSWORD", - "enabled" : true, - "defaultAction" : false, - "priority" : 30, - "config" : { } - }, { - "alias" : "UPDATE_PROFILE", - "name" : "Update Profile", - "providerId" : "UPDATE_PROFILE", - "enabled" : true, - "defaultAction" : false, - "priority" : 40, - "config" : { } - }, { - "alias" : "VERIFY_EMAIL", - "name" : "Verify Email", - "providerId" : "VERIFY_EMAIL", - "enabled" : true, - "defaultAction" : false, - "priority" : 50, - "config" : { } - }, { - "alias" : "delete_account", - "name" : "Delete Account", - "providerId" : "delete_account", - "enabled" : false, - "defaultAction" : false, - "priority" : 60, - "config" : { } - }, { - "alias" : "update_user_locale", - "name" : "Update User Locale", - "providerId" : "update_user_locale", - "enabled" : true, - "defaultAction" : false, - "priority" : 1000, - "config" : { } - } ], - "browserFlow" : "browser", - "registrationFlow" : "registration", - "directGrantFlow" : "direct grant", - "resetCredentialsFlow" : "reset credentials", - "clientAuthenticationFlow" : "clients", - "dockerAuthenticationFlow" : "docker auth", - "attributes" : { - "clientOfflineSessionMaxLifespan" : "0", - "clientSessionIdleTimeout" : "0", - "clientSessionMaxLifespan" : "0", - "clientOfflineSessionIdleTimeout" : "0" - }, - "keycloakVersion" : "12.0.1", - "userManagedAccessAllowed" : false -} ] \ No newline at end of file From 5af301a6d72d5b0ef06a84eade1d598ea4dbcd95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 30 Mar 2023 07:45:03 +0200 Subject: [PATCH 096/118] update readme --- feasibility-portal/README.md | 16 +++++++++++----- feasibility-triangle/README.md | 11 ++--------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 425077b..5f89e01 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -63,8 +63,10 @@ If you use the default local feasibility portal setup you will only have to chan | file | environment variable | value for local setup | |--|--|--| -|keycloak/.env|FEASIBILITY_KEYCLOAK_BASE_URL| base-url-of-your-local-feasibility-portal/auth | -|keycloak/.env|FEASIBILITY_KEYCLOAK_ADMIN_PW| choose a secure password here e.g. Ykc2PINWatNqL5Wq,OIxFz1Sv3dzmQ2| +|keycloak/.env|FEASIBILITY_KC_HOSTNAME_URL| base-url-of-your-local-feasibility-portal/auth | +|keycloak/.env|FEASIBILITY_KC_HOSTNAME_ADMIN_URL| base-url-of-your-local-feasibility-portal/auth/keycloakadmin | +|keycloak/.env|FEASIBILITY_KC_ADMIN_USER|keycloak admin user name | +|keycloak/.env|FEASIBILITY_KC_ADMIN_PW| choose a secure password here e.g. Ykc2PINWatNqL5Wq,OIxFz1Sv3dzmQ2| |backend/.env|FEASIBILITY_BACKEND_AKTIN_ENABLED|false| |backend/.env|FEASIBILITY_BACKEND_DIRECT_ENABLED|true| |backend/.env|FEASIBILITY_BACKEND_API_BASE_URL|base-url-of-your-local-feasibility-portal/api| @@ -73,6 +75,8 @@ If you use the default local feasibility portal setup you will only have to chan |gui/deploy-config.json|uiBackendApi > baseUrl |base-url-of-your-local-feasibility-portal/api/v2| |gui/deploy-config.json|auth > baseUrl |base-url-of-your-local-feasibility-portal| +Please note that all user env variables (variables containing USER) should be changed and and all password variables (variables containing PASSWORD or PW) should be set to secure passwords. + For more details on the environment variables see the paragraph **Configurable environment variables** of this README. ### Step 7 - Start the feasibility portal @@ -90,7 +94,9 @@ This starts the following default local feasibility portal, with the following c ### Step 8 - Configure keycloak and add a user for the user interface -Navigate with your browser to https://my-fesibility-domain/auth +Please note that the keycloak provided here is an example setup and we recommend for each site to adjust the keycloak installation to their local scurity requirements or connect the local feasibility portal to a keycloak already provided at the site. + +Navigate with your browser to https://my-fesibility-domain/auth/keycloakadmin/admin click on "Administration Console" and log in to keyloak using the admin password set in step 6 (FEASIBILITY_KEYCLOAK_ADMIN_PW). User: admin Pw: my password set in step 6 @@ -142,8 +148,8 @@ After a few moments you should see the results to your query in the **Number of |FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE| The keycloak role required to access the backend | FEASIBILITY_USER | | BACKEND | |FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE|The keycloak role required to access the backend as Power user - Power users cannot be blacklisted|FEASIBILITY_POWER_USER| | BACKEND | |FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE|The keycloak role required to access the backend as admin|FEASIBILITY_ADMIN| | BACKEND | -"|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER|the url the backend uses to access keycloak to verify the issuer| http://keycloak:8080| | BACKEND |" -"|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK|the url the backend uses to access keycloak for tokens| http://keycloak:8080| | BACKEND |" +|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER|the url the backend uses to access keycloak to verify the issuer| http://keycloak:8080| | BACKEND | +|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK|the url the backend uses to access keycloak for tokens| http://keycloak:8080| | BACKEND | | FEASIBILITY_BACKEND_KEYCLOAK_REALM | the realm the backend uses within keyloak | codex-develop | | BACKEND | |### backend direct broker ###| | | | BACKEND | |FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_ENABLED| enables the direct broker. This connects the backend directly to flare and is only meant to be used for a local installation | false | | BACKEND | diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index bb75637..1744708 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -90,6 +90,8 @@ cp * /opt/feasibility-deploy/feasibility-triangle/ontology If you use the default triangle setup you only have to configure the AKTIN client to connect to the central feasibility portal as the rest of the setup will already be correctly configured for you. +Please note that all user env variables should be changed and and all password variables should be set to secure passwords. + Follow the [DSF configuration wiki](https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup) if you want to use the DSF middleware instead. To configure the AKTIN client in the default setup, change the following environment variables in the file `/opt/feasibility-deploy/feasibility-triangle/aktin-client/.env` according to the paragraph **Configurable environment variables** of this README: @@ -286,12 +288,3 @@ you should see output similar to: Mar 29, 2023 12:59:57 PM feasibility.FeasibilityExecution doExecution FINE: {"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"718-7","system":"http://loinc.org","display":"Hämoglobin"}],"valueFilter":{"type":"quantity-comparator","selectedConcepts":[],"comparator":"gt","unit":{"code":"g/dL","display":"g/dL"},"value":0.0}}]]} ``` - - - - - - - - - From 123c2a2ace53ca6eeedbf13f4425752c4c567db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 30 Mar 2023 09:11:46 +0200 Subject: [PATCH 097/118] fix changelog --- changelog.md | 58 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/changelog.md b/changelog.md index 5b5d038..c365b8c 100644 --- a/changelog.md +++ b/changelog.md @@ -2,22 +2,54 @@ All notable changes to this project will be documented in this file. +## Component specific changes + +Please refer to the respective repositories for a more in depth changelog of single components: + +|Component|Link| +|--|--| +|UI|| +|Backend|| +|AKTIN Broker|| +|AKTIN Feasibility Plugin|| +|DSF Feasibility Plugin|| +|FLARE|| +|Blaze FHIR server|| ## [2.0.0] - 2023-03-29 -### Added +### Overall + +- Updated all components and underlying libraries to the new versions +- Updated UI to angular 15 +- Updated keycloak to 21.0 +- Updated nginx to 1.23 +- Refactored deploy repository - removed DSF from this deployment and added reference to DSF deployment in Readme +- Removed hapi fhir-server from deployment + +### Features + +| Feature | Affected Components | +| -- | -- | +|Added calculated criterion age|Ontology, Sq2cql, FLARE| +|Improved at site obfuscation|DSF Feasibility Plugin, AKTIN Client| +|Added SQ query import and export|UI| +|Improved FHIR query execution and result caching |FLARE| +|Update Consent to new search params and add central MII consent query|UI, Ontology| +|Update ontology to newest KDS version| Ontology| +|Update AKTIN client to new version, move query handling to Java plugin and add query validation|AKTIN client| +|SQ query validation|Backend, AKTIN client| +|Add CQL execution to direct broker| Backend| +### Security and Privacy -### Changed -- Limit amount of queries a user can post before being locked out ([#101](https://github.com/medizininformatik-initiative/feasibility-backend/pull/101)) -- Query results are no longer persisted but only kept in memory for a configurable time ([#62](https://github.com/medizininformatik-initiative/feasibility-backend/pull/62)), ([#80](https://github.com/medizininformatik-initiative/feasibility-backend/pull/80)), ([#87](https://github.com/medizininformatik-initiative/feasibility-backend/pull/87)) -- Return restricted results if certain thresholds are not surpassed ([#63](https://github.com/medizininformatik-initiative/feasibility-backend/pull/63)), ([#64](https://github.com/medizininformatik-initiative/feasibility-backend/pull/64)) -### Removed -* Remove obsolete REST endpoints under /api/v1/ ([#109](https://github.com/medizininformatik-initiative/feasibility-backend/pull/109)) -### Fixed -- Fix codesystem alias for consent ([#85](https://github.com/medizininformatik-initiative/feasibility-backend/pull/85)). -### Security -* Update Spring Boot to v3.0.5 ([#104](https://github.com/medizininformatik-initiative/feasibility-backend/pull/104)) -* Update HAPI to 6.4.2 ([#73](https://github.com/medizininformatik-initiative/feasibility-backend/pull/73)) +| Feature | Affected Components | +| - | - | +|Added extra security measures, which restrict number queries a user can send and results a user can view|UI, Backend| +|Improved at site obfuscation|DSF Feasibility Plugin, Aktin Client| +|Hard rate limit at sites for AKTIN and DSF feasibility plugins|DSF feasibility plugin, AKTIN Client| +|Query results are no longer persisted and only kept in memory for a configurable amount of time|Backend| +|Delete query results from central DSF and AKTIN broker on collection|Backend| +|User blacklisting if too many queries are sent in a given time|Backend| -The full changelog can be found [here](https://github.com/medizininformatik-initiative/feasibility-backend/milestone/4?closed=1). \ No newline at end of file +## [1.6.0] - 2022-09-08 From e9a66df97a430fb46e4ef375cdc6c59c03ba64b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 30 Mar 2023 17:51:58 +0200 Subject: [PATCH 098/118] update readme --- feasibility-portal/README.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 5f89e01..e3b1df8 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -97,29 +97,24 @@ This starts the following default local feasibility portal, with the following c Please note that the keycloak provided here is an example setup and we recommend for each site to adjust the keycloak installation to their local scurity requirements or connect the local feasibility portal to a keycloak already provided at the site. Navigate with your browser to https://my-fesibility-domain/auth/keycloakadmin/admin -click on "Administration Console" and log in to keyloak using the admin password set in step 6 (FEASIBILITY_KEYCLOAK_ADMIN_PW). +click on "Administration Console" and log in to keyloak using the admin user and password set in step 6 (FEASIBILITY_KC_ADMIN_USER, FEASIBILITY_KC_ADMIN_PW). User: admin Pw: my password set in step 6 1. Set the your domain for your client: -Click on `Clients > feasibility-gui` and change the fields: Root URL, Base URL and Web Origins -from: https://feasibility.forschen-fuer-gesundheit.de +Click on `Clients > feasibility-webapp` and change the fields: Root URL, Base URL and Web Origins to: https://your-feasibility-domain and **Valid Redirect URIs** -from -from: https://feasibility.forschen-fuer-gesundheit.de to: https://your-feasibility-domain/* Save the changes by clicking the "save" button. -2. Add a user for to your feasibility user interface: -Click on `Users > Add User` and fill in the field **Username** with a username of your choice and add the user under **Groups** to the group **/codex-develop** and save the user by clicking on `save`. -Click on **Credentials** and fill the `Password` and `Password Confirmation` fields with a password of your choice and save the changes by clicking `set password` +2. Add a user for your feasibility user interface: +Click on `Users > Add User` and fill in the field **Username** with a username of your choice. +Click on **Credentials** > **Set Password** and fill the `Password` and `Password Confirmation` fields with a password of your choice and save the changes by clicking `set password` +Click on ** Role Mapping > Assign Role ** , select FeasibilityUser and click `Assign` -3. Add Mapper from Realm-Role to Group for UI - -Click on `Clients > feasibility-gui > Mappers` then click on `Add Builtin` select the mapper with name `groups` and click `Add selected` ### Step 9 - Access the user interface and send first query From cee941ddc74397ea89b0da901dc79d2a9cba8ac4 Mon Sep 17 00:00:00 2001 From: Michael Folz Date: Fri, 31 Mar 2023 10:02:12 +0200 Subject: [PATCH 099/118] Remove dsf-broker entries from shell scripts Fix missing /auth path from backend .env default Fix some typos and c&p errors in readme files --- README.md | 8 +- feasibility-portal/README.md | 244 +++++++++--------- feasibility-portal/backend/.env.default | 2 +- feasibility-portal/down-feasibility-portal.sh | 1 - .../initialise-portal-env-files.sh | 2 +- feasibility-portal/stop-feasibility-portal.sh | 1 - feasibility-triangle/README.md | 154 +++++------ 7 files changed, 205 insertions(+), 207 deletions(-) diff --git a/README.md b/README.md index ed414e4..d16ab08 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ [![version](https://img.shields.io/badge/version-2.0.0-green.svg)](https://github.com/medizininformatik-initiative/feasibility-deploy/releases) -This feasibility deployment repository offers an example deployment repository using docker-compose and official images to setup a feasibility portal (central) as well as feasibility triangle (decentral - at site) +This feasibility deployment repository offers an example deployment repository using docker-compose and official images to set up a feasibility portal (central) as well as feasibility triangle (decentral - at site) It is divided into two parts: -A feasibility portal part, which creates a deployment of the centralized components neccessary for the deployment of the dezentralized feasibility query tool. +A feasibility portal part, which creates a deployment of the centralized components necessary for the deployment of the decentralized feasibility query tool. -A feasibility triangle part, which provides a deployment for the decenctralized components. +A feasibility triangle part, which provides a deployment for the decentralized components. ## Feasibility Portal (central) @@ -17,4 +17,4 @@ See: `feasibility-portal/README.md` of this repository. ## Feasibility Triangle (decentral) -See: `feasibility-triangle/README.md` of this repository. \ No newline at end of file +See: `feasibility-triangle/README.md` of this repository. diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index e3b1df8..98030a3 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -1,33 +1,33 @@ # Feasibility Portal The feasibility portal provides a feasibility query user interface with an appropriate backend, query translation to CQL and FHIR Search as well as -the central part of two Middleware for the transfer of the queries from the feasibility portal to the feasibility triangles located at participating sites (hospitals). +the central part of two middlewares for the transfer of the queries from the feasibility portal to the feasibility triangles located at participating sites (hospitals). ## Setting up the Feasibility Portal - Local Installation ### Step 1 - Installation Docker -The installation of the Feasibility Triangle requires Docker (https://docs.docker.com/engine/install/ubuntu/) and docker-compose (https://docs.docker.com/compose/install/). +The installation of the Feasibility Portal requires Docker (https://docs.docker.com/engine/install/ubuntu/) and docker-compose (https://docs.docker.com/compose/install/). If not already installed on your VM, install using the links provided above. -### Step 2 - clone this Repository to your virtual machine +### Step 2 - Clone this Repository to your virtual machine ssh to your virtual machine and switch to sudo `sudo -s`. -Designate a folder for your setup in which to clone the deploy repository, we suggest /opt (`cd /opt`) +Designate a folder for your setup in which you clone the deploy repository, we suggest /opt (`cd /opt`) Navigate to the directory and clone this repository: `git clone https://github.com/medizininformatik-initiative/feasibility-deploy.git` -Navigate to the feasibility-triangle folder of the repository: `cd /opt/feasibility-deploy/feasibility-portal` -Checkout the version (git tag) of the feasibility triangle you would like to install: `git checkout tags/` +Navigate to the feasibility-portal folder of the repository: `cd /opt/feasibility-deploy/feasibility-portal` +Checkout the version (git tag) of the feasibility portal you would like to install: `git checkout tags/` ### Step 3 - Initialise .env files -The feasibility portal requires .env files for the docker-compose setup. If you are setting up the project new and have not done so yet execute the `initialise-portal-env-files.sh`. +The feasibility portal requires .env files for the docker-compose setup. If you are performing a new setup of the project, execute the `initialise-portal-env-files.sh`. -If you have set up the portal before compare the .env to the .env.default env files of each component and copy the additional params as appropriate +If you have set up the portal before, compare the .env to the .env.default env files of each component and copy the additional params as appropriate. -### Step 4 - Set Up ssl certificates +### Step 4 - Set up SSL certificates -Running this setup safely at your site, requires a valid certificate and domain. Please contact the responsible body of your institution to recieve both a domain and certificate. +Running this setup safely at your site requires a valid certificate and domain. Please contact the responsible body of your institution to receive both a domain and certificate. You will require two .pem files: a cert.pem (certificate) and key.pem (private key). Once you have the appropriate certificates you should save them under `/opt/feasibility-deploy/feasibility-portal/auth`. @@ -47,11 +47,11 @@ sudo -s mkdir ///// cd ///// unzip mapping_*.zip -unzip ui_profiles_*.zip +unzip ui_profile_*.zip unzip db_migration_*.zip cd mapping cp * /opt/feasibility-deploy/feasibility-portal/ontology -cd ../ui_profiles +cd ../ui_profile cp * /opt/feasibility-deploy/feasibility-portal/ontology/ui_profiles cd ../db_migration cp * /opt/feasibility-deploy/feasibility-portal/ontology/migration @@ -61,21 +61,21 @@ cp * /opt/feasibility-deploy/feasibility-portal/ontology/migration If you use the default local feasibility portal setup you will only have to change the following environment variables: -| file | environment variable | value for local setup | -|--|--|--| -|keycloak/.env|FEASIBILITY_KC_HOSTNAME_URL| base-url-of-your-local-feasibility-portal/auth | -|keycloak/.env|FEASIBILITY_KC_HOSTNAME_ADMIN_URL| base-url-of-your-local-feasibility-portal/auth/keycloakadmin | -|keycloak/.env|FEASIBILITY_KC_ADMIN_USER|keycloak admin user name | -|keycloak/.env|FEASIBILITY_KC_ADMIN_PW| choose a secure password here e.g. Ykc2PINWatNqL5Wq,OIxFz1Sv3dzmQ2| -|backend/.env|FEASIBILITY_BACKEND_AKTIN_ENABLED|false| -|backend/.env|FEASIBILITY_BACKEND_DIRECT_ENABLED|true| -|backend/.env|FEASIBILITY_BACKEND_API_BASE_URL|base-url-of-your-local-feasibility-portal/api| -|backend/.env|FLARE_WEBSERVICE_BASE_URL|http://flare:8080| -|backend/.env|FEASIBILITY_BACKEND_ALLOWED_ORIGINS|base-url-of-your-local-feasibility-portal| -|gui/deploy-config.json|uiBackendApi > baseUrl |base-url-of-your-local-feasibility-portal/api/v2| -|gui/deploy-config.json|auth > baseUrl |base-url-of-your-local-feasibility-portal| - -Please note that all user env variables (variables containing USER) should be changed and and all password variables (variables containing PASSWORD or PW) should be set to secure passwords. +| file | environment variable | value for local setup | +|------------------------|-------------------------------------|--------------------------------------------------------------------| +| keycloak/.env | FEASIBILITY_KC_HOSTNAME_URL | base-url-of-your-local-feasibility-portal/auth | +| keycloak/.env | FEASIBILITY_KC_HOSTNAME_ADMIN_URL | base-url-of-your-local-feasibility-portal/auth/keycloakadmin | +| keycloak/.env | FEASIBILITY_KC_ADMIN_USER | keycloak admin user name | +| keycloak/.env | FEASIBILITY_KC_ADMIN_PW | choose a secure password here e.g. Ykc2PINWatNqL5Wq,OIxFz1Sv3dzmQ2 | +| backend/.env | FEASIBILITY_BACKEND_AKTIN_ENABLED | false | +| backend/.env | FEASIBILITY_BACKEND_DIRECT_ENABLED | true | +| backend/.env | FEASIBILITY_BACKEND_API_BASE_URL | base-url-of-your-local-feasibility-portal/api | +| backend/.env | FLARE_WEBSERVICE_BASE_URL | http://flare:8080 | +| backend/.env | FEASIBILITY_BACKEND_ALLOWED_ORIGINS | base-url-of-your-local-feasibility-portal | +| gui/deploy-config.json | uiBackendApi > baseUrl | base-url-of-your-local-feasibility-portal/api/v2 | +| gui/deploy-config.json | auth > baseUrl | base-url-of-your-local-feasibility-portal | + +Please note that all user env variables (variables containing USER) should be changed and all password variables (variables containing PASSWORD or PW) should be set to secure passwords. For more details on the environment variables see the paragraph **Configurable environment variables** of this README. @@ -86,39 +86,39 @@ execute `bash start-feasibility-portal-local.sh`. This starts the following default local feasibility portal, with the following components: -|Component|url|description| -|--|--|--| -|GUI|https://my-fesibility-domain|| -|Keycloak|https://my-feasibility-domain/auth|| +| Component | url | description | +|-----------|------------------------------------|-------------| +| GUI | https://my-fesibility-domain | | +| Keycloak | https://my-feasibility-domain/auth | | ### Step 8 - Configure keycloak and add a user for the user interface -Please note that the keycloak provided here is an example setup and we recommend for each site to adjust the keycloak installation to their local scurity requirements or connect the local feasibility portal to a keycloak already provided at the site. +Please note that the keycloak provided here is an example setup, and we strongly recommend for each site to adjust the keycloak installation to their local security requirements or connect the local feasibility portal to a keycloak already provided at the site. -Navigate with your browser to https://my-fesibility-domain/auth/keycloakadmin/admin -click on "Administration Console" and log in to keyloak using the admin user and password set in step 6 (FEASIBILITY_KC_ADMIN_USER, FEASIBILITY_KC_ADMIN_PW). +Navigate to https://my-fesibility-domain/auth/keycloakadmin/admin +click on "Administration Console" and log in to keycloak using the admin user and password set in step 6 (FEASIBILITY_KC_ADMIN_USER, FEASIBILITY_KC_ADMIN_PW). User: admin Pw: my password set in step 6 -1. Set the your domain for your client: +1. Set the domain for your client: +Switch to the `feasibility` realm (realm name might be different if you use your own keycloak) by using the realm changer on top of the left navigation bar (should be set to `master` when logging in) Click on `Clients > feasibility-webapp` and change the fields: Root URL, Base URL and Web Origins -to: https://your-feasibility-domain +to: https://your-feasibility-domain + + and **Valid Redirect URIs** to: https://your-feasibility-domain/* -and **Valid Redirect URIs** -to: https://your-feasibility-domain/* - -Save the changes by clicking the "save" button. + Save the changes by clicking the "save" button. 2. Add a user for your feasibility user interface: -Click on `Users > Add User` and fill in the field **Username** with a username of your choice. +Click on `Users > Create new user` and fill in the field **Username** with a username of your choice. Click on **Credentials** > **Set Password** and fill the `Password` and `Password Confirmation` fields with a password of your choice and save the changes by clicking `set password` Click on ** Role Mapping > Assign Role ** , select FeasibilityUser and click `Assign` ### Step 9 - Access the user interface and send first query -Access your user interface under and log in with the user set in step 8. +Access your user interface under and log in with the user created in step 8. Click on **New query**, create a query and send it using the **send** button. After a few moments you should see the results to your query in the **Number of patients** window. @@ -127,82 +127,82 @@ After a few moments you should see the results to your query in the **Number of ## Configurable environment variables -| Env Var | Description | Default | Possible values | Component | -|--------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|-----------------|-----------| -|### aktin config ###| | | | | -| AKTIN_BROKER_LOG_LEVEL | Log level of the Aktin broker | INFO | | AKTIN | -| AKTIN_ADMIN_PW | password for the web admin of the AKTIN broker Admin is accessible via: http://localhost:AKTIN_BROKER_HOST_AND_PORT/admin/html/index.html | changeme | | AKTIN | -| AKTIN_BROKER_HOST_AND_PORT | Aktin broker Docker port | 127.0.0.1:8080 | | AKTIN | -|### backend db-config ###| | | | | -| FEASIBILITY_BACKEND_DATASOURCE_HOST | backend database host | feasibility-gui-backend-db | | BACKEND | -| FEASIBILITY_BACKEND_DATASOURCE_PORT | backend database port |5432| | BACKEND | -| FEASIBILITY_BACKEND_DATASOURCE_USERNAME | backend database username | guidbuser | | BACKEND | -| FEASIBILITY_BACKEND_DATASOURCE_PASSWORD | backend database password | guidbpw | | BACKEND | -|### backend keycloak ###||| | BACKEND | -| FEASIBILITY_BACKEND_KEYCLOAK_ENABLED | whether or not keycloak is enabled for the backend | true | | BACKEND | -|FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE| The keycloak role required to access the backend | FEASIBILITY_USER | | BACKEND | -|FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE|The keycloak role required to access the backend as Power user - Power users cannot be blacklisted|FEASIBILITY_POWER_USER| | BACKEND | -|FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE|The keycloak role required to access the backend as admin|FEASIBILITY_ADMIN| | BACKEND | -|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER|the url the backend uses to access keycloak to verify the issuer| http://keycloak:8080| | BACKEND | -|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK|the url the backend uses to access keycloak for tokens| http://keycloak:8080| | BACKEND | -| FEASIBILITY_BACKEND_KEYCLOAK_REALM | the realm the backend uses within keyloak | codex-develop | | BACKEND | -|### backend direct broker ###| | | | BACKEND | -|FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_ENABLED| enables the direct broker. This connects the backend directly to flare and is only meant to be used for a local installation | false | | BACKEND | -|FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_USE_CQL|tells the direct broker to use cql instead of flare for query execution | false | | BACKEND | -|FEASIBILITY_BACKEND_BROKER_CLIENT_OBFUSCATE_RESULT_COUNT|obfuscate results from the local broker| false | | BACKEND | -|FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL| the url of the flare component the backend should connect to when using the direct broker |http://flare:8080| | BACKEND | -|FEASIBILITY_BACKEND_CQL_SERVER_BASE_URL| the url of the fhir server the backend should connect to when using the direct broker |http://fhir-server:8080/fhir| | BACKEND | -|### backend Aktin broker ###| | | | BACKEND | -| FEASIBILITY_BACKEND_AKTIN_ENABLED | enables the aktin broker | false | | BACKEND | -| FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL | aktin broker base url | http://aktin-broker:8080/broker/ | | BACKEND | -| FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY | aktin broker admin api key. The backend needs admin access as it requires permission to post new queries to the broker | xxxApiKeyAdmin123 | | BACKEND | -|### backend DSF broker ###| | | | BACKEND | -| FEASIBILITY_BACKEND_DSF_ENABLED | enables the dsf | false | | BACKEND | -| FEASIBILITY_BACKEND_DSF_CACERT | | /opt/codex-feasibility-security/ca.pem | | BACKEND | -| FEASIBILITY_BACKEND_DSF_DSF_SECURITY_KEYSTORE_P12FILE | | /opt/codex-feasibility-security/test-user.p12 | | BACKEND | -| FEASIBILITY_BACKEND_DSF_SECURITY_KEYSTORE_PASSWORD | | password | | BACKEND | -| FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL | | https://dsf-zars-fhir-proxy/fhir | | BACKEND | -| FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL | | wss://dsf-zars-fhir-proxy:443/fhir/ws | | BACKEND | -| FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID | | Test_ZARS | | BACKEND | -|### backend privacy ###| | | | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_AMOUNT|Set how many queries a user can send in a soft intervall minutes time|3| | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES|Set how many minutes time withini which user can sen soft create amount|1| | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT|Set how many queries a user can send in a hard intervall minutes time - if exceeed user will be blacklisted|50| | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES|Set how many minutes time withini which user can sen hard create amount - if exceeed user will be blacklisted|10080| | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS|Set polling interval for summary results - sum of results accross all connected sites|10| | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS|Set polling interval for detailed obfuscated results - detailed list of results per site - site name obfuscated|10| | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT|Set how often a user can view detailed obfuscated query results in DETAILEDOBFUSCATED_INTERVALSECONDS seconds|3| | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS|Set how many seconds time within which user can view detailed results DETAILEDOBFUSCATED_AMOUNT often|7200| | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS|Set results size which has to be exceeded for results to be shown|20| | BACKEND | -|FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES|Set number of sites which have to be exceeded for results to be shown|3| | BACKEND | -|FEASIBILITY_BACKEND_CERTS_PATH |path to certificates| ../dsf-broker/certs | | BACKEND | -|FEASIBILITY_BACKEND_QUERYRESULT_EXPIRY_MINUTES|The time ist takes for query results to expire and be deleted|5| | BACKEND | -|### backend logging ###| | | | BACKEND | -|FEASIBILITY_BACKEND_LOG_LEVEL_SQL|log level of the backend for hibernate|info| | BACKEND | -|FEASIBILITY_BACKEND_LOG_LEVEL|log level of the backend|info| | BACKEND | -|### backend app ###| | | | BACKEND | -| FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED | enables CQL translation | true | | BACKEND | -| FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED | enables FHIR Search translation. This is only required if a site has their own FLARE component it wishes to use | false | | BACKEND | -| FEASIBILITY_BACKEND_API_BASE_URL | the api url of the backend. If using an nginx this url should be the url of the nginx, which forwards to the backend | https://localhost/api/ | | BACKEND | -| FEASIBILITY_BACKEND_ALLOWED_ORIGINS | base-url-of-your-local-feasibility-portal | https://localhost | | BACKEND | -| FEASIBILITY_BACKEND_UI_PROFILES_PATH | path on host where the backend searches for the ui profiles | ../ontology/ui_profiles | | BACKEND | -| FEASIBILITY_BACKEND_CONCEPT_TREE_PATH | path on host where the backend looks for the code tree file | ../ontology/codex-code-tree.json | | BACKEND | -| FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH | path on host where the backend looks for the mapping file | ../ontology/codex-term-code-mapping.json | | BACKEND | -|FEASIBILITY_BACKEND_MIGRATION_PATH| path on host where the backend looks for migration files |../ontology/migration/R_Load_latest_ui_profile.sql| | BACKEND | -|### keycloak ###||||| -|FEASIBILITY_KC_DB|keycloak db name |keycloakdb|| KEYCLOAK | -|FEASIBILITY_KC_DB_USER| keycloak database username |keycloakdbuser|| KEYCLOAK | -|FEASIBILITY_KC_DB_PW| keycloak database password |keycloakdbpw|| KEYCLOAK | -|FEASIBILITY_KC_ADMIN_USER| keycloak admin username |admin|| KEYCLOAK | -|FEASIBILITY_KC_ADMIN_PW| keycloak admin password |adminpw|| KEYCLOAK | -|FEASIBILITY_KC_HTTP_RELATIVE_PATH|the relative path keycloak is running under|/auth|| KEYCLOAK | -|FEASIBILITY_KC_HOSTNAME_URL|the url at which keycloak is exposed|https://localhost/auth|| KEYCLOAK | -|FEASIBILITY_KC_HOSTNAME_ADMIN_URL|the url of the admin console|https://localhost/auth/keycloakadmin|| KEYCLOAK | -|FEASIBILITY_KC_LOG_LEVEL|log level|info|| KEYCLOAK | -|FEASIBILITY_KC_PROXY|type of proxy in front of keycloak to use|edge|| KEYCLOAK | -|### additional dsf configs ###||||| -| FEASIBILITY_DSF_BROKER_PROCESS_ORGANIZATION_IDENTIFIER | Identifier of this organization. | Test_ZARS | String | DSF | -| FEASIBILITY_DSF_BROKER_PROCESS_FHIR_SERVER_BASE_URL | Base URL to a FHIR server or proxy for feasibility evaluation. This can also be the base URL of a reverse proxy if used. Only required if evaluation strategy is set to cql. | https://dsf-zars-fhir-proxy/fhir | URL | DSF | +| Env Var | Description | Default | Possible values | Component | +|-----------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------|-----------------|-----------| +| ### aktin config ### | | | | | +| AKTIN_BROKER_LOG_LEVEL | Log level of the aktin broker | INFO | | AKTIN | +| AKTIN_ADMIN_PW | password for the web admin of the aktin broker Admin is accessible via: http://localhost:AKTIN_BROKER_HOST_AND_PORT/admin/html/index.html | changeme | | AKTIN | +| AKTIN_BROKER_HOST_AND_PORT | aktin broker Docker port | 127.0.0.1:8080 | | AKTIN | +| ### backend db-config ### | | | | | +| FEASIBILITY_BACKEND_DATASOURCE_HOST | backend database host | feasibility-gui-backend-db | | BACKEND | +| FEASIBILITY_BACKEND_DATASOURCE_PORT | backend database port | 5432 | | BACKEND | +| FEASIBILITY_BACKEND_DATASOURCE_USERNAME | backend database username | guidbuser | | BACKEND | +| FEASIBILITY_BACKEND_DATASOURCE_PASSWORD | backend database password | guidbpw | | BACKEND | +| ### backend keycloak ### | | | | BACKEND | +| FEASIBILITY_BACKEND_KEYCLOAK_ENABLED | whether keycloak is enabled for the backend | true | | BACKEND | +| FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE | The keycloak role required to access the backend | FEASIBILITY_USER | | BACKEND | +| FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE | The keycloak role required to access the backend as Power user - Power users cannot be blacklisted | FEASIBILITY_POWER_USER | | BACKEND | +| FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE | The keycloak role required to access the backend as admin | FEASIBILITY_ADMIN | | BACKEND | +| FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER | the url the backend uses to access keycloak to verify the issuer | http://keycloak:8080 | | BACKEND | +| FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK | the url the backend uses to access keycloak for tokens | http://keycloak:8080 | | BACKEND | +| FEASIBILITY_BACKEND_KEYCLOAK_REALM | the realm the backend uses within keycloak | codex-develop | | BACKEND | +| ### backend direct broker ### | | | | BACKEND | +| FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_ENABLED | enables the direct broker. This connects the backend directly to flare and is only meant to be used for a local installation | false | | BACKEND | +| FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_USE_CQL | tells the direct broker to use cql instead of flare for query execution | false | | BACKEND | +| FEASIBILITY_BACKEND_BROKER_CLIENT_OBFUSCATE_RESULT_COUNT | obfuscate results from the local broker | false | | BACKEND | +| FEASIBILITY_BACKEND_FLARE_WEBSERVICE_BASE_URL | the url of the flare component the backend should connect to when using the direct broker | http://flare:8080 | | BACKEND | +| FEASIBILITY_BACKEND_CQL_SERVER_BASE_URL | the url of the fhir server the backend should connect to when using the direct broker | http://fhir-server:8080/fhir | | BACKEND | +| ### backend Aktin broker ### | | | | BACKEND | +| FEASIBILITY_BACKEND_AKTIN_ENABLED | enables the aktin broker | false | | BACKEND | +| FEASIBILITY_BACKEND_AKTIN_BROKER_BASE_URL | aktin broker base url | http://aktin-broker:8080/broker/ | | BACKEND | +| FEASIBILITY_BACKEND_AKTIN_BROKER_API_KEY | aktin broker admin api key. The backend needs admin access as it requires permission to post new queries to the broker | xxxApiKeyAdmin123 | | BACKEND | +| ### backend DSF broker ### | | | | BACKEND | +| FEASIBILITY_BACKEND_DSF_ENABLED | enables the dsf | false | | BACKEND | +| FEASIBILITY_BACKEND_DSF_CACERT | | /opt/codex-feasibility-security/ca.pem | | BACKEND | +| FEASIBILITY_BACKEND_DSF_DSF_SECURITY_KEYSTORE_P12FILE | | /opt/codex-feasibility-security/test-user.p12 | | BACKEND | +| FEASIBILITY_BACKEND_DSF_SECURITY_KEYSTORE_PASSWORD | | password | | BACKEND | +| FEASIBILITY_BACKEND_DSF_WEBSERVICE_BASE_URL | | https://dsf-zars-fhir-proxy/fhir | | BACKEND | +| FEASIBILITY_BACKEND_DSF_WEBSOCKET_URL | | wss://dsf-zars-fhir-proxy:443/fhir/ws | | BACKEND | +| FEASIBILITY_BACKEND_DSF_ORGANIZATION_ID | | Test_ZARS | | BACKEND | +| ### backend privacy ### | | | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_AMOUNT | Set how many queries a user can send in a soft interval minutes time | 3 | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES | Set how many minutes time within which user can send soft create amount | 1 | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT | Set how many queries a user can send in a hard interval minutes time - if exceeded user will be blacklisted | 50 | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES | Set how many minutes time within which user can send hard create amount - if exceeded user will be blacklisted | 10080 | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS | Set polling interval for summary results - sum of results across all connected sites | 10 | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS | Set polling interval for detailed obfuscated results - detailed list of results per site - site name obfuscated | 10 | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT | Set how often a user can view detailed obfuscated query results in DETAILEDOBFUSCATED_INTERVALSECONDS seconds | 3 | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS | Set how many seconds time within which user can view detailed results DETAILEDOBFUSCATED_AMOUNT | 7200 | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS | Set results size which has to be exceeded for results to be shown | 20 | | BACKEND | +| FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES | Set number of sites which have to be exceeded for results to be shown | 3 | | BACKEND | +| FEASIBILITY_BACKEND_CERTS_PATH | path to certificates | ../dsf-broker/certs | | BACKEND | +| FEASIBILITY_BACKEND_QUERYRESULT_EXPIRY_MINUTES | The time it takes for query results to expire and be deleted | 5 | | BACKEND | +| ### backend logging ### | | | | BACKEND | +| FEASIBILITY_BACKEND_LOG_LEVEL_SQL | log level of the backend for hibernate | info | | BACKEND | +| FEASIBILITY_BACKEND_LOG_LEVEL | log level of the backend | info | | BACKEND | +| ### backend app ### | | | | BACKEND | +| FEASIBILITY_BACKEND_CQL_TRANSLATE_ENABLED | enables CQL translation | true | | BACKEND | +| FEASIBILITY_BACKEND_FHIR_TRANSLATE_ENABLED | enables FHIR Search translation. This is only required if a site has their own FLARE component it wishes to use | false | | BACKEND | +| FEASIBILITY_BACKEND_API_BASE_URL | the api url of the backend. If using a reverse proxy this url should be the url of this proxy, which forwards to the backend | https://localhost/api/ | | BACKEND | +| FEASIBILITY_BACKEND_ALLOWED_ORIGINS | base-url-of-your-local-feasibility-portal | https://localhost | | BACKEND | +| FEASIBILITY_BACKEND_UI_PROFILES_PATH | path on host where the backend searches for the ui profiles | ../ontology/ui_profiles | | BACKEND | +| FEASIBILITY_BACKEND_CONCEPT_TREE_PATH | path on host where the backend looks for the code tree file | ../ontology/codex-code-tree.json | | BACKEND | +| FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH | path on host where the backend looks for the mapping file | ../ontology/codex-term-code-mapping.json | | BACKEND | +| FEASIBILITY_BACKEND_MIGRATION_PATH | path on host where the backend looks for migration files | ../ontology/migration/R_Load_latest_ui_profile.sql | | BACKEND | +| ### keycloak ### | | | | | +| FEASIBILITY_KC_DB | keycloak db name | keycloakdb | | KEYCLOAK | +| FEASIBILITY_KC_DB_USER | keycloak database username | keycloakdbuser | | KEYCLOAK | +| FEASIBILITY_KC_DB_PW | keycloak database password | keycloakdbpw | | KEYCLOAK | +| FEASIBILITY_KC_ADMIN_USER | keycloak admin username | admin | | KEYCLOAK | +| FEASIBILITY_KC_ADMIN_PW | keycloak admin password | adminpw | | KEYCLOAK | +| FEASIBILITY_KC_HTTP_RELATIVE_PATH | the relative path keycloak is running under | /auth | | KEYCLOAK | +| FEASIBILITY_KC_HOSTNAME_URL | the url at which keycloak is exposed | https://localhost/auth | | KEYCLOAK | +| FEASIBILITY_KC_HOSTNAME_ADMIN_URL | the url of the admin console | https://localhost/auth/keycloakadmin | | KEYCLOAK | +| FEASIBILITY_KC_LOG_LEVEL | log level | info | | KEYCLOAK | +| FEASIBILITY_KC_PROXY | type of proxy in front of keycloak to use | edge | | KEYCLOAK | +| ### additional dsf configs ### | | | | | +| FEASIBILITY_DSF_BROKER_PROCESS_ORGANIZATION_IDENTIFIER | Identifier of this organization. | Test_ZARS | String | DSF | +| FEASIBILITY_DSF_BROKER_PROCESS_FHIR_SERVER_BASE_URL | Base URL to a FHIR server or proxy for feasibility evaluation. This can also be the base URL of a reverse proxy if used. Only required if evaluation strategy is set to cql. | https://dsf-zars-fhir-proxy/fhir | URL | DSF | @@ -213,7 +213,7 @@ If you have already installed the local feasibility portal and just want to upda ### Step 1 - Stop your portal -`cd /opt/feasibility-deploy/feasibility-triangle && bash stop-feasibility-portal.sh` +`cd /opt/feasibility-deploy/feasibility-portal && bash stop-feasibility-portal.sh` ### Step 2 - Update repository and check out new tag @@ -237,11 +237,11 @@ sudo -s mkdir ///// cd ///// unzip mapping_*.zip -unzip ui_profiles_*.zip +unzip ui_profile_*.zip unzip db_migration_*.zip cd mapping cp * /opt/feasibility-deploy/feasibility-portal/ontology -cd ../ui_profiles +cd ../ui_profile cp * /opt/feasibility-deploy/feasibility-portal/ontology/ui_profiles cd ../db_migration cp * /opt/feasibility-deploy/feasibility-portal/ontology/migration @@ -261,4 +261,4 @@ Ask for the Url of the central portal at the FDPG or check Confluence for the co Log in to the portal and send a request with the Inclusion Criterion chosen from the Inclusion criteria tree (folder sign under Inclusion Criteria) "Person > PatientIn > Geschlecht: Female,Male" -and press "send". \ No newline at end of file +and press "send". diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index a5aaafd..880aa9c 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -14,7 +14,7 @@ FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FeasibilityUser FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE=FeasibilityPowerUser FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE=FeasibilityAdmin FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER=http://auth:8080 -FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK=http://auth:8080 +FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK=http://auth:8080/auth FEASIBILITY_BACKEND_KEYCLOAK_REALM=feasibility #---- Direct broker FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_ENABLED=true diff --git a/feasibility-portal/down-feasibility-portal.sh b/feasibility-portal/down-feasibility-portal.sh index 0d77c63..a55ff45 100755 --- a/feasibility-portal/down-feasibility-portal.sh +++ b/feasibility-portal/down-feasibility-portal.sh @@ -8,4 +8,3 @@ docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/keycloak/docker-compose.yml docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/backend/docker-compose.yml down docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/gui/docker-compose.yml down docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-broker/docker-compose.yml down -sh "$BASE_DIR"/dsf-broker/down.sh "$COMPOSE_PROJECT" diff --git a/feasibility-portal/initialise-portal-env-files.sh b/feasibility-portal/initialise-portal-env-files.sh index 52c1b92..9b43408 100644 --- a/feasibility-portal/initialise-portal-env-files.sh +++ b/feasibility-portal/initialise-portal-env-files.sh @@ -1,6 +1,6 @@ #!/bin/bash -envfiles=( "gui/deploy-config.json" "backend/.env" "dsf-broker/.env" "keycloak/.env" "aktin-broker/.env") +envfiles=( "gui/deploy-config.json" "backend/.env" "keycloak/.env" "aktin-broker/.env") for file in "${envfiles[@]}" do diff --git a/feasibility-portal/stop-feasibility-portal.sh b/feasibility-portal/stop-feasibility-portal.sh index 692e873..9960ad7 100755 --- a/feasibility-portal/stop-feasibility-portal.sh +++ b/feasibility-portal/stop-feasibility-portal.sh @@ -8,4 +8,3 @@ docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/keycloak/docker-compose.yml docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/backend/docker-compose.yml stop docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/gui/docker-compose.yml stop docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-broker/docker-compose.yml stop -sh "$BASE_DIR"/dsf-broker/stop.sh "$COMPOSE_PROJECT" diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 1744708..9dc28e0 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -1,7 +1,7 @@ # The Feasibility Triangle -The Feasibility Triangle part of this Repository provides a site (data integration center) with all the neccessary components to set up in order to allow feasibiliy queries from the central feasibility portal. +The Feasibility Triangle part of this repository provides a site (data integration center) with all the necessary components to set up in order to allow feasibility queries from the central feasibility portal. ## Overview @@ -49,9 +49,9 @@ Checkout the version (git tag) of the feasibility triangle you would like to ins ### Step 3 - Initialise .env files -The feasibility portal requires .env files for the docker-compose setup. If you are setting up the project new and have not done so yet execute the `initialise-triangle-env-files.sh`. +The feasibility portal requires .env files for the docker-compose setup. If you are performing a new setup of the project, execute the `initialise-triangle-env-files.sh`. -If you have set up the portal before compare the .env to the .env.default env files of each component and copy the additional params as appropriate +If you have set up the portal before compare the .env to the .env.default env files of each component and copy the additional params as appropriate. ### Step 4 - Set Up basic auth @@ -60,7 +60,7 @@ This creates a .htpasswd file in the `auth` directory, which will be mounted to ### Step 5 - Set Up ssl certificates -Running this setup safely at your site, requires a valid certificate and domain. Please contact the responsible body of your institution to recieve both a domain and certificate. +Running this setup safely at your site requires a valid certificate and domain. Please contact the responsible body of your institution to receive both a domain and certificate. You will require two .pem files: a cert.pem (certificate) and key.pem (private key). Once you have the appropriate certificates you should save them under `/opt/feasibility-deploy/feasibility-triangle/auth`. @@ -90,7 +90,7 @@ cp * /opt/feasibility-deploy/feasibility-triangle/ontology If you use the default triangle setup you only have to configure the AKTIN client to connect to the central feasibility portal as the rest of the setup will already be correctly configured for you. -Please note that all user env variables should be changed and and all password variables should be set to secure passwords. +Please note that all user env variables should be changed and all password variables should be set to secure passwords. Follow the [DSF configuration wiki](https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup) if you want to use the DSF middleware instead. @@ -123,7 +123,7 @@ navigating to the respective components folder and executing: ### Step 9 - Access the Triangle -In the default coniguration and given that you have set up a ssl certifcate in step 4 the setup will expose the following services: +In the default configuration, and given that you have set up a SSL certificate in step 4, the setup will expose the following services: These are the URLs for access to the webclients via nginx: @@ -139,86 +139,86 @@ Accessible service via localhost: | Flare | | None required | None required | | FHIR Server | | None required | None required | -Please be aware, that if you would like to access the services on localhost without a password you will need to set up an ssh tunnel to your server and forward the respective ports. +Please be aware that you will need to set up an ssh tunnel to your server and forward the respective ports if you would like to access the services on localhost without a password. For example for the FHIR Server: ssh -L 8081:127.0.0.1:8081 your-username@your-server-ip ### Step 10 - Init Testdata (Optional) -To initialise testdata execute the `get-mii-testdata.sh`. This will download MII core dataset conformant testdata from -unpack it and save them to the testdata folder of this repository. +To initialise testdata execute `get-mii-testdata.sh`. This will download MII core dataset compliant testdata from , +unpack it and save it to the testdata folder of this repository. You can then load the data into your FHIR Server using the `upload-testdata.sh` script. ### Configurable environment variables -| Env Variable | Description | Default | Possible Values | Component | -|-----------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------|----------------------------------------------------|-----------| -| FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE | The media type of the query you would like to handle | application/sq+json | application/sq+json, text/cql | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE | The media type of the query response you return | application/json | application/json | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI | The URL of the AKTIN broker endpoint | http://aktin-broker:8080/broker/ | URL | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS | Type of authentication used by AKTIN | org.aktin.broker.client2.auth.ApiKeyAuthentication | org.aktin.broker.client2.auth.ApiKeyAuthentication | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM | The API key of your site | xxxApiKey123 | API key token | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_DISABLED | enables or disables the websocket - if websocket is disabled the client will poll requests instead - the polling interval is then configured using the env var FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS | false | boolean | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS | The time in which your AKTIN client pings the AKTIN broker to ensure idle websocket conections stay open | 60 | Integer (seconds) | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS || 10 | Integer (seconds) | AKTIN | -| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING || TRUE || AKTIN | -| FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS | The timeout within which a process has to return before the client sends a "failed" message to the AKTIN broker | 60 | Integer (seconds) | AKTIN | -| FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS |configures how many parallel threads AKTIN will use to process requests simultaniously| 2 | Integer (number of threads) | AKTIN | -| FEASIBILITY_AKTIN_FLARE_URL | the URL of the FLARE component if used | http://flare:8080/query/execute | URL | AKTIN | -| FEASIBILITY_AKTIN_FLARE_USER | the basic auth user for flare if needed | | | AKTIN | -| FEASIBILITY_AKTIN_FLARE_PW | the basic auth password for flare if needed | | | AKTIN | -| FEASIBILITY_AKTIN_LOG_LEVEL | the general log level for the AKTIN client | INFO | ALL, FINEST, FINER, FINE, CONFIG, INFO, SEVERE, OFF | AKTIN | -| FEASIBILITY_AKTIN_LOG_LEVEL_FEASIBILITY | the log level of the feasibility plugin for the AKTIN client - note that on FINE above all incoming queries are logged - on FINEST and above it also logs the obfuscated result to each query | FINE | ALL, FINEST, FINER, FINE, CONFIG, INFO, SEVERE, OFF | AKTIN | -| FEASIBILITY_AKTIN_JAVA_OPTS | Provides Java options to the AKTIN client - can be used to configure proxy use. For example : " Dhttps.proxyHost=squid -Dhttps.proxyPort=3128" || valid java options | AKTIN | -| FEASIBILITY_AKTIN_CQL_FHIR_USER | basic auth user to connect to FHIR server if CQL is used ||| AKTIN | -| FEASIBILITY_AKTIN_CQL_FHIR_PW | basic auth password to connect to FHIR server if CQL is used ||| AKTIN | -| FEASIBILITY_AKTIN_CQL_FHIR_BASE_URL | FHIR server base url the AKTIN client is to use to connect to the FHIR server | http://fhir-server:8080/fhir || AKTIN | -| FEASIBILITY_AKTIN_HARD_RATE_LIMIT_NREQUESTS | Hard Rate limit - if this is breached the application will reject all future requests until it is restarted | 300 | integer| AKTIN | -| FEASIBILITY_AKTIN_HARD_RATE_LIMIT_RESET_MINUTES | Time after which the rate limit configured in FEASIBILITY_AKTIN_HARD_RATE_LIMIT_NREQUESTS is reset | 60 |integer| AKTIN | -| FEASIBILITY_AKTIN_OBFUSCATOR_EPSILON | Epsilon used in the Result obfuscator to obfuscate the results using a Laplace function | 0.28 |double| AKTIN | -| FHIR_SERVER_BASE_URL | The base URL of the FHIR server the fhir server uses to generate next links | http://fhir-server:8080 || BLAZE | -| FHIR_SERVER_LOG_LEVEL | log level of the FHIR server | debug | debug, info, error | BLAZE | -| BLAZE_JVM_ARGS | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | -Xmx4g || BLAZE | -| BLAZE_BLOCK_CACHE_SIZE | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | 256 || BLAZE | -| BLAZE_DB_RESOURCE_CACHE_SIZE | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | 2000000 || BLAZE | -| BLAZE_DB_RESOURCE_HANDLE_CACHE_SIZE | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | 100000 || BLAZE | -| PORT_FHIR_SERVER_LOCALHOST | The exposed docker port of the FHIR server | 127.0.0.1:8081 | should always include 127.0.0.1 | BLAZE | -| FEASIBILITY_FLARE_PORT | The exposed docker port of the FLARE componenet | 127.0.0.1:8084 | should always include 127.0.0.1 | FLARE | -| FLARE_FHIR_SERVER_URL | The Url of the FHIR server FLARE uses to connect to the FHIR server | http://fhir-server:8080/fhir/ | URL | FLARE | -| FLARE_FHIR_USER | basic auth user to connect to FHIR server ||| FLARE | -| FLARE_FHIR_PW | basic auth password to connect to FHIR server if CQL is used ||| FLARE | -| FLARE_FHIR_PAGE_COUNT | The number of resources per page FLARE asks for from the FHIR server | 500 || FLARE | -| Env Variable | Description | Default | Possible Values | Component | -| FLARE_FHIR_MAX_CONNECTIONS | maximum number of connections flare will open to fhir server simultaniously |32 | |FLARE | -| FLARE_CACHE_MEM_SIZE_MB | in memory cache size in mb | 1024| |FLARE | -| FLARE_CACHE_MEM_EXPIRE | in memory cache time to expire | PT48H| ISO 8601 time duration|FLARE | -| FLARE_CACHE_MEM_REFRESH | in memory chache time to refresh - not refresh should be shorter than expire| PT24H| ISO 8601 time duration|FLARE | -| FLARE_CACHE_DISK_THREADS | number of threads used to write to disk cache| 4| integer |FLARE | -| FLARE_CACHE_DISK_PATH | disk path for disk cache inside docker container | PT24H| string disk path|FLARE | -| FLARE_CACHE_DISK_EXPIRE | disk cache time to expire | P7D| ISO 8601 time duration|FLARE | -| FLARE_JAVA_TOOL_OPTIONS | java tool options passed to the flare container | -Xmx4g| |FLARE | -| FLARE_LOG_LEVEL | | info| off, fatal, error, warn, info, debug, trace |FLARE | -| FEASIBILITY_TRIANGLE_REV_PROXY_PORT | The exposed docker port of the reverse proxy - set to 443 if you want to use standard https and you only have the feasibility triangle installed on your server | 444 | Integer (valid port) | REV Proxy | -| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_HOST | Forward proxy host. | | FQDN | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PORT | Forward proxy port. | | Integer | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_USERNAME | Username for a forward proxy if it requires one. | | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PASSWORD | Password for a forward proxy if it requires one. | | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BEARER_AUTH_TOKEN | Bearer token used for authentication against a client target. Do not prefix this with `Bearer `! | | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_USERNAME | Username for basic authentication against a FHIR server client target. | | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_PASSWORD | Password for basic authentication against a FHIR server client target. | | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_TIMEOUT | Timeout for establishing a connection to a FHIR server client target in `ms`. | 2000 | Integer | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_REQUEST_TIMEOUT | Timeout for requesting a connection to a FHIR server client target in `ms`. | 20000 | Integer | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_NETWORK_OPS_TIMEOUT | Timeout for blocking a read / write network operation to a FHIR server without failing in `ms`. | 20000 | Integer | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PATH | Path to a trust store used for connecting to a FHIR server. Necessary when using self-signed certificates. | /opt/bpe/truststore.p12 | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PASSWORD | Password for opening the trust store used for connecting to a FHIR server. | | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PATH | Path to a key store used for authenticating against a FHIR server or proxy using a client certificate. | /opt/bpe/keystore | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PASSWORD | Password for opening the key store used for authenticating against a FHIR server or proxy. | | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASE_URL | Base URL to a FHIR server or proxy for feasibility evaluation. This can also be the base URL of a reverse proxy if used. Only required if evaluation strategy is set to cql. | | URL | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY | Defines whether the feasibility shall be evaluated using cql or structured-query. Using the latter requires a FLARE instance. | | `structured-query`, `cql` | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE | Defines whether the feasibility evaluation result shall be obfuscated. | | Boolean | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER | Identifier of this organization. | Test_DIC_1 | String | DSF | -| FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL | Base URL to a FLARE instance. Only required if evaluation strategy is set to structured-query. | http://node-flare:5000/ | URL | DSF | +| Env Variable | Description | Default | Possible Values | Component | +|-----------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------|-----------------------------------------------------|-----------| +| FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE | The media type of the query you would like to handle | application/sq+json | application/sq+json, text/cql | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE | The media type of the query response you return | application/json | application/json | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI | The URL of the AKTIN broker endpoint | http://aktin-broker:8080/broker/ | URL | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_AUTH_CLASS | Type of authentication used by AKTIN | org.aktin.broker.client2.auth.ApiKeyAuthentication | org.aktin.broker.client2.auth.ApiKeyAuthentication | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_AUTH_PARAM | The API key of your site | xxxApiKey123 | API key token | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_DISABLED | enables or disables the websocket - if websocket is disabled the client will poll requests instead - the polling interval is then configured using the env var FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS | false | boolean | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_PING_SECONDS | The time in which your AKTIN client pings the AKTIN broker to ensure idle websocket conections stay open | 60 | Integer (seconds) | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_SECONDS | | 10 | Integer (seconds) | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_WEBSOCKET_RECONNECT_POLLING | | TRUE | | AKTIN | +| FEASIBILITY_AKTIN_CLIENT_PROCESS_TIMEOUT_SECONDS | The timeout within which a process has to return before the client sends a "failed" message to the AKTIN broker | 60 | Integer (seconds) | AKTIN | +| FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS | configures how many parallel threads AKTIN will use to process requests simultaniously | 2 | Integer (number of threads) | AKTIN | +| FEASIBILITY_AKTIN_FLARE_URL | the URL of the FLARE component if used | http://flare:8080/query/execute | URL | AKTIN | +| FEASIBILITY_AKTIN_FLARE_USER | the basic auth user for flare if needed | | | AKTIN | +| FEASIBILITY_AKTIN_FLARE_PW | the basic auth password for flare if needed | | | AKTIN | +| FEASIBILITY_AKTIN_LOG_LEVEL | the general log level for the AKTIN client | INFO | ALL, FINEST, FINER, FINE, CONFIG, INFO, SEVERE, OFF | AKTIN | +| FEASIBILITY_AKTIN_LOG_LEVEL_FEASIBILITY | the log level of the feasibility plugin for the AKTIN client - note that on FINE above all incoming queries are logged - on FINEST and above it also logs the obfuscated result to each query | FINE | ALL, FINEST, FINER, FINE, CONFIG, INFO, SEVERE, OFF | AKTIN | +| FEASIBILITY_AKTIN_JAVA_OPTS | Provides Java options to the AKTIN client - can be used to configure proxy use. For example : " Dhttps.proxyHost=squid -Dhttps.proxyPort=3128" | | valid java options | AKTIN | +| FEASIBILITY_AKTIN_CQL_FHIR_USER | basic auth user to connect to FHIR server if CQL is used | | | AKTIN | +| FEASIBILITY_AKTIN_CQL_FHIR_PW | basic auth password to connect to FHIR server if CQL is used | | | AKTIN | +| FEASIBILITY_AKTIN_CQL_FHIR_BASE_URL | FHIR server base url the AKTIN client is to use to connect to the FHIR server | http://fhir-server:8080/fhir | | AKTIN | +| FEASIBILITY_AKTIN_HARD_RATE_LIMIT_NREQUESTS | Hard Rate limit - if this is breached the application will reject all future requests until it is restarted | 300 | integer | AKTIN | +| FEASIBILITY_AKTIN_HARD_RATE_LIMIT_RESET_MINUTES | Time after which the rate limit configured in FEASIBILITY_AKTIN_HARD_RATE_LIMIT_NREQUESTS is reset | 60 | integer | AKTIN | +| FEASIBILITY_AKTIN_OBFUSCATOR_EPSILON | Epsilon used in the Result obfuscator to obfuscate the results using a Laplace function | 0.28 | double | AKTIN | +| FHIR_SERVER_BASE_URL | The base URL of the FHIR server the fhir server uses to generate next links | http://fhir-server:8080 | | BLAZE | +| FHIR_SERVER_LOG_LEVEL | log level of the FHIR server | debug | debug, info, error | BLAZE | +| BLAZE_JVM_ARGS | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | -Xmx4g | | BLAZE | +| BLAZE_BLOCK_CACHE_SIZE | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | 256 | | BLAZE | +| BLAZE_DB_RESOURCE_CACHE_SIZE | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | 2000000 | | BLAZE | +| BLAZE_DB_RESOURCE_HANDLE_CACHE_SIZE | see: https://github.com/samply/blaze/blob/master/docs/deployment/environment-variables.md | 100000 | | BLAZE | +| PORT_FHIR_SERVER_LOCALHOST | The exposed docker port of the FHIR server | 127.0.0.1:8081 | should always include 127.0.0.1 | BLAZE | +| FEASIBILITY_FLARE_PORT | The exposed docker port of the FLARE componenet | 127.0.0.1:8084 | should always include 127.0.0.1 | FLARE | +| FLARE_FHIR_SERVER_URL | The Url of the FHIR server FLARE uses to connect to the FHIR server | http://fhir-server:8080/fhir/ | URL | FLARE | +| FLARE_FHIR_USER | basic auth user to connect to FHIR server | | | FLARE | +| FLARE_FHIR_PW | basic auth password to connect to FHIR server if CQL is used | | | FLARE | +| FLARE_FHIR_PAGE_COUNT | The number of resources per page FLARE asks for from the FHIR server | 500 | | FLARE | +| Env Variable | Description | Default | Possible Values | Component | +| FLARE_FHIR_MAX_CONNECTIONS | maximum number of connections flare will open to fhir server simultaniously | 32 | | FLARE | +| FLARE_CACHE_MEM_SIZE_MB | in memory cache size in mb | 1024 | | FLARE | +| FLARE_CACHE_MEM_EXPIRE | in memory cache time to expire | PT48H | ISO 8601 time duration | FLARE | +| FLARE_CACHE_MEM_REFRESH | in memory chache time to refresh - not refresh should be shorter than expire | PT24H | ISO 8601 time duration | FLARE | +| FLARE_CACHE_DISK_THREADS | number of threads used to write to disk cache | 4 | integer | FLARE | +| FLARE_CACHE_DISK_PATH | disk path for disk cache inside docker container | PT24H | string disk path | FLARE | +| FLARE_CACHE_DISK_EXPIRE | disk cache time to expire | P7D | ISO 8601 time duration | FLARE | +| FLARE_JAVA_TOOL_OPTIONS | java tool options passed to the flare container | -Xmx4g | | FLARE | +| FLARE_LOG_LEVEL | | info | off, fatal, error, warn, info, debug, trace | FLARE | +| FEASIBILITY_TRIANGLE_REV_PROXY_PORT | The exposed docker port of the reverse proxy - set to 443 if you want to use standard https and you only have the feasibility triangle installed on your server | 444 | Integer (valid port) | REV Proxy | +| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_HOST | Forward proxy host. | | FQDN | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PORT | Forward proxy port. | | Integer | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_USERNAME | Username for a forward proxy if it requires one. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FORWARD_PROXY_PASSWORD | Password for a forward proxy if it requires one. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BEARER_AUTH_TOKEN | Bearer token used for authentication against a client target. Do not prefix this with `Bearer `! | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_USERNAME | Username for basic authentication against a FHIR server client target. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASIC_AUTH_PASSWORD | Password for basic authentication against a FHIR server client target. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_TIMEOUT | Timeout for establishing a connection to a FHIR server client target in `ms`. | 2000 | Integer | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_CONNECTION_REQUEST_TIMEOUT | Timeout for requesting a connection to a FHIR server client target in `ms`. | 20000 | Integer | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_NETWORK_OPS_TIMEOUT | Timeout for blocking a read / write network operation to a FHIR server without failing in `ms`. | 20000 | Integer | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PATH | Path to a trust store used for connecting to a FHIR server. Necessary when using self-signed certificates. | /opt/bpe/truststore.p12 | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_TRUST_STORE_PASSWORD | Password for opening the trust store used for connecting to a FHIR server. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PATH | Path to a key store used for authenticating against a FHIR server or proxy using a client certificate. | /opt/bpe/keystore | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_KEY_STORE_PASSWORD | Password for opening the key store used for authenticating against a FHIR server or proxy. | | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FHIR_SERVER_BASE_URL | Base URL to a FHIR server or proxy for feasibility evaluation. This can also be the base URL of a reverse proxy if used. Only required if evaluation strategy is set to cql. | | URL | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_STRATEGY | Defines whether the feasibility shall be evaluated using cql or structured-query. Using the latter requires a FLARE instance. | | `structured-query`, `cql` | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_EVALUATION_OBFUSCATE | Defines whether the feasibility evaluation result shall be obfuscated. | | Boolean | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_ORGANIZATION_IDENTIFIER | Identifier of this organization. | Test_DIC_1 | String | DSF | +| FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL | Base URL to a FLARE instance. Only required if evaluation strategy is set to structured-query. | http://node-flare:5000/ | URL | DSF | @@ -268,7 +268,7 @@ execute `bash start-triangle.sh`. ### Step 6 - Update your DSF -If you are using the DSF to connect to the central feasibility portal, plese follow the instructions here: +If you are using the DSF to connect to the central feasibility portal, please follow the instructions here: https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup ### Step 7 - Log in to the central feasibility portal and test your connection From 4463274e2e9a6930d9439fff37357ff4159f0904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 31 Mar 2023 13:01:53 +0200 Subject: [PATCH 100/118] update readme, fix default env vars --- feasibility-portal/README.md | 13 +++++++------ feasibility-portal/backend/.env.default | 8 ++++---- feasibility-portal/backend/docker-compose.yml | 4 ++-- feasibility-portal/initialise-portal-env-files.sh | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index e3b1df8..2b39082 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -16,8 +16,8 @@ If not already installed on your VM, install using the links provided above. ssh to your virtual machine and switch to sudo `sudo -s`. Designate a folder for your setup in which to clone the deploy repository, we suggest /opt (`cd /opt`) Navigate to the directory and clone this repository: `git clone https://github.com/medizininformatik-initiative/feasibility-deploy.git` -Navigate to the feasibility-triangle folder of the repository: `cd /opt/feasibility-deploy/feasibility-portal` -Checkout the version (git tag) of the feasibility triangle you would like to install: `git checkout tags/` +Navigate to the feasibility-portal folder of the repository: `cd /opt/feasibility-deploy/feasibility-portal` +Checkout the version (git tag) of the feasibility portal you would like to install: `git checkout tags/` ### Step 3 - Initialise .env files @@ -47,11 +47,11 @@ sudo -s mkdir ///// cd ///// unzip mapping_*.zip -unzip ui_profiles_*.zip +unzip ui_profile_*.zip unzip db_migration_*.zip cd mapping cp * /opt/feasibility-deploy/feasibility-portal/ontology -cd ../ui_profiles +cd ../ui_profile cp * /opt/feasibility-deploy/feasibility-portal/ontology/ui_profiles cd ../db_migration cp * /opt/feasibility-deploy/feasibility-portal/ontology/migration @@ -72,6 +72,7 @@ If you use the default local feasibility portal setup you will only have to chan |backend/.env|FEASIBILITY_BACKEND_API_BASE_URL|base-url-of-your-local-feasibility-portal/api| |backend/.env|FLARE_WEBSERVICE_BASE_URL|http://flare:8080| |backend/.env|FEASIBILITY_BACKEND_ALLOWED_ORIGINS|base-url-of-your-local-feasibility-portal| +|backend/.env|FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER|base-url-of-your-local-feasibility-portal/auth| |gui/deploy-config.json|uiBackendApi > baseUrl |base-url-of-your-local-feasibility-portal/api/v2| |gui/deploy-config.json|auth > baseUrl |base-url-of-your-local-feasibility-portal| @@ -213,7 +214,7 @@ If you have already installed the local feasibility portal and just want to upda ### Step 1 - Stop your portal -`cd /opt/feasibility-deploy/feasibility-triangle && bash stop-feasibility-portal.sh` +`cd /opt/feasibility-deploy/feasibility-portal && bash stop-feasibility-portal.sh` ### Step 2 - Update repository and check out new tag @@ -249,7 +250,7 @@ cp * /opt/feasibility-deploy/feasibility-portal/ontology/migration Existing files should be replaced. -### Step 5 - Start your triangle +### Step 5 - Start your portal To start the portal navigate to `/opt/feasibility-deploy/feasibility-portal` and execute `bash start-feasibility-portal-local.sh`. diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index a5aaafd..a251b0b 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -13,8 +13,8 @@ FEASIBILITY_BACKEND_KEYCLOAK_ENABLED=true FEASIBILITY_BACKEND_KEYCLOAK_ALLOWED_ROLE=FeasibilityUser FEASIBILITY_BACKEND_KEYCLOAK_POWER_ROLE=FeasibilityPowerUser FEASIBILITY_BACKEND_KEYCLOAK_ADMIN_ROLE=FeasibilityAdmin -FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER=http://auth:8080 -FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK=http://auth:8080 +FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER=https://localhost/auth +FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_JWK=http://auth:8080/auth FEASIBILITY_BACKEND_KEYCLOAK_REALM=feasibility #---- Direct broker FEASIBILITY_BACKEND_BROKER_CLIENT_DIRECT_ENABLED=true @@ -41,8 +41,8 @@ FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT=50 FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES=10080 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS=10 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS=10 -FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT=10 -FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS=7200 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_AMOUNT=10 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_INTERVALSECONDS=7200 FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=50 FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=3 FEASIBILITY_BACKEND_QUERYRESULT_EXPIRY_MINUTES=5 diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 39d1b07..08d36dd 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -55,8 +55,8 @@ services: PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES:-10080} PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS:-10} PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS:-10} - PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_AMOUNT:-3} - PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILEDOBFUSCATED_INTERVALSECONDS:-7200} + PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_AMOUNT: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_AMOUNT:-3} + PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_INTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_INTERVALSECONDS:-7200} PRIVACY_THRESHOLD_RESULTS: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS:-20} PRIVACY_THRESHOLD_SITES: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES:-3} # ---- logging diff --git a/feasibility-portal/initialise-portal-env-files.sh b/feasibility-portal/initialise-portal-env-files.sh index 52c1b92..9b43408 100644 --- a/feasibility-portal/initialise-portal-env-files.sh +++ b/feasibility-portal/initialise-portal-env-files.sh @@ -1,6 +1,6 @@ #!/bin/bash -envfiles=( "gui/deploy-config.json" "backend/.env" "dsf-broker/.env" "keycloak/.env" "aktin-broker/.env") +envfiles=( "gui/deploy-config.json" "backend/.env" "keycloak/.env" "aktin-broker/.env") for file in "${envfiles[@]}" do From df05c6375d989473c3daf357b3ebe5bf66796eee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 31 Mar 2023 14:06:18 +0200 Subject: [PATCH 101/118] fix init env files triangle --- feasibility-triangle/initialise-triangle-env-files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-triangle/initialise-triangle-env-files.sh b/feasibility-triangle/initialise-triangle-env-files.sh index 812d56c..135db86 100644 --- a/feasibility-triangle/initialise-triangle-env-files.sh +++ b/feasibility-triangle/initialise-triangle-env-files.sh @@ -1,6 +1,6 @@ #!/bin/bash -envfiles=( "aktin-client/.env" "dsf-client/.env" "fhir-server/blaze-server/.env" "flare/.env" "rev-proxy/.env") +envfiles=( "aktin-client/.env" "fhir-server/.env" "flare/.env" "rev-proxy/.env") for file in "${envfiles[@]}" do From 5c9a3caeea7df42cc403f1424f1bbe51ac5a699e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 31 Mar 2023 14:59:44 +0200 Subject: [PATCH 102/118] fix: update readme, set env var defaults for local setup --- feasibility-portal/README.md | 8 ++++++-- feasibility-portal/backend/.env.default | 6 +++--- feasibility-portal/gui/deploy-config.json.default | 2 +- feasibility-triangle/stop-triangle.sh | 1 - 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 7df2d97..5ce4417 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -104,16 +104,20 @@ Pw: my password set in step 6 1. Set the domain for your client: Switch to the `feasibility` realm (realm name might be different if you use your own keycloak) by using the realm changer on top of the left navigation bar (should be set to `master` when logging in) -Click on `Clients > feasibility-webapp` and change the fields: Root URL, Base URL and Web Origins +Click on `Clients > feasibility-webapp` and change the fields: Root URL, Home URL and Web Origins to: https://your-feasibility-domain and **Valid Redirect URIs** to: https://your-feasibility-domain/* + and **Valid post logout redirect URIs** to: https://your-feasibility-domain/* + + and leave **Admin URL** empty + Save the changes by clicking the "save" button. 2. Add a user for your feasibility user interface: Click on `Users > Create new user` and fill in the field **Username** with a username of your choice. -Click on **Credentials** > **Set Password** and fill the `Password` and `Password Confirmation` fields with a password of your choice and save the changes by clicking `set password` +Click on **Credentials** > **Set Password** and fill the `Password` and `Password Confirmation` fields with a password of your choice and save the changes by clicking `set password`. Click on ** Role Mapping > Assign Role ** , select FeasibilityUser and click `Assign` diff --git a/feasibility-portal/backend/.env.default b/feasibility-portal/backend/.env.default index a251b0b..0416499 100644 --- a/feasibility-portal/backend/.env.default +++ b/feasibility-portal/backend/.env.default @@ -39,12 +39,12 @@ FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_AMOUNT=3 FEASIBILITY_BACKEND_PRIVACY_QUOTA_SOFT_CREATE_INTERVALMINUTES=1 FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_AMOUNT=50 FEASIBILITY_BACKEND_PRIVACY_QUOTA_HARD_CREATE_INTERVALMINUTES=10080 -FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS=10 +FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_SUMMARY_POLLINGINTERVALSECONDS=5 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_POLLINGINTERVALSECONDS=10 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_AMOUNT=10 FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_INTERVALSECONDS=7200 -FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=50 -FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=3 +FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS=0 +FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES=1 FEASIBILITY_BACKEND_QUERYRESULT_EXPIRY_MINUTES=5 # ---- logging FEASIBILITY_BACKEND_LOG_LEVEL_SQL=info diff --git a/feasibility-portal/gui/deploy-config.json.default b/feasibility-portal/gui/deploy-config.json.default index 4bb17ad..9a1379f 100644 --- a/feasibility-portal/gui/deploy-config.json.default +++ b/feasibility-portal/gui/deploy-config.json.default @@ -32,7 +32,7 @@ } }, "options": { - "pollingtimeinseconds": 60, + "pollingtimeinseconds": 30, "pollingintervallinseconds": 10, "lowerboundarypatientresult": 0, "lowerboundarylocationresult": 0 diff --git a/feasibility-triangle/stop-triangle.sh b/feasibility-triangle/stop-triangle.sh index 73b5d4f..eb67723 100755 --- a/feasibility-triangle/stop-triangle.sh +++ b/feasibility-triangle/stop-triangle.sh @@ -8,4 +8,3 @@ docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-client/docker-compose. docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/flare/docker-compose.yml stop docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/docker-compose.yml stop docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/rev-proxy/docker-compose.yml stop -sh "$BASE_DIR"/dsf-client/stop.sh "$COMPOSE_PROJECT" From 34d373a998c95271cf6cc68ef0889bb64e9ba917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 4 Apr 2023 11:51:31 +0200 Subject: [PATCH 103/118] fix: get mii testdata --- feasibility-triangle/get-mii-testdata.sh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/feasibility-triangle/get-mii-testdata.sh b/feasibility-triangle/get-mii-testdata.sh index c93c64c..a2d059c 100755 --- a/feasibility-triangle/get-mii-testdata.sh +++ b/feasibility-triangle/get-mii-testdata.sh @@ -1,11 +1,16 @@ #!/usr/bin/env bash -MII_TESTDATA_BASE_URL=https://github.com/medizininformatik-initiative/kerndatensatz-testdaten/raw/master/Test_Data/Polar -MII_TESTDATA_FILES=(POLAR_Testdaten_Original_UKB-UKB-0001-UKB-0015.json.zip POLAR_Testdaten_Original_UKE-UKE-0001-UKE-0020.json.zip POLAR_Testdaten_Original_UKFAU-UKFAU-0001-UKFAU-0011.json.zip POLAR_Testdaten_Original_UKFR-UKFR-0001-UKFR-0010.json.zip POLAR_Testdaten_Original_UKSH-UKSH-0001-UKSH-0005.json.zip) +MII_TESTDATA_DOWNLOAD_URL="https://health-atlas.de/data_files/594/download?version=1" -for file in "${MII_TESTDATA_FILES[@]}" +wget -O testdata.zip "$MII_TESTDATA_DOWNLOAD_URL" +unzip testdata.zip -d testdata-temp +cd testdata-temp/Vorhofflimmern || exit + +for file in *.json.zip do - wget "$MII_TESTDATA_BASE_URL/$file" - unzip -o "$file" -d testdata - rm "$file" + unzip -o "$file" -d ../../testdata done + +cd ../../ +rm testdata.zip +rm -rf testdata-temp From 6568f8c61deb1823069a3765304b30ba084b23dc Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 9 Jun 2023 18:47:28 +0200 Subject: [PATCH 104/118] Update Blaze to v0.21 --- .github/scripts/install-blazectl.sh | 8 + .github/scripts/test-consent-queries.sh | 21 + .github/scripts/util.sh | 19 + .github/scripts/wait-for-url.sh | 14 + .github/test-data/test-patient-all.json | 11164 ++++++++++++++++ .github/workflows/ci.yml | 30 +- .../fhir-server/custom-search-parameters.json | 157 + .../fhir-server/docker-compose.yml | 6 +- 8 files changed, 11413 insertions(+), 6 deletions(-) create mode 100755 .github/scripts/install-blazectl.sh create mode 100755 .github/scripts/test-consent-queries.sh create mode 100644 .github/scripts/util.sh create mode 100755 .github/scripts/wait-for-url.sh create mode 100644 .github/test-data/test-patient-all.json create mode 100644 feasibility-triangle/fhir-server/custom-search-parameters.json diff --git a/.github/scripts/install-blazectl.sh b/.github/scripts/install-blazectl.sh new file mode 100755 index 0000000..5f561bd --- /dev/null +++ b/.github/scripts/install-blazectl.sh @@ -0,0 +1,8 @@ +#!/bin/bash -e + +VERSION="0.13.0" + +curl -sLO "https://github.com/samply/blazectl/releases/download/v$VERSION/blazectl-$VERSION-linux-amd64.tar.gz" +tar xzf "blazectl-$VERSION-linux-amd64.tar.gz" +rm "blazectl-$VERSION-linux-amd64.tar.gz" +sudo mv ./blazectl /usr/local/bin/blazectl diff --git a/.github/scripts/test-consent-queries.sh b/.github/scripts/test-consent-queries.sh new file mode 100755 index 0000000..424939d --- /dev/null +++ b/.github/scripts/test-consent-queries.sh @@ -0,0 +1,21 @@ +#!/bin/bash -e + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "$SCRIPT_DIR/util.sh" + +BASE="http://localhost:8081/fhir" +PERMIT_URI="$BASE/Consent?mii-provision-provision-code-type=2.16.840.1.113883.3.1937.777.24.5.1.1\$permit" +DENY_URI="$BASE/Consent?mii-provision-provision-code-type=2.16.840.1.113883.3.1937.777.24.5.1.1\$deny" + +count() { + RESP=$(curl -sH 'Prefer: handling=strict' -H 'Accept: application/fhir+json' "$1") + + if [ "$(echo "$RESP" | jq -r .resourceType)" = "OperationOutcome" ]; then + echo "$RESP" | jq -r .issue[].diagnostics + else + echo "$RESP" | jq -r .total + fi +} + +test "permit count" "$(count "$PERMIT_URI")" "1" +test "permit count" "$(count "$DENY_URI")" "0" diff --git a/.github/scripts/util.sh b/.github/scripts/util.sh new file mode 100644 index 0000000..3342000 --- /dev/null +++ b/.github/scripts/util.sh @@ -0,0 +1,19 @@ +#!/bin/bash -e + +test() { + if [ "$2" = "$3" ]; then + echo "OK: the $1 is $3" + else + echo "Fail: the $1 is $2, expected $3" + exit 1 + fi +} + +test-le() { + if [ "$2" -le "$3" ]; then + echo "OK: the $1 of $2 is <= $3" + else + echo "Fail: the $1 is $2, expected <= $3" + exit 1 + fi +} diff --git a/.github/scripts/wait-for-url.sh b/.github/scripts/wait-for-url.sh new file mode 100755 index 0000000..a06481f --- /dev/null +++ b/.github/scripts/wait-for-url.sh @@ -0,0 +1,14 @@ +#!/bin/bash -e + +URL=$1 +START_EPOCH="$(date +"%s")" + +eclipsed() { + EPOCH="$(date +"%s")" + echo $((EPOCH - START_EPOCH)) +} + +# wait at maximum 120 seconds +while [[ ($(eclipsed) -lt 120) && ("$(curl -s -o /dev/null -w '%{response_code}' "$URL")" != "200") ]]; do + sleep 2 +done diff --git a/.github/test-data/test-patient-all.json b/.github/test-data/test-patient-all.json new file mode 100644 index 0000000..e1d1722 --- /dev/null +++ b/.github/test-data/test-patient-all.json @@ -0,0 +1,11164 @@ +{ + "resourceType": "Bundle", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/gecco-bundle" ] + }, + "type": "transaction", + "entry": [ { + "fullUrl": "Patient/5f58baa651c0c48667912fc2b6580b4b", + "resource": { + "resourceType": "Patient", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/Patient" ] + }, + "extension": [ { + "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/age", + "extension": [ { + "url": "dateTimeOfDocumentation", + "_valueDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, { + "url": "age", + "valueAge": { + "value": 46.6, + "unit": "years", + "system": "http://unitsofmeasure.org", + "code": "a" + } + } ] + }, { + "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/ethnic-group", + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "14045001" + } + } ], + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "MR" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/patientId", + "value": "1", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "birthDate": "1973-08-10" + }, + "request": { + "method": "POST", + "url": "Patient", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/patientId|5f58baa651c0c48667912fc2b6580b4b" + } + }, { + "fullUrl": "Organization/7bf3ad593927360881a2fe7425317511", + "resource": { + "resourceType": "Organization", + "name": "Mein Krankenhaus" + }, + "request": { + "method": "POST", + "url": "Organization", + "ifNoneExist": "identifier=null|7bf3ad593927360881a2fe7425317511" + } + }, { + "fullUrl": "Encounter/68b157940b50eb031e94379dbbc96f0c", + "resource": { + "resourceType": "Encounter", + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/encounterId", + "value": "1-Event.1_fall_arm_1.1", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "unknown", + "class": { + "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", + "code": "IMP", + "display": "inpatient encounter" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + } + }, + "request": { + "method": "POST", + "url": "Encounter", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/encounterId|68b157940b50eb031e94379dbbc96f0c" + } + }, { + "fullUrl": "Condition/deb7dca65db909690eb02d1413d400bf", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diagnosis-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.krankheitsbeginn_aufnahme.1-krankheitsbeginn_aufnahme.erkrankungsphase_zum_zeitpunkt_der_diagnose_code.1-erkrankungsphase_zum_zeitpunkt_der_diagnose_code" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394807007", + "display": "Infectious diseases (specialty) (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "840539006", + "display": "Disease caused by Severe acute respiratory syndrome coronavirus 2 (disorder)" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "stage": [ { + "summary": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "399166001" + } ] + }, + "type": { + "coding": [ { + "system": "http://loinc.org", + "code": "88859-4" + } ] + } + } ] + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|deb7dca65db909690eb02d1413d400bf" + } + }, { + "fullUrl": "Condition/f4130055ca4942cd9ce4229f84b4c11a", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_asthma" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "418112009", + "display": "Pulmonary medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "J45.9" + }, { + "system": "http://snomed.info/sct", + "code": "195967001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f4130055ca4942cd9ce4229f84b4c11a" + } + }, { + "fullUrl": "Condition/1a56be7c1f8e03b1a7800c4364765b08", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_copd" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "418112009", + "display": "Pulmonary medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "J44.9" + }, { + "system": "http://snomed.info/sct", + "code": "13645005" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|1a56be7c1f8e03b1a7800c4364765b08" + } + }, { + "fullUrl": "Condition/2fbdd14ef1f0aa5a609fd70be38a3f3b", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_lungenfibrose" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "418112009", + "display": "Pulmonary medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "J84.1" + }, { + "system": "http://snomed.info/sct", + "code": "51615001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|2fbdd14ef1f0aa5a609fd70be38a3f3b" + } + }, { + "fullUrl": "Condition/1950c94e634111ef7ca237fe7a2f4986", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_lungenhochdruck_pulmonale_hypertonie" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "418112009", + "display": "Pulmonary medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I27.0" + }, { + "system": "http://snomed.info/sct", + "code": "70995007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|1950c94e634111ef7ca237fe7a2f4986" + } + }, { + "fullUrl": "Condition/6d51c78162822dac4a9ebfa14a5778f0", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] + }, + "modifierExtension": [ { + "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "261665006", + "display": "Unknown (qualifier value)" + } ], + "text": "Presence unknown." + } + } ], + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_ohs" + } ], + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "418112009", + "display": "Pulmonary medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "E66.29" + }, { + "system": "http://snomed.info/sct", + "code": "190966007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6d51c78162822dac4a9ebfa14a5778f0" + } + }, { + "fullUrl": "Condition/a1b32a8922bcb6633309d167e09b4f22", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_schlafapnoe" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "418112009", + "display": "Pulmonary medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "G47.3" + }, { + "system": "http://snomed.info/sct", + "code": "73430006" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|a1b32a8922bcb6633309d167e09b4f22" + } + }, { + "fullUrl": "Condition/8fa18ddc349b0348065db2219cd46578", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] + }, + "modifierExtension": [ { + "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "261665006", + "display": "Unknown (qualifier value)" + } ], + "text": "Presence unknown." + } + } ], + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_osas" + } ], + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "418112009", + "display": "Pulmonary medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "G47.31" + }, { + "system": "http://snomed.info/sct", + "code": "78275009" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|8fa18ddc349b0348065db2219cd46578" + } + }, { + "fullUrl": "Condition/e3e4d12e4a27d4b2b215c1536f78f0a0", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_cystische_fibrose" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "418112009", + "display": "Pulmonary medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "E84.9" + }, { + "system": "http://snomed.info/sct", + "code": "190905008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e3e4d12e4a27d4b2b215c1536f78f0a0" + } + }, { + "fullUrl": "Condition/89f08d1b12c26204e79987284d39210d", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-lung-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lungenerkrankungen_asthma.1-chronische_lungenerkrankungen_andere" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "418112009", + "display": "Pulmonary medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "106048009" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|89f08d1b12c26204e79987284d39210d" + } + }, { + "fullUrl": "Condition/bb2318953d8be6ca2007db9b6ae383c4", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_bluthochdruck" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "722414000", + "display": "Vascular medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I10.90" + }, { + "system": "http://snomed.info/sct", + "code": "38341003" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|bb2318953d8be6ca2007db9b6ae383c4" + } + }, { + "fullUrl": "Condition/8a12fba34dbd608c4c85b11c2a39b830", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_zustand_nach_herzinfarkt" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "722414000", + "display": "Vascular medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I25.29" + }, { + "system": "http://snomed.info/sct", + "code": "417662000:246090004=22298006" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|8a12fba34dbd608c4c85b11c2a39b830" + } + }, { + "fullUrl": "Condition/f4f18d096bbcb8e93773651cf4e37f43", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_herzrhythmusstoerungen" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "722414000", + "display": "Vascular medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I49.9" + }, { + "system": "http://snomed.info/sct", + "code": "698247007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f4f18d096bbcb8e93773651cf4e37f43" + } + }, { + "fullUrl": "Condition/f62d84e5c05a7d3ae75b8059440e0e5c", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_herzinsuffizienz" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "722414000", + "display": "Vascular medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I50.9" + }, { + "system": "http://snomed.info/sct", + "code": "84114007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f62d84e5c05a7d3ae75b8059440e0e5c" + } + }, { + "fullUrl": "Condition/2d1c27ebedaee8aa876a74facb7c3d8b", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_pavk" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "722414000", + "display": "Vascular medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I73.9" + }, { + "system": "http://snomed.info/sct", + "code": "399957001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|2d1c27ebedaee8aa876a74facb7c3d8b" + } + }, { + "fullUrl": "Condition/6461fc511fff2f8efb8d4a628dd6bc0a", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_zustand_nach_revaskularisation" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "722414000", + "display": "Vascular medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z95.5" + }, { + "system": "http://snomed.info/sct", + "code": "416940007:363589002=81266008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6461fc511fff2f8efb8d4a628dd6bc0a" + } + }, { + "fullUrl": "Condition/870a6d7248051c1040f4e42214a1ea0b", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_koronare_herzerkrankung_khk" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "722414000", + "display": "Vascular medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I25.1" + }, { + "system": "http://snomed.info/sct", + "code": "53741008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|870a6d7248051c1040f4e42214a1ea0b" + } + }, { + "fullUrl": "Condition/3963183f27403402d908961f58e39b48", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_carotisstenose" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "722414000", + "display": "Vascular medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I65.2" + }, { + "system": "http://snomed.info/sct", + "code": "64586002" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|3963183f27403402d908961f58e39b48" + } + }, { + "fullUrl": "Condition/aa3c0a763ab6517f629c6aaf23645f40", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/cardiovascular-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.herzkreislauferkrankungen_bluthochdruck.1-herzkreislauferkrankungen_andere" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "722414000", + "display": "Vascular medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I51.6" + }, { + "system": "http://snomed.info/sct", + "code": "49601007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|aa3c0a763ab6517f629c6aaf23645f40" + } + }, { + "fullUrl": "Condition/0a2b13349475275bd4b640d95006d721", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_fettleber" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "408472002", + "display": "Hepatology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "K76.0" + }, { + "system": "http://snomed.info/sct", + "code": "197321007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|0a2b13349475275bd4b640d95006d721" + } + }, { + "fullUrl": "Condition/7e21f1bdac07d687fa9c234c66c0cfad", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_leberzirrhose" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "408472002", + "display": "Hepatology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "K74.6" + }, { + "system": "http://snomed.info/sct", + "code": "19943007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|7e21f1bdac07d687fa9c234c66c0cfad" + } + }, { + "fullUrl": "Condition/fdc6bf4f4f9d096e3c808dc7e2c26353", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_chronische_infektioese_hepatitis" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "408472002", + "display": "Hepatology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "B18.9" + }, { + "system": "http://snomed.info/sct", + "code": "10295004" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|fdc6bf4f4f9d096e3c808dc7e2c26353" + } + }, { + "fullUrl": "Condition/639b3e9d33cf4ce8aca8685209d12319", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_autoimmune_lebererkrankungen" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "408472002", + "display": "Hepatology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "235890007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|639b3e9d33cf4ce8aca8685209d12319" + } + }, { + "fullUrl": "Condition/3b6856251b6dae21abc6f647da730650", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-liver-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_lebererkrankungen_fettleber.1-chronische_lebererkrankungen_andere" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "408472002", + "display": "Hepatology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "K76.9" + }, { + "system": "http://snomed.info/sct", + "code": "328383001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|3b6856251b6dae21abc6f647da730650" + } + }, { + "fullUrl": "Condition/8a84f52755986a54a8110899a2d3998f", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394810000", + "display": "Rheumatology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "408480009", + "display": "Clinical immunology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "K52.9" + }, { + "system": "http://snomed.info/sct", + "code": "24526004" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|8a84f52755986a54a8110899a2d3998f" + } + }, { + "fullUrl": "Condition/f2e41dbf1def130cce1eb35bc31d091f", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_rheumatoide_arthritis" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394810000", + "display": "Rheumatology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "408480009", + "display": "Clinical immunology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "M06.99" + }, { + "system": "http://snomed.info/sct", + "code": "69896004" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f2e41dbf1def130cce1eb35bc31d091f" + } + }, { + "fullUrl": "Condition/722d6a8637a9edd7221a9454ee8403b0", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] + }, + "modifierExtension": [ { + "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "261665006", + "display": "Unknown (qualifier value)" + } ], + "text": "Presence unknown." + } + } ], + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_kollagenosen" + } ], + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394810000", + "display": "Rheumatology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "408480009", + "display": "Clinical immunology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "M35.9" + }, { + "system": "http://snomed.info/sct", + "code": "105969002" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|722d6a8637a9edd7221a9454ee8403b0" + } + }, { + "fullUrl": "Condition/c041e38061c353b9a995c3b9dd896ac4", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_vaskulitiden" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394810000", + "display": "Rheumatology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "408480009", + "display": "Clinical immunology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I77.6" + }, { + "system": "http://snomed.info/sct", + "code": "31996006" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|c041e38061c353b9a995c3b9dd896ac4" + } + }, { + "fullUrl": "Condition/6d9fc87d75df3c9ae0f003f2b086ed49", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_angeborene_immundefekte" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394810000", + "display": "Rheumatology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "408480009", + "display": "Clinical immunology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "D84.8" + }, { + "system": "http://snomed.info/sct", + "code": "36138009" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6d9fc87d75df3c9ae0f003f2b086ed49" + } + }, { + "fullUrl": "Condition/b0be96feb0d61c1f1584bb92859cc779", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/rheumatological-immunological-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.rheumatologischeimmunologische_erkrankungen_chronisch_entzuendl_darmerkrankung.1-rheumatologischeimmunologische_erkrankungen_andere" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394810000", + "display": "Rheumatology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "408480009", + "display": "Clinical immunology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "D84.8" + }, { + "system": "http://snomed.info/sct", + "code": "396332003+414029004" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|b0be96feb0d61c1f1584bb92859cc779" + } + }, { + "fullUrl": "Condition/f213422e96bf2cb85dc5293f4cbc871d", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/human-immunodeficiency-virus-infection" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.bestehende_hivinfektion_code.1-bestehende_hivinfektion_code" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394807007", + "display": "Infectious diseases (specialty) (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "B24" + }, { + "system": "http://snomed.info/sct", + "code": "86406008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f213422e96bf2cb85dc5293f4cbc871d" + } + }, { + "fullUrl": "Condition/42183beb8e3e26c47b25209bd294f99f", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_herz" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.1" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "302509004" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|42183beb8e3e26c47b25209bd294f99f" + } + }, { + "fullUrl": "Condition/e16c715192b7b86478eb66f900ed8749", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_lunge" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.2" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "181216001" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e16c715192b7b86478eb66f900ed8749" + } + }, { + "fullUrl": "Condition/7dba243d9fd73d84f3e191a263a1c925", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_leber" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.4" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "181268008" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|7dba243d9fd73d84f3e191a263a1c925" + } + }, { + "fullUrl": "Condition/6e2598c957b36cc8247105214eac1a54", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_nieren" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.0" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "181414000" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6e2598c957b36cc8247105214eac1a54" + } + }, { + "fullUrl": "Condition/59376a4ccec5d0d20c4929c592fad6d5", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_darm" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.88" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "113276009" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|59376a4ccec5d0d20c4929c592fad6d5" + } + }, { + "fullUrl": "Condition/f964ab7a3022805779bbd8818c915fb4", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_haut" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.5" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "119181002" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|f964ab7a3022805779bbd8818c915fb4" + } + }, { + "fullUrl": "Condition/60afecc625504a49682a40503d732637", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_hornhaut" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.7" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "181162001" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|60afecc625504a49682a40503d732637" + } + }, { + "fullUrl": "Condition/68f7e0534e3d3237169bd2847f1edeb9", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "modifierExtension": [ { + "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "261665006", + "display": "Unknown (qualifier value)" + } ], + "text": "Presence unknown." + } + } ], + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_gehoerknoechelchen" + } ], + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.9" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "41845008" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|68f7e0534e3d3237169bd2847f1edeb9" + } + }, { + "fullUrl": "Condition/be26017baf4e19d30c315abe18c00f10", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_herzklappen" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z95.88" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "181285005" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|be26017baf4e19d30c315abe18c00f10" + } + }, { + "fullUrl": "Condition/0e67db598207ad825740c6ee9c438378", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_blutgefaess" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z95.5" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "119206002" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|0e67db598207ad825740c6ee9c438378" + } + }, { + "fullUrl": "Condition/d76af43fffb02f2ca6375f381b6589f6", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_hirnhaut" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.9" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "8935007" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|d76af43fffb02f2ca6375f381b6589f6" + } + }, { + "fullUrl": "Condition/5001fd7746742a3e810486fc64170dde", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_knochengewebe" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.6" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "3138006" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|5001fd7746742a3e810486fc64170dde" + } + }, { + "fullUrl": "Condition/271eec26e070cd8bc9041a18dc3aa8e5", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_knorpelgewebe" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.9" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "309312004" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|271eec26e070cd8bc9041a18dc3aa8e5" + } + }, { + "fullUrl": "Condition/b9c3e22ba4030d78e112a6a4c7c5b57b", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/organ-recipient" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.organtransplantiert_herz.1-organtransplantiert_sehne" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "788415003", + "display": "Transplant medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z94.9" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "13024002" + } ] + } ], + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|b9c3e22ba4030d78e112a6a4c7c5b57b" + } + }, { + "fullUrl": "Condition/58147e642065fcdb25c59f04715134ce", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diabetes-mellitus" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.diabetes_code.1-diabetes_code" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "408475000", + "display": "Diabetic medicine (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "237599002" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|58147e642065fcdb25c59f04715134ce" + } + }, { + "fullUrl": "Condition/a0cfad1a5f9738526c534f55c28f6ca0", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/malignant-neoplastic-disease" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.aktive_tumorkrebserkrankungen_code.1-aktive_tumorkrebserkrankungen_code" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394593009", + "display": "Medical oncology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "C80.9" + }, { + "system": "http://snomed.info/sct", + "code": "363346000" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|a0cfad1a5f9738526c534f55c28f6ca0" + } + }, { + "fullUrl": "Condition/e50f5d3a6205bcbab24fcc1c8be7b603", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "G20" + }, { + "system": "http://snomed.info/sct", + "code": "49049000" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e50f5d3a6205bcbab24fcc1c8be7b603" + } + }, { + "fullUrl": "Condition/2232c9bf87bcaea3662d0cdf99e95eec", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_demenz" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "F03" + }, { + "system": "http://snomed.info/sct", + "code": "52448006" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|2232c9bf87bcaea3662d0cdf99e95eec" + } + }, { + "fullUrl": "Condition/3d41249fd134d042643a1bf0cba029f4", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_multiple_sklerose" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "G35" + }, { + "system": "http://snomed.info/sct", + "code": "24700007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|3d41249fd134d042643a1bf0cba029f4" + } + }, { + "fullUrl": "Condition/b4673122eee799ca8e50b7c39e5cf3c8", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_neuromuskulaere_erkrankungen" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "G70.9" + }, { + "system": "http://snomed.info/sct", + "code": "257277002" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|b4673122eee799ca8e50b7c39e5cf3c8" + } + }, { + "fullUrl": "Condition/2bb096fb82a3d305feadb3d78483ee55", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_epilepsie" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "G40.9" + }, { + "system": "http://snomed.info/sct", + "code": "84757009" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|2bb096fb82a3d305feadb3d78483ee55" + } + }, { + "fullUrl": "Condition/cf51c6ee676a7d36a6a06991c97f5037", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_migraene" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "G43.9" + }, { + "system": "http://snomed.info/sct", + "code": "37796009" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|cf51c6ee676a7d36a6a06991c97f5037" + } + }, { + "fullUrl": "Condition/8cc199f205fcba71bda6423edb76a0fc", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_zn_apoplex_mit_residuen" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I69.4" + }, { + "system": "http://snomed.info/sct", + "code": "440140008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|8cc199f205fcba71bda6423edb76a0fc" + } + }, { + "fullUrl": "Condition/52d3feb390e15355015e0000878ff861", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_zn_apoplex_ohne_residuen" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z86.7" + }, { + "system": "http://snomed.info/sct", + "code": "429993008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|52d3feb390e15355015e0000878ff861" + } + }, { + "fullUrl": "Condition/62a3f771bff4d565927fff9d88631f84", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_psychose" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "F29" + }, { + "system": "http://snomed.info/sct", + "code": "69322001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|62a3f771bff4d565927fff9d88631f84" + } + }, { + "fullUrl": "Condition/ef62e366c18c37efd57a628727e0d629", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_depression" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "F32.9" + }, { + "system": "http://snomed.info/sct", + "code": "35489007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|ef62e366c18c37efd57a628727e0d629" + } + }, { + "fullUrl": "Condition/158281e46b9fcc558fcaab8e9fc62ff0", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-neurological-mental-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_neurologische_oder_psychiatrische_erkrankungen_m_parkinson.1-chronische_neurologische_oder_psychiatrische_erkrankungen_angsterkrankung" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394591006", + "display": "Neurology (qualifier value)" + }, { + "system": "http://snomed.info/sct", + "code": "394587001", + "display": "Psychiatry (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "F41.9" + }, { + "system": "http://snomed.info/sct", + "code": "197480006" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|158281e46b9fcc558fcaab8e9fc62ff0" + } + }, { + "fullUrl": "Condition/7f7cb1ee559e234a47f9f5791d874283", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/chronic-kidney-diseases" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.chronische_nierenerkrankungen_code.1-chronische_nierenerkrankungen_code" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394589003", + "display": "Nephrology (qualifier value)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "Z99.2" + }, { + "system": "http://snomed.info/sct", + "code": "714152005" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|7f7cb1ee559e234a47f9f5791d874283" + } + }, { + "fullUrl": "Condition/ae345eb37cee2728e38df71dcf60a8b7", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/gastrointestinal-ulcers" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.magengeschwure_code.1-magengeschwure_code" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "394584008", + "display": "Gastroenterology (qualifier value))" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "K28" + }, { + "system": "http://snomed.info/sct", + "code": "40845000" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|ae345eb37cee2728e38df71dcf60a8b7" + } + }, { + "fullUrl": "Observation/8d797113634820fe7b035349f4799336", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/smoking-status" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.raucherstatus_code.1-raucherstatus_code" + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "social-history", + "display": "Social History" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "72166-2" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://loinc.org", + "code": "LA18976-3" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|8d797113634820fe7b035349f4799336" + } + }, { + "fullUrl": "Observation/a813e636ecf46c38cec9059480a4eb98", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/history-of-travel" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.reiseaktivitat_country_1.1-reiseaktivitat_country_1", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "social-history", + "display": "Social History" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "8691-8" + }, { + "system": "http://snomed.info/sct", + "code": "443846001" + } ], + "text": "History of Travel" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373066001" + } ] + }, + "component": [ { + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "82752-7", + "display": "Date travel started" + } ], + "text": "Travel start date" + }, + "valueDateTime": "2020-01-01" + }, { + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "91560-3", + "display": "Date of departure from travel destination" + } ], + "text": "Travel end date" + }, + "valueDateTime": "2021-04-30" + }, { + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94651-7", + "display": "Country of travel" + } ], + "text": "Country of travel" + }, + "valueCodeableConcept": { + "coding": [ { + "system": "urn:iso:std:iso:3166", + "code": "AO", + "display": "Angola" + } ], + "text": "Angola" + } + } ] + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|a813e636ecf46c38cec9059480a4eb98" + } + }, { + "fullUrl": "Procedure/cc1d9effec7880059304a7da2af9e53b", + "resource": { + "resourceType": "Procedure", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/respiratory-therapies" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.bestehende_sauerstoff_oder_beatmungstherapie_code.1-bestehende_sauerstoff_oder_beatmungstherapie_code" + } ], + "status": "in-progress", + "category": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "277132007", + "display": "Therapeutic procedure (procedure)" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "53950000" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_performedDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Procedure", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|cc1d9effec7880059304a7da2af9e53b" + } + }, { + "fullUrl": "Immunization/78e7f2d8bf1c9c395b3c435dbcbfa41b", + "resource": { + "resourceType": "Immunization", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/immunization" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.impfungen_influenza.1-impfungen_influenza" + } ], + "status": "completed", + "vaccineCode": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "836377006" + } ] + }, + "patient": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "occurrenceDateTime": "2019-04-25", + "protocolApplied": [ { + "targetDisease": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "6142004" + } ] + } ], + "_doseNumberString": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + } ] + }, + "request": { + "method": "POST", + "url": "Immunization", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId|78e7f2d8bf1c9c395b3c435dbcbfa41b" + } + }, { + "fullUrl": "Immunization/4fae4dcca51487424cd5a9b5e982578d", + "resource": { + "resourceType": "Immunization", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/immunization" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.impfungen_influenza.1-impfungen_pneumokokken" + } ], + "status": "completed", + "vaccineCode": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "836398006" + } ] + }, + "patient": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "occurrenceDateTime": "2020-03-03", + "protocolApplied": [ { + "targetDisease": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "16814004" + } ] + } ], + "_doseNumberString": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + } ] + }, + "request": { + "method": "POST", + "url": "Immunization", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId|4fae4dcca51487424cd5a9b5e982578d" + } + }, { + "fullUrl": "Immunization/ca1584ba1018f9ab0209021c9cf04ae8", + "resource": { + "resourceType": "Immunization", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/immunization" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.impfungen_influenza.1-impfungen_bcg" + } ], + "status": "completed", + "vaccineCode": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "836402002" + } ] + }, + "patient": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "occurrenceDateTime": "2019-04-10", + "protocolApplied": [ { + "targetDisease": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "56717001" + } ] + } ], + "_doseNumberString": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + } ] + }, + "request": { + "method": "POST", + "url": "Immunization", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId|ca1584ba1018f9ab0209021c9cf04ae8" + } + }, { + "fullUrl": "Immunization/9205d01d4aceb36aeafa264a18a10cd4", + "resource": { + "resourceType": "Immunization", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/immunization" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.impfungen_influenza.1-impfungen_covid_19" + } ], + "status": "not-done", + "vaccineCode": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "1119349007" + } ] + }, + "patient": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_occurrenceDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "protocolApplied": [ { + "targetDisease": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "840539006" + } ] + } ], + "_doseNumberString": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + } ] + }, + "request": { + "method": "POST", + "url": "Immunization", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/immunizationId|9205d01d4aceb36aeafa264a18a10cd4" + } + }, { + "fullUrl": "Consent/8a397e16ded291857c6da7f34d845b71", + "resource": { + "resourceType": "Consent", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/do-not-resuscitate-order" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/consentId", + "value": "1-Event.1_fall_arm_1.1-Form.anamnese_risikofaktoren.1-anamnese_risikofaktoren.dnranordnung_code.1-dnranordnung" + } ], + "status": "active", + "scope": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/consentscope", + "code": "adr", + "display": "Advanced Care Directive" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes", + "code": "dnr", + "display": "Do Not Resuscitate" + } ] + } ], + "patient": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "policy": [ { + "uri": "https://www.aerzteblatt.de/archiv/65440/DNR-Anordnungen-Das-fehlende-Bindeglied" + } ], + "provision": { + "code": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "304252001" + } ] + } ] + } + }, + "request": { + "method": "POST", + "url": "Consent", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/consentId|8a397e16ded291857c6da7f34d845b71" + } + }, { + "fullUrl": "DiagnosticReport/7db8d983943891d0e79a2537f41df66a", + "resource": { + "resourceType": "DiagnosticReport", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diagnostic-report-radiology" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId", + "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.befund_bildgebender_verfahren_ct.1-befund_bildgebender_verfahren_ct" + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "18726-0", + "display": "Radiology studies (set)" + }, { + "system": "http://terminology.hl7.org/CodeSystem/v2-0074", + "code": "RAD", + "display": "Radiology" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "18748-4", + "display": "Diagnostic imaging study" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "conclusionCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "118247008:{363713009=263654008,42752001=840539006}" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "DiagnosticReport", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId|7db8d983943891d0e79a2537f41df66a" + } + }, { + "fullUrl": "Procedure/23336a6967dc8136c44671d097dcebf3", + "resource": { + "resourceType": "Procedure", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/radiology-procedures" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", + "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.bildgebende_verfahren_ct.1-bildgebende_verfahren_ct" + } ], + "status": "completed", + "category": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "103693007", + "display": "Diagnostic procedure (procedure)" + } ] + }, + "code": { + "coding": [ { + "system": "http://dicom.nema.org/resources/ontology/DCM", + "code": "CT" + }, { + "system": "http://snomed.info/sct", + "code": "77477000:363704007=39607008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_performedDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "39607008", + "display": "Lung structure (body structure)" + } ] + } ], + "report": [ { + "reference": "DiagnosticReport/7db8d983943891d0e79a2537f41df66a" + } ] + }, + "request": { + "method": "POST", + "url": "Procedure", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|23336a6967dc8136c44671d097dcebf3" + } + }, { + "fullUrl": "DiagnosticReport/121391ebc20f01c123838478c01eb099", + "resource": { + "resourceType": "DiagnosticReport", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diagnostic-report-radiology" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId", + "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.befund_bildgebender_verfahren_ct.1-befund_bildgebender_verfahren_roentgen" + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "18726-0", + "display": "Radiology studies (set)" + }, { + "system": "http://terminology.hl7.org/CodeSystem/v2-0074", + "code": "RAD", + "display": "Radiology" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "18748-4", + "display": "Diagnostic imaging study" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "conclusionCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "118247008:363713009=17621005" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "DiagnosticReport", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId|121391ebc20f01c123838478c01eb099" + } + }, { + "fullUrl": "Procedure/63d1e2cbec6a210a60808de18b88d430", + "resource": { + "resourceType": "Procedure", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/radiology-procedures" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", + "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.bildgebende_verfahren_ct.1-bildgebende_verfahren_roentgen" + } ], + "status": "completed", + "category": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "103693007", + "display": "Diagnostic procedure (procedure)" + } ] + }, + "code": { + "coding": [ { + "system": "http://dicom.nema.org/resources/ontology/DCM", + "code": "RG" + }, { + "system": "http://snomed.info/sct", + "code": "168537006:363704007=39607008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_performedDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "39607008", + "display": "Lung structure (body structure)" + } ] + } ], + "report": [ { + "reference": "DiagnosticReport/121391ebc20f01c123838478c01eb099" + } ] + }, + "request": { + "method": "POST", + "url": "Procedure", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|63d1e2cbec6a210a60808de18b88d430" + } + }, { + "fullUrl": "DiagnosticReport/ea540a3d68536a554ad89879d166fb9b", + "resource": { + "resourceType": "DiagnosticReport", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/diagnostic-report-radiology" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId", + "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.befund_bildgebender_verfahren_ct.1-befund_bildgebender_verfahren_us" + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "18726-0", + "display": "Radiology studies (set)" + }, { + "system": "http://terminology.hl7.org/CodeSystem/v2-0074", + "code": "RAD", + "display": "Radiology" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "18748-4", + "display": "Diagnostic imaging study" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "conclusionCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "118247008:363713009=373068000" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "DiagnosticReport", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/diagnosticreportId|ea540a3d68536a554ad89879d166fb9b" + } + }, { + "fullUrl": "Procedure/834e4facc0023e09ada2ddae64cbbf52", + "resource": { + "resourceType": "Procedure", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/radiology-procedures" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", + "value": "1-Event.1_fall_arm_1.1-Form.bildgebung.1-bildgebung.bildgebende_verfahren_ct.1-bildgebende_verfahren_us" + } ], + "status": "completed", + "category": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "103693007", + "display": "Diagnostic procedure (procedure)" + } ] + }, + "code": { + "coding": [ { + "system": "http://dicom.nema.org/resources/ontology/DCM", + "code": "US" + }, { + "system": "http://snomed.info/sct", + "code": "16310003:363704007=39607008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_performedDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "bodySite": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "39607008", + "display": "Lung structure (body structure)" + } ] + } ], + "report": [ { + "reference": "DiagnosticReport/ea540a3d68536a554ad89879d166fb9b" + } ] + }, + "request": { + "method": "POST", + "url": "Procedure", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|834e4facc0023e09ada2ddae64cbbf52" + } + }, { + "fullUrl": "Observation/a7e0bafdb16b5208b621146591775bf2", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pregnancy-status" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.schwangerschaft_code.1-schwangerschaft_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "social-history", + "display": "Social History" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "82810-3" + } ], + "text": "Pregnancy status" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://loinc.org", + "code": "LA15173-0" + }, { + "system": "http://snomed.info/sct", + "code": "77386006" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|a7e0bafdb16b5208b621146591775bf2" + } + }, { + "fullUrl": "Observation/4f1849da986cd6574243cad240676309", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sex-assigned-at-birth" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.biologisches_geschlecht_code.1-biologisches_geschlecht_code" + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "social-history", + "display": "Social History" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "76689-9" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://hl7.org/fhir/administrative-gender", + "code": "female" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|4f1849da986cd6574243cad240676309" + } + }, { + "fullUrl": "Observation/c7ac42650063403e9bf68f545afb512f", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/frailty-score" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.frailtyscore_code.1-frailtyscore_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "survey", + "display": "Survey" + } ] + } ], + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "763264000" + } ], + "text": "Frailty Scale Score" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/frailty-score", + "code": "9" + } ] + }, + "method": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "445414007", + "display": "Canadian Study of Health and Aging clinical frailty scale" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c7ac42650063403e9bf68f545afb512f" + } + }, { + "fullUrl": "Observation/540a48c942408b04a753b7a9f05987f0", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/body-weight" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.gewicht_code.1-gewicht_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "29463-7" + }, { + "system": "http://snomed.info/sct", + "code": "27113001" + } ], + "text": "Body Weight" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 130, + "unit": "kilogram", + "system": "http://unitsofmeasure.org", + "code": "kg" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|540a48c942408b04a753b7a9f05987f0" + } + }, { + "fullUrl": "Observation/b1e6c82a81da9cc7c53da1742adc0ac6", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/body-height" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.demographie.1-demographie.korpergrose_code.1-korpergrose_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "8302-2" + }, { + "system": "http://snomed.info/sct", + "code": "50373000" + } ], + "text": "Body height" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 155, + "unit": "centimeter", + "system": "http://unitsofmeasure.org", + "code": "cm" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|b1e6c82a81da9cc7c53da1742adc0ac6" + } + }, { + "fullUrl": "Observation/56a2ff5358f4cee3e741092b35344199", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/known-exposure" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.epidemiologische_faktoren.1-epidemiologische_faktoren.kontakt_mit_an_covid19_erkrankter_personq_code.1-kontakt_mit_an_covid19_erkrankter_personq_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "social-history", + "display": "Social History" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "88636-6" + } ], + "text": "Known exposure" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "840546002" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|56a2ff5358f4cee3e741092b35344199" + } + }, { + "fullUrl": "Condition/10e70a8e57207b64c3fa26d51fa9500d", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_venoese_thrombose" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "116223007" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I82.9" + }, { + "system": "http://snomed.info/sct", + "code": "111293003" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|10e70a8e57207b64c3fa26d51fa9500d" + } + }, { + "fullUrl": "Condition/e95e2237f89e17e3a6667368c478ade6", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_lungenarterienembolie" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "116223007" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I26.9" + }, { + "system": "http://snomed.info/sct", + "code": "59282003" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e95e2237f89e17e3a6667368c478ade6" + } + }, { + "fullUrl": "Condition/b477e364572e1e76563eca485ba3314e", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_stroke" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "116223007" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I64" + }, { + "system": "http://snomed.info/sct", + "code": "230690007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|b477e364572e1e76563eca485ba3314e" + } + }, { + "fullUrl": "Condition/326e7bcdc551143b739a9805ed73576f", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_myokardinfarkt" + } ], + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "116223007" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I21.9" + }, { + "system": "http://snomed.info/sct", + "code": "22298006" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|326e7bcdc551143b739a9805ed73576f" + } + }, { + "fullUrl": "Condition/6b61f570cda73213491211f04ae52d02", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] + }, + "modifierExtension": [ { + "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "261665006", + "display": "Unknown (qualifier value)" + } ], + "text": "Presence unknown." + } + } ], + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_andere" + } ], + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "116223007" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "I82.9" + }, { + "system": "http://snomed.info/sct", + "code": "371039008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|6b61f570cda73213491211f04ae52d02" + } + }, { + "fullUrl": "Condition/defb942e73ddf1cc6a28aacbf7c623a1", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_pulmonale_co_infektionen" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "116223007" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "J18.9" + }, { + "system": "http://snomed.info/sct", + "code": "128601007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|defb942e73ddf1cc6a28aacbf7c623a1" + } + }, { + "fullUrl": "Condition/518b244a9ff9fcd52da05f8965bcf6df", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/complications-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.komplikationen.1-komplikationen.komplikation_thrombembolische_ereignisse.1-komplikation_blutstrominfektionen" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "116223007" + } ] + } ], + "code": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "version": "2021", + "code": "A41.9" + }, { + "system": "http://snomed.info/sct", + "code": "434156008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|518b244a9ff9fcd52da05f8965bcf6df" + } + }, { + "fullUrl": "Condition/0eb6da1056e1bc597088bfe4d07b6c04", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_bauchschmerzen" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "75325-1" + } ] + } ], + "severity": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "6736007" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "21522001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|0eb6da1056e1bc597088bfe4d07b6c04" + } + }, { + "fullUrl": "Condition/18f4a74b819f48e846aea8428cbf2e65", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_bewusstseinsstoerungen_verwirrtheit" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "refuted", + "display": "Refuted" + }, { + "system": "http://snomed.info/sct", + "code": "410594000", + "display": "Definitely NOT present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "75325-1" + } ] + } ], + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "40917007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|18f4a74b819f48e846aea8428cbf2e65" + } + }, { + "fullUrl": "Condition/7ae512e36d6be2671663a9c72a267ebc", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_durchfall" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "75325-1" + } ] + } ], + "severity": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "6736007" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "62315008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|7ae512e36d6be2671663a9c72a267ebc" + } + }, { + "fullUrl": "Condition/da799a2594ad682ccf003a17a42fa0a5", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_erbrechen" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "75325-1" + } ] + } ], + "severity": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "24484000" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "422400008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|da799a2594ad682ccf003a17a42fa0a5" + } + }, { + "fullUrl": "Condition/383f7ebb1247a9fdaf5154f4d2447565", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] + }, + "modifierExtension": [ { + "url": "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/uncertainty-of-presence", + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "261665006", + "display": "Unknown (qualifier value)" + } ], + "text": "Presence unknown." + } + } ], + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_husten" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "75325-1" + } ] + } ], + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "49727002" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|383f7ebb1247a9fdaf5154f4d2447565" + } + }, { + "fullUrl": "Condition/e6d3b0194d67cfadb95a73dc56fd5ced", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_kurzatmigkeit_dyspnoe" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "75325-1" + } ] + } ], + "severity": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "442452003" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "267036007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e6d3b0194d67cfadb95a73dc56fd5ced" + } + }, { + "fullUrl": "Condition/e58efc4175c485a70cae4d16515109f5", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_uebelkeit" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "75325-1" + } ] + } ], + "severity": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "24484000" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "422587007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|e58efc4175c485a70cae4d16515109f5" + } + }, { + "fullUrl": "Condition/cb351c76451dc77c7be7b33df720f11e", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_fieber" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "75325-1" + } ] + } ], + "severity": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "6736007" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "426000000" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|cb351c76451dc77c7be7b33df720f11e" + } + }, { + "fullUrl": "Condition/fd18f40e701b014998240c8ee77036b0", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/symptoms-covid-19" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.symptome.1-symptome.symptome_geruchs_bzw_geschmacksstoerungen.1-symptome_kopfschmerzen" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "75325-1" + } ] + } ], + "severity": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "255604002" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "25064002" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|fd18f40e701b014998240c8ee77036b0" + } + }, { + "fullUrl": "Procedure/f5099ee9e4ebecb30404aa827095425d", + "resource": { + "resourceType": "Procedure", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/dialysis" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", + "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.dialyse_hamofiltration_code.1-dialyse_hamofiltration_code" + } ], + "status": "in-progress", + "category": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "277132007", + "display": "Therapeutic procedure (procedure)" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "108241001" + } ], + "text": "Dialysis" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_performedDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Procedure", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|f5099ee9e4ebecb30404aa827095425d" + } + }, { + "fullUrl": "Procedure/f0681e4ddb86deeb21e4348f01d10f18", + "resource": { + "resourceType": "Procedure", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/apheresis" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", + "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.apherese_code.1-apherese_code" + } ], + "status": "in-progress", + "category": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "277132007", + "display": "Therapeutic procedure (procedure)" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "127788007" + } ], + "text": "Apheresis" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_performedDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Procedure", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|f0681e4ddb86deeb21e4348f01d10f18" + } + }, { + "fullUrl": "Procedure/4031dde4e474e8666379ecc981039015", + "resource": { + "resourceType": "Procedure", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/prone-position" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", + "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.bauchlage_code.1-bauchlage_code" + } ], + "status": "in-progress", + "category": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "225287004", + "display": "Procedures relating to positioning and support (procedure)" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "431182000" + } ], + "text": "Prone position" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_performedDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Procedure", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|4031dde4e474e8666379ecc981039015" + } + }, { + "fullUrl": "Procedure/f52ad2d78fa2e2f0b34d1978ce16ba9d", + "resource": { + "resourceType": "Procedure", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/extracorporeal-membrane-oxygenation" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", + "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.ecmotherapie_code.1-ecmotherapie_code" + } ], + "status": "in-progress", + "category": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "277132007", + "display": "Therapeutic procedure (procedure)" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "233573008" + } ], + "text": "ECMO" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_performedDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Procedure", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|f52ad2d78fa2e2f0b34d1978ce16ba9d" + } + }, { + "fullUrl": "Procedure/7f06d5b778fd7d9b7994b4709bfaba74", + "resource": { + "resourceType": "Procedure", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/respiratory-therapies" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/procedureId", + "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.beatmungstherapie_code.1-beatmungstherapie" + } ], + "status": "in-progress", + "category": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "277132007", + "display": "Therapeutic procedure (procedure)" + } ] + }, + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "371907003:425391005=426854004" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_performedDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "usedCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "426854004" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "Procedure", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/procedureId|7f06d5b778fd7d9b7994b4709bfaba74" + } + }, { + "fullUrl": "Observation/4b5f5a80141ab5ae8077f3f88211eeca", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/patient-in-icu" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.therapie.1-therapie.liegt_der_patient_auf_der_intensivstationq_code.1-liegt_der_patient_auf_der_intensivstationq" + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "survey", + "display": "Survey" + } ] + } ], + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "01", + "display": "Is the patient in the intensive care unit?" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373066001" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|4b5f5a80141ab5ae8077f3f88211eeca" + } + }, { + "fullUrl": "Condition/030b210545dfcce392b2437998748873", + "resource": { + "resourceType": "Condition", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/dependence-on-ventilator" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/conditionId", + "value": "1-Event.1_fall_arm_1.1-Form.outcome_bei_entlassung.1-outcome_bei_entlassung.respiratorisches_outcome_code.1-respiratorisches_outcome_code" + } ], + "clinicalStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } ] + }, + "verificationStatus": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", + "code": "confirmed", + "display": "Confirmed" + }, { + "system": "http://snomed.info/sct", + "code": "410605003", + "display": "Confirmed present (qualifier value)" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "404989005", + "display": "Ventilation status (observable entity)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "444932008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_recordedDate": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + } + }, + "request": { + "method": "POST", + "url": "Condition", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/conditionId|030b210545dfcce392b2437998748873" + } + }, { + "fullUrl": "Observation/295079020c484b97139cf61dfd17597f", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/discharge-disposition" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.outcome_bei_entlassung.1-outcome_bei_entlassung.entlassungsart_code.1-entlassungsart_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "social-history", + "display": "Social History" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "55128-3" + } ], + "text": "type of Discharge" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "371827001" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|295079020c484b97139cf61dfd17597f" + } + }, { + "fullUrl": "Observation/7036a4295910bec756a86548c51c2155", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-rt-pcr" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.outcome_bei_entlassung.1-outcome_bei_entlassung.ergebnis_folgeabstrich_code.1-ergebnis_folgeabstrich_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6", + "display": "Laboratory studies (set)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94500-6" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "260373001" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|7036a4295910bec756a86548c51c2155" + } + }, { + "fullUrl": "Observation/c6c4aa0c109f0ef0ce0bea83d1295000", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.crp_code.1-crp", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "48421-2", + "display": "c-reactive-protein-in-capillary-blood" + } ], + "text": "crp" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 20.12, + "unit": "mg/dL", + "system": "http://unitsofmeasure.org", + "code": "mg/dL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c6c4aa0c109f0ef0ce0bea83d1295000" + } + }, { + "fullUrl": "Observation/b18504380f29923f1e2535f0690ae652", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ferritin_code.1-ferritin", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "86914-9", + "display": "ferritin-goal-serum-or-plasma" + } ], + "text": "ferritin" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12.12, + "unit": "ng/mL", + "system": "http://unitsofmeasure.org", + "code": "ng/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|b18504380f29923f1e2535f0690ae652" + } + }, { + "fullUrl": "Observation/57af451484bed3dac9d0658e76e60abb", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.bilirubin_code.1-bilirubin", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "14631-6", + "display": "bilirubin.total-in-serum-or-plasma" + } ], + "text": "bilirubin" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12.23, + "unit": "umol/L", + "system": "http://unitsofmeasure.org", + "code": "umol/L" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|57af451484bed3dac9d0658e76e60abb" + } + }, { + "fullUrl": "Observation/a9dd6563d85197d56723589bbd50a456", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ddimer_code.1-ddimer", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "48066-5", + "display": "fibrin-d-dimer-ddu-in-platelet-poor-plasma" + } ], + "text": "ddimer" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 10.0, + "unit": "ng/mL", + "system": "http://unitsofmeasure.org", + "code": "ng/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|a9dd6563d85197d56723589bbd50a456" + } + }, { + "fullUrl": "Observation/aad455b964a2553d98a2069d46a9c862", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.gammagt_code.1-gammagt", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "2325-9", + "display": "gamma-glutamyl-transferase-aspartate-aminotransferase-in-serum-or-plasma" + } ], + "text": "gammagt" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 5.2, + "unit": "U/L", + "system": "http://unitsofmeasure.org", + "code": "U/L" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|aad455b964a2553d98a2069d46a9c862" + } + }, { + "fullUrl": "Observation/19d8d00510005a69deea2bf1098f6831", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.gotast_code.1-gotast", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "88112-8", + "display": "aspartate-aminotransferase-in-serum-or-plasma-by-no-addition-of-p-5-p" + } ], + "text": "gotast" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 140, + "unit": "U/L", + "system": "http://unitsofmeasure.org", + "code": "U/L" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|19d8d00510005a69deea2bf1098f6831" + } + }, { + "fullUrl": "Observation/7d1a6f74189f4f0c548d02ceeacaa77a", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ldh_code.1-ldh", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "14803-1", + "display": "lactate-dehydrogenase-in-body-fluid-by-lactate-to-pyruvate-reaction" + } ], + "text": "ldh" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 150, + "unit": "U/L", + "system": "http://unitsofmeasure.org", + "code": "U/L" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|7d1a6f74189f4f0c548d02ceeacaa77a" + } + }, { + "fullUrl": "Observation/0d981d3043fc264fa9b78f9b26029a48", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.kardiale_troponine_code.1-kardiale_troponine", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "48425-3", + "display": "troponin-t.cardiac-in-blood" + } ], + "text": "kardiale_troponine" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12.2, + "unit": "ng/mL", + "system": "http://unitsofmeasure.org", + "code": "ng/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|0d981d3043fc264fa9b78f9b26029a48" + } + }, { + "fullUrl": "Observation/c1108c784b76b703cb069b34bcf34de8", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.hamoglobin_code.1-hamoglobin", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "718-7", + "display": "hemoglobin-in-blood" + } ], + "text": "hamoglobin" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 8.5, + "unit": "g/dL", + "system": "http://unitsofmeasure.org", + "code": "g/dL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c1108c784b76b703cb069b34bcf34de8" + } + }, { + "fullUrl": "Observation/d3c90eae28de0fbbf0a7d6c22a6b920d", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.kreatinin_code.1-kreatinin", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "2160-0", + "display": "creatinine-in-serum-or-plasma" + } ], + "text": "kreatinin" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12.5, + "unit": "mg/L", + "system": "http://unitsofmeasure.org", + "code": "mg/L" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|d3c90eae28de0fbbf0a7d6c22a6b920d" + } + }, { + "fullUrl": "Observation/daeaafe11755740646d6e93bd13cdf10", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.laktat_code.1-laktat", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "14118-4", + "display": "lactate-in-serum-or-plasma" + } ], + "text": "laktat" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12, + "unit": "mg/dL", + "system": "http://unitsofmeasure.org", + "code": "mg/dL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|daeaafe11755740646d6e93bd13cdf10" + } + }, { + "fullUrl": "Observation/d6b363609ec0f23d45f3c248e196ae1e", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.leukozyten_absolut_code.1-leukozyten_absolut", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "6690-2", + "display": "leukocytes-in-blood-by-automated-count" + } ], + "text": "leukozyten_absolut" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 124, + "unit": "10*3/uL", + "system": "http://unitsofmeasure.org", + "code": "10*3/uL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|d6b363609ec0f23d45f3c248e196ae1e" + } + }, { + "fullUrl": "Observation/05cbe513382c2611d7a38f2d9576b026", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.lymphozyten_absolut_code.1-lymphozyten_absolut", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "731-0", + "display": "lymphocytes-in-blood-by-automated-count" + } ], + "text": "lymphozyten_absolut" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 162.2, + "unit": "10*3/uL", + "system": "http://unitsofmeasure.org", + "code": "10*3/uL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|05cbe513382c2611d7a38f2d9576b026" + } + }, { + "fullUrl": "Observation/c788d56370f329e0fc639d441944b966", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.neutrophile_absolut_code.1-neutrophile_absolut", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "26499-4", + "display": "neutrophils-in-blood" + } ], + "text": "neutrophile_absolut" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 10.67, + "unit": "10*3/uL", + "system": "http://unitsofmeasure.org", + "code": "10*3/uL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c788d56370f329e0fc639d441944b966" + } + }, { + "fullUrl": "Observation/b62ab4cb10abf72c9a392d7f875ee513", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ptt_code.1-ptt", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "16631-4", + "display": "aptt-in-blood-by-coagulation-11-saline" + } ], + "text": "ptt" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 5, + "unit": "s", + "system": "http://unitsofmeasure.org", + "code": "s" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|b62ab4cb10abf72c9a392d7f875ee513" + } + }, { + "fullUrl": "Observation/438c4a7ca77969f413a05a1a9dfdfb2a", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.thrombozyten_absolut_code.1-thrombozyten_absolut", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "26516-5", + "display": "platelets-in-plasma" + } ], + "text": "thrombozyten_absolut" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 9.9, + "unit": "10*3/uL", + "system": "http://unitsofmeasure.org", + "code": "10*3/uL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|438c4a7ca77969f413a05a1a9dfdfb2a" + } + }, { + "fullUrl": "Observation/19879eaeb48f6ad089e882c252a7440e", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.inr_code.1-inr", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "46418-0", + "display": "inr-in-capillary-blood-by-coagulation-assay" + } ], + "text": "inr" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 99.9, + "unit": "{INR}", + "system": "http://unitsofmeasure.org", + "code": "{INR}" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|19879eaeb48f6ad089e882c252a7440e" + } + }, { + "fullUrl": "Observation/90836f31df913c7c16459ec5e8acbaf5", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.serumalbumin_code.1-serumalbumin", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "61152-5", + "display": "albumin-in-serum-or-plasma-by-bromocresol-purple-bcp-dye-binding-method" + } ], + "text": "serumalbumin" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 9.9, + "unit": "g/dL", + "system": "http://unitsofmeasure.org", + "code": "g/dL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|90836f31df913c7c16459ec5e8acbaf5" + } + }, { + "fullUrl": "Observation/10ecb6f5122913455d8adc1bec2cc61b", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.antithrombin_iii_code.1-antithrombin_iii", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "3174-0", + "display": "antithrombin-in-platelet-poor-plasma-by-chromogenic-method" + } ], + "text": "antithrombin_iii" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 9.4, + "unit": "[IU]/mL", + "system": "http://unitsofmeasure.org", + "code": "[IU]/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|10ecb6f5122913455d8adc1bec2cc61b" + } + }, { + "fullUrl": "Observation/a9e3a6cb462320856852a4a4f1b40451", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.pct_procalcitonin_code.1-pct_procalcitonin", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "75241-0", + "display": "procalcitonin-in-serum-or-plasma-by-immunoassay" + } ], + "text": "pct_procalcitonin" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 123.99, + "unit": "ng/mL", + "system": "http://unitsofmeasure.org", + "code": "ng/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|a9e3a6cb462320856852a4a4f1b40451" + } + }, { + "fullUrl": "Observation/69cf7898a72f2ad8134a0a56fcca294e", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.il6_interleukin_6_code.1-il6_interleukin_6", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "44322-6", + "display": "interleukin-6-in-serum-or-plasma" + } ], + "text": "il6_interleukin_6" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 22.99, + "unit": "pg/mL", + "system": "http://unitsofmeasure.org", + "code": "pg/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|69cf7898a72f2ad8134a0a56fcca294e" + } + }, { + "fullUrl": "Observation/ab8f04367e154d82937a130774cc7d79", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.ntprobnp_code.1-ntprobnp", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "33762-6", + "display": "natriuretic-peptide.b-prohormone-n-terminal-in-serum-or-plasma" + } ], + "text": "ntprobnp" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 23.12, + "unit": "pg/mL", + "system": "http://unitsofmeasure.org", + "code": "pg/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|ab8f04367e154d82937a130774cc7d79" + } + }, { + "fullUrl": "Observation/d0c364ae358b5cd6afafbd00d49e5b1e", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.fibrinogen_code.1-fibrinogen", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "30902-1", + "display": "fibrinogen-in-platelet-poor-plasma-by-heat-denaturation" + } ], + "text": "fibrinogen" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12, + "unit": "g/L", + "system": "http://unitsofmeasure.org", + "code": "g/L" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|d0c364ae358b5cd6afafbd00d49e5b1e" + } + }, { + "fullUrl": "Observation/c03e0a5a1ce3bc2c467bf4c555a496da", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-rt-pcr" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2rtpcr_code.1-sarsco_v2rtpcr_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94500-6", + "display": "sars-cov-2-covid-19-rna-in-respiratory-specimen-by-naa-with-probe-detection" + } ], + "text": "SARS-CoV-2-RNA (PCR)" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "260373001", + "display": "Detected (qualifier value)" + } ], + "text": "SARS-CoV-2-RNA positiv" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c03e0a5a1ce3bc2c467bf4c555a496da" + } + }, { + "fullUrl": "Observation/71c3c99f3aa819f15620db902f7bf554", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-ab-pnl-ser-pl-ia" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ab_ia_ql_code.1-sarsco_v2_covid19_ab_pnl_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94504-8" + } ], + "text": "sarsco_v2_covid19_ab_pnl" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "hasMember": [ { + "reference": "Observation/36aa48a9cf003b80b5d8409b9f84cd4c" + }, { + "reference": "Observation/d0defccbd7da3608f83a29d94c81b4a1" + }, { + "reference": "Observation/1fad7001bef169ba818f8d022e67714e" + }, { + "reference": "Observation/97c5e718cf6dbf4b534c0c9cfc59e614" + }, { + "reference": "Observation/97bc563b27ce55d0c54eeb23f7ee79e3" + }, { + "reference": "Observation/cbe306564e08d1f48b857a8a4bdd8d08" + }, { + "reference": "Observation/0d7142d3e0a5e68f31be7bd72c68687b" + }, { + "reference": "Observation/34d7542e8550af2e3c4a451ef05ea2fc" + } ] + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|71c3c99f3aa819f15620db902f7bf554" + } + }, { + "fullUrl": "Observation/36aa48a9cf003b80b5d8409b9f84cd4c", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-ab-ser-pl-ql-ia" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ab_ia_ql_code.1-sarsco_v2_covid19_ab_ia_ql_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94762-2", + "display": "sars-cov-2-covid-19-ab-in-serum-or-plasma-by-immunoassay" + } ], + "text": "sarsco_v2_covid19_ab_ia_ql" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "260415000" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|36aa48a9cf003b80b5d8409b9f84cd4c" + } + }, { + "fullUrl": "Observation/d0defccbd7da3608f83a29d94c81b4a1", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-ab-ser-pl-ia-acnc" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ab_ia_qn_code.1-sarsco_v2_covid19_ab_ia_qn_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94769-7", + "display": "sars-cov-2-covid-19-ab-in-serum-or-plasma-by-immunoassay" + } ], + "text": "sarsco_v2_covid19_ab_ia_qn" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 15, + "unit": "[IU]/mL", + "system": "http://unitsofmeasure.org", + "code": "[IU]/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|d0defccbd7da3608f83a29d94c81b4a1" + } + }, { + "fullUrl": "Observation/1fad7001bef169ba818f8d022e67714e", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-iga-ser-pl-ql-ia" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_a_ia_ql_code.1-sarsco_v2_covid19_ig_a_ia_ql_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94562-6", + "display": "sars-cov-2-covid-19-iga-ab-in-serum-or-plasma-by-immunoassay" + } ], + "text": "sarsco_v2_covid19_ig_a_ia_ql" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "260373001" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|1fad7001bef169ba818f8d022e67714e" + } + }, { + "fullUrl": "Observation/97c5e718cf6dbf4b534c0c9cfc59e614", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-iga-ser-pl-ia-acnc" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_a_ia_qn_code.1-sarsco_v2_covid19_ig_a_ia_qn_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94720-0", + "display": "sars-cov-2-covid-19-iga-ab-in-serum-or-plasma-by-immunoassay" + } ], + "text": "sarsco_v2_covid19_ig_a_ia_qn" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12, + "unit": "[IU]/mL", + "system": "http://unitsofmeasure.org", + "code": "[IU]/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|97c5e718cf6dbf4b534c0c9cfc59e614" + } + }, { + "fullUrl": "Observation/97bc563b27ce55d0c54eeb23f7ee79e3", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-igg-ser-pl-ql-ia" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_g_ia_ql_code.1-sarsco_v2_covid19_ig_g_ia_ql_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94563-4", + "display": "sars-cov-2-covid-19-igg-ab-in-serum-or-plasma-by-immunoassay" + } ], + "text": "sarsco_v2_covid19_ig_g_ia_ql" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "260373001" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|97bc563b27ce55d0c54eeb23f7ee79e3" + } + }, { + "fullUrl": "Observation/cbe306564e08d1f48b857a8a4bdd8d08", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-igg-ser-pl-ia-acnc" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_g_ia_qn_code.1-sarsco_v2_covid19_ig_g_ia_qn_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94505-5", + "display": "sars-cov-2-covid-19-igg-ab-in-serum-or-plasma-by-immunoassay" + } ], + "text": "sarsco_v2_covid19_ig_g_ia_qn" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12.6, + "unit": "[arb'U]/mL", + "system": "http://unitsofmeasure.org", + "code": "[arb'U]/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|cbe306564e08d1f48b857a8a4bdd8d08" + } + }, { + "fullUrl": "Observation/0d7142d3e0a5e68f31be7bd72c68687b", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-igm-ser-pl-ql-ia" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_m_ia_ql_code.1-sarsco_v2_covid19_ig_m_ia_ql_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94564-2", + "display": "sars-cov-2-covid-19-igm-ab-in-serum-or-plasma-by-immunoassay" + } ], + "text": "sarsco_v2_covid19_ig_m_ia_ql" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "260373001" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|0d7142d3e0a5e68f31be7bd72c68687b" + } + }, { + "fullUrl": "Observation/34d7542e8550af2e3c4a451ef05ea2fc", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sars-cov-2-igm-ser-pl-ia-acnc" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.laborwerte.1-laborwerte.sarsco_v2_covid19_ig_m_ia_qn_code.1-sarsco_v2_covid19_ig_m_ia_qn_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "94506-3", + "display": "sars-cov-2-covid-19-igm-ab-in-serum-or-plasma-by-immunoassay" + } ], + "text": "sarsco_v2_covid19_ig_m_ia_qn" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12, + "unit": "[arb'U]/mL", + "system": "http://unitsofmeasure.org", + "code": "[arb'U]/mL" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|34d7542e8550af2e3c4a451ef05ea2fc" + } + }, { + "fullUrl": "MedicationStatement/738644ecbdf2351ad08ad6e914c44d1b", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_antipyretika" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "N02B" + }, { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "antipyretic" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|738644ecbdf2351ad08ad6e914c44d1b" + } + }, { + "fullUrl": "MedicationStatement/b65dcd2c29be11ec690b1f97170c69ca", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_kortikosteroide" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "G01B" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|b65dcd2c29be11ec690b1f97170c69ca" + } + }, { + "fullUrl": "MedicationStatement/f82761d223e1bce214c390ce48fa7a32", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_atazanavir" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AR15" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f82761d223e1bce214c390ce48fa7a32" + } + }, { + "fullUrl": "MedicationStatement/82c925220f1b1192b43f8fae91123d4e", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_darunavir" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AR14" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|82c925220f1b1192b43f8fae91123d4e" + } + }, { + "fullUrl": "MedicationStatement/a8260b3a2712040d97b611829126856c", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_chloroquine_phosphate" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "P01BA01" + }, { + "system": "http://snomed.info/sct", + "code": "14728000" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|a8260b3a2712040d97b611829126856c" + } + }, { + "fullUrl": "MedicationStatement/66a3a49903b2d6283d00a0612d0021d7", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_hydroxychloroquine" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "P01BA02" + }, { + "system": "http://snomed.info/sct", + "code": "83490000" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|66a3a49903b2d6283d00a0612d0021d7" + } + }, { + "fullUrl": "MedicationStatement/8530d5fb33d3a055fc9692e9828f4d75", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_ivermectin" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "D11AX22" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "P02CF01" + }, { + "system": "http://snomed.info/sct", + "code": "96138006" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|8530d5fb33d3a055fc9692e9828f4d75" + } + }, { + "fullUrl": "MedicationStatement/f1c4170a4a772bd7ef5d706f08aef9e2", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_lopinavir_ritonavir" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AR10" + }, { + "system": "http://snomed.info/sct", + "code": "134573001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f1c4170a4a772bd7ef5d706f08aef9e2" + } + }, { + "fullUrl": "MedicationStatement/b17d67fee5e95da4d329b8aa34ca3f6d", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_ganciclovir" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AB06" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "S01AD09" + }, { + "system": "http://snomed.info/sct", + "code": "78025001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|b17d67fee5e95da4d329b8aa34ca3f6d" + } + }, { + "fullUrl": "MedicationStatement/466ab6bd182e5feda2b1d7a7aeff6ee0", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_oseltamivir" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AH02" + }, { + "system": "http://snomed.info/sct", + "code": "386142008" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|466ab6bd182e5feda2b1d7a7aeff6ee0" + } + }, { + "fullUrl": "MedicationStatement/d5a099001e02479728054c2808d15d7b", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_remdesivir" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fdasis.nlm.nih.gov", + "code": "3QKI37EEHE" + }, { + "system": "http://snomed.info/sct", + "code": "870518005" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|d5a099001e02479728054c2808d15d7b" + } + }, { + "fullUrl": "MedicationStatement/f3c1aee6cef1a72302a3a08985d139f2", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_ribavirin" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AP01" + }, { + "system": "http://snomed.info/sct", + "code": "35063004" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f3c1aee6cef1a72302a3a08985d139f2" + } + }, { + "fullUrl": "MedicationStatement/f40ce9b76c2112d9e538291d6be69534", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_camostat" + } ], + "status": "not-taken", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B02AB04" + }, { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "camostat" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f40ce9b76c2112d9e538291d6be69534" + } + }, { + "fullUrl": "MedicationStatement/c678f28f5d497d6587faa76efbd77480", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_favipiravir" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AX27" + }, { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "favipiravir" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|c678f28f5d497d6587faa76efbd77480" + } + }, { + "fullUrl": "MedicationStatement/2cfe06dea473205aa4b55ac50c2b5239", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_convalescent_plasma" + } ], + "status": "not-taken", + "medicationCodeableConcept": { + "coding": [ { + "system": "urn:oid:2.16.840.1.113883.6.18.2.6", + "code": "E9743" + }, { + "system": "urn:oid:2.16.840.1.113883.6.18.2.6", + "code": "E9744" + }, { + "system": "urn:oid:2.16.840.1.113883.6.18.2.6", + "code": "E9745" + }, { + "system": "urn:oid:2.16.840.1.113883.6.18.2.6", + "code": "E9746" + }, { + "system": "urn:oid:2.16.840.1.113883.6.18.2.6", + "code": "E9747" + }, { + "system": "urn:oid:2.16.840.1.113883.6.18.2.6", + "code": "E9748" + }, { + "system": "urn:oid:2.16.840.1.113883.6.18.2.6", + "code": "E9749" + }, { + "system": "urn:oid:2.16.840.1.113883.6.18.2.6", + "code": "E9750" + }, { + "system": "urn:oid:2.16.840.1.113883.6.18.2.6", + "code": "E9752" + }, { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "convalescent-plasma" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|2cfe06dea473205aa4b55ac50c2b5239" + } + }, { + "fullUrl": "MedicationStatement/2fff8ba7810f13abf56da951ecce5e20", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_steroids_gt_05_mg_kg_prednisone_equivalents" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "steroids-gt" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|2fff8ba7810f13abf56da951ecce5e20" + } + }, { + "fullUrl": "MedicationStatement/8e84ab83f716721f1511115a1559d0c3", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_steroids_lt_05_mg_kg_prednisone_equivalents" + } ], + "status": "unknown", + "medicationCodeableConcept": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "steroids-lt" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|8e84ab83f716721f1511115a1559d0c3" + } + }, { + "fullUrl": "MedicationStatement/7d140cba5db00a82030badcf23cad1cc", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_tocilizumab" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/ops", + "code": "6-005.n" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|7d140cba5db00a82030badcf23cad1cc" + } + }, { + "fullUrl": "MedicationStatement/0a33e036990066e9249c4e22121eec33", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_sarilumab" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/ops", + "code": "6-00a.g" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "L04AC14" + }, { + "system": "http://snomed.info/sct", + "code": "763522001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|0a33e036990066e9249c4e22121eec33" + } + }, { + "fullUrl": "MedicationStatement/17571b1d79e88d61df8be3af16321744", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_cni_or_mtor_inhibitors_eg_cyclosporin_a_tacrolimus_sirolimus_everolimus" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "L01XE10" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|17571b1d79e88d61df8be3af16321744" + } + }, { + "fullUrl": "MedicationStatement/a4c1e5ea57e481bc19ee53caf3a10574", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_anti_tnf_alpha_inhibitors_eg_adalimumab_etanercept" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/ops", + "code": "6-002.b" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|a4c1e5ea57e481bc19ee53caf3a10574" + } + }, { + "fullUrl": "MedicationStatement/fb26c96ddc5fb7104215b062648162ce", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_il1_receptor_antangonists" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/ops", + "code": "6-006.7" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "L04AC" + }, { + "system": "http://snomed.info/sct", + "code": "430817009" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|fb26c96ddc5fb7104215b062648162ce" + } + }, { + "fullUrl": "MedicationStatement/167d6dfb19a796fdc360bfd892bdf306", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_ruxolitinib" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/ops", + "code": "6-009.4" + }, { + "system": "http://snomed.info/sct", + "code": "703779004" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|167d6dfb19a796fdc360bfd892bdf306" + } + }, { + "fullUrl": "MedicationStatement/78a5ff941c5a3a644b233df9bc0b2567", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_colchicine" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "M04AC01" + }, { + "system": "http://snomed.info/sct", + "code": "73133000" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|78a5ff941c5a3a644b233df9bc0b2567" + } + }, { + "fullUrl": "MedicationStatement/1406d6cd4f8eef4f9c27cd2b0fac4dec", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_interferone_any" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "S01AD05" + }, { + "system": "http://snomed.info/sct", + "code": "768865007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|1406d6cd4f8eef4f9c27cd2b0fac4dec" + } + }, { + "fullUrl": "MedicationStatement/0e8bb33746d93301ad626c71decf112b", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_25_hydroxyvitamin_d" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "A11CC06" + }, { + "system": "http://snomed.info/sct", + "code": "88519001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|0e8bb33746d93301ad626c71decf112b" + } + }, { + "fullUrl": "MedicationStatement/dd7d6def763677e172e59600743462f9", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.covid19therapie_antipyretika.1-covid19therapie_zinc" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "A12CB" + }, { + "system": "http://snomed.info/sct", + "code": "764877006" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|dd7d6def763677e172e59600743462f9" + } + }, { + "fullUrl": "MedicationStatement/d65661ae8c7fd7f8ecd7be9b5274813d", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.acehemmer_code.1-acehemmer_code" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "41549009" + } ], + "text": "ACE inhibitors" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|d65661ae8c7fd7f8ecd7be9b5274813d" + } + }, { + "fullUrl": "MedicationStatement/f62da31eea0c8d9ac28284329f3d80d5", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.immunglobuline_code.1-immunglobuline_code" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "333710000" + } ], + "text": "immunoglobulins" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f62da31eea0c8d9ac28284329f3d80d5" + } + }, { + "fullUrl": "MedicationStatement/6d5d8b131ae1f26022f63358e6e11eb6", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_unfraktioniertes_heparin" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "81839001" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AB01" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00", + "reasonCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373808002", + "display": "Curative - procedure intent (qualifier value)" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|6d5d8b131ae1f26022f63358e6e11eb6" + } + }, { + "fullUrl": "MedicationStatement/466fd11e68703367b25dd0074b0dcc0b", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_niedermolekulares_heparin" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "81839001" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AB13" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00", + "reasonCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373808002", + "display": "Curative - procedure intent (qualifier value)" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|466fd11e68703367b25dd0074b0dcc0b" + } + }, { + "fullUrl": "MedicationStatement/40e9558eb38ea601648718b7a10e4aa6", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_argatroban" + } ], + "status": "not-taken", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "81839001" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AE03" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00", + "reasonCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373808002", + "display": "Curative - procedure intent (qualifier value)" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|40e9558eb38ea601648718b7a10e4aa6" + } + }, { + "fullUrl": "MedicationStatement/334462f597acdf650fc01fbafb7fd36f", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_plaettchenaggregationshemmer" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "81839001" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AC" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00", + "reasonCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373808002", + "display": "Curative - procedure intent (qualifier value)" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|334462f597acdf650fc01fbafb7fd36f" + } + }, { + "fullUrl": "MedicationStatement/9b8e2ab5561737dbaf9d1cd58f95e568", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_danaparoid" + } ], + "status": "unknown", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "81839001" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AB09" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00", + "reasonCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373808002", + "display": "Curative - procedure intent (qualifier value)" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|9b8e2ab5561737dbaf9d1cd58f95e568" + } + }, { + "fullUrl": "MedicationStatement/dfff4e5c14f1f27bb51c5cb3ad3ba811", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_phenprocoumon" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "81839001" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AA04" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00", + "reasonCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373808002", + "display": "Curative - procedure intent (qualifier value)" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|dfff4e5c14f1f27bb51c5cb3ad3ba811" + } + }, { + "fullUrl": "MedicationStatement/ed1a6e19bd697e1a9de4f0faf575bf7c", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_doak" + } ], + "status": "not-taken", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "81839001" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AE" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AF" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00", + "reasonCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373808002", + "display": "Curative - procedure intent (qualifier value)" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|ed1a6e19bd697e1a9de4f0faf575bf7c" + } + }, { + "fullUrl": "MedicationStatement/32de7959247fc3c3f4450cd689026e7b", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.1-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_sonstige" + } ], + "status": "not-taken", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "81839001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-07-14T14:45:00+00:00", + "reasonCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373808002", + "display": "Curative - procedure intent (qualifier value)" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|32de7959247fc3c3f4450cd689026e7b" + } + }, { + "fullUrl": "MedicationStatement/d311b1ac3dd07e4d5903d709fd9d83bb", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_antipyretika" + } ], + "status": "not-taken", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "N02B" + }, { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "antipyretic" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-09-24T09:31:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|d311b1ac3dd07e4d5903d709fd9d83bb" + } + }, { + "fullUrl": "MedicationStatement/3d8b08e728fe049b1832b8f97571c5cc", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_kortikosteroide" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "G01B" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "H02" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "M01BA" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "R03AK" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "S02B" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "R03AL" + }, { + "system": "http://snomed.info/sct", + "code": "768759001" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-09-24T09:31:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|3d8b08e728fe049b1832b8f97571c5cc" + } + }, { + "fullUrl": "MedicationStatement/f38ae64c09804ab0a51d1a2f5796d4fc", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_atazanavir" + } ], + "status": "not-taken", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AE08" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AR15" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "J05AR23" + }, { + "system": "http://snomed.info/sct", + "code": "413591007" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-09-24T09:31:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f38ae64c09804ab0a51d1a2f5796d4fc" + } + }, { + "fullUrl": "MedicationStatement/f5acfb6dbf038402a408c03fd8289d2d", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_colchicine" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "M04AC01" + }, { + "system": "http://snomed.info/sct", + "code": "73133000" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-09-24T09:31:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|f5acfb6dbf038402a408c03fd8289d2d" + } + }, { + "fullUrl": "MedicationStatement/ece97efdf3dbf61d9e00a353e6c3767e", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.covid19therapie_antipyretika.1-covid19therapie_zinc" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "A12CB" + }, { + "system": "http://snomed.info/sct", + "code": "764877006" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-09-24T09:31:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|ece97efdf3dbf61d9e00a353e6c3767e" + } + }, { + "fullUrl": "MedicationStatement/2e2da5b5c2bc3906bddf943751549995", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.acehemmer_code.1-acehemmer_code" + } ], + "status": "not-taken", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "41549009" + } ], + "text": "ACE inhibitors" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-09-24T09:31:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|2e2da5b5c2bc3906bddf943751549995" + } + }, { + "fullUrl": "MedicationStatement/00bb50daaf33f7970f2c8804179977aa", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.immunglobuline_code.1-immunglobuline_code" + } ], + "status": "active", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "333710000" + } ], + "text": "immunoglobulins" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-09-24T09:31:00+00:00" + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|00bb50daaf33f7970f2c8804179977aa" + } + }, { + "fullUrl": "MedicationStatement/c461ea66b4e42f85cc49bafa682937be", + "resource": { + "resourceType": "MedicationStatement", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pharmacological-therapy-anticoagulants" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId", + "value": "1-Event.1_fall_arm_1.1-Form.medikation.2-medikation.antikoagulation_unfraktioniertes_heparin.1-antikoagulation_unfraktioniertes_heparin" + } ], + "status": "not-taken", + "medicationCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "81839001" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AB01" + }, { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "B01AB51" + } ] + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "effectiveDateTime": "2020-09-24T09:31:00+00:00", + "reasonCode": [ { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373808002", + "display": "Curative - procedure intent (qualifier value)" + } ] + } ] + }, + "request": { + "method": "POST", + "url": "MedicationStatement", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/medicationstatementId|c461ea66b4e42f85cc49bafa682937be" + } + }, { + "fullUrl": "Observation/b6203461a5df4697fdf3e5e86c66d40e", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/carbon-dioxide-partial-pressure" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.pa_co2_code.1-pa_co2_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6", + "display": "Laboratory studies (set)" + }, { + "system": "http://loinc.org", + "code": "18767-4", + "display": "Blood gas studies (set)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "11557-6" + } ], + "text": "Carbon dioxide [Partial pressure] in blood" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12, + "unit": "mmHg", + "system": "http://unitsofmeasure.org", + "code": "mm[Hg]" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|b6203461a5df4697fdf3e5e86c66d40e" + } + }, { + "fullUrl": "Observation/c6fdecd3782aaff9e683305101191245", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/oxygen-partial-pressure" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.pa_o2_code.1-pa_o2_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6", + "display": "Laboratory studies (set)" + }, { + "system": "http://loinc.org", + "code": "18767-4", + "display": "Blood gas studies (set)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "11557-8" + } ], + "text": "Oxygen [Partial pressure] in blood" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12, + "unit": "mmHg", + "system": "http://unitsofmeasure.org", + "code": "mm[Hg]" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c6fdecd3782aaff9e683305101191245" + } + }, { + "fullUrl": "Observation/c1f61168b1b3225745c1ff64280fe576", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/inhaled-oxygen-concentration" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.fi_o2_code.1-fi_o2_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6", + "display": "Laboratory studies (set)" + }, { + "system": "http://loinc.org", + "code": "18767-4", + "display": "Blood gas studies (set)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "3150-0" + }, { + "system": "http://snomed.info/sct", + "code": "250774007" + } ], + "text": "Oxygen [Partial pressure] in blood" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12, + "unit": "%", + "system": "http://unitsofmeasure.org", + "code": "%" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c1f61168b1b3225745c1ff64280fe576" + } + }, { + "fullUrl": "Observation/89880d99ff5c2e29db82b82203e4e295", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/pH" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.p_hwert_code.1-p_hwert_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + }, { + "system": "http://loinc.org", + "code": "26436-6", + "display": "Laboratory studies (set)" + }, { + "system": "http://loinc.org", + "code": "18767-4", + "display": "Blood gas studies (set)" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "11558-4" + } ], + "text": "pH of Blood" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12, + "unit": "pH", + "system": "http://unitsofmeasure.org", + "code": "[pH]" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|89880d99ff5c2e29db82b82203e4e295" + } + }, { + "fullUrl": "Observation/c6f6bb4c56362d1fa454ecce2c8e2f91", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/sofa-score" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.sofa_score_resp.1-sofa_total_score", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "survey", + "display": "Survey" + } ] + } ], + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "06", + "display": "SOFA-Score" + } ], + "text": "Sepsis-related organ failure assessment score" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueInteger": 6, + "component": [ { + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "resp", + "display": "Respiratory system" + } ], + "text": "SOFA Respiratory system scoring category" + }, + "valueCodeableConcept": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "resp0", + "display": "Respiratory system SOFA score 0" + } ], + "text": "PaO2/FiO2 [mmHg (kPa)] ≥ 400 (53.3)" + } + }, { + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "ns", + "display": "Nervous system" + } ], + "text": "SOFA Nervous system scoring category" + }, + "valueCodeableConcept": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "ns2", + "display": "Nervous system SOFA score 2" + } ], + "text": "Glasgow Coma Scale (GCS) 10-12" + } + }, { + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "kid", + "display": "Kidneys" + } ], + "text": "SOFA Kidneys scoring category" + }, + "valueCodeableConcept": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "kid2", + "display": "Kidneys SOFA score 2" + } ], + "text": "Creatinine (mg/dl) [?mol/L] (or urine output) 2.0-3.4 [171-299]" + } + }, { + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "cvs", + "display": "Cardiovascular system" + } ], + "text": "SOFA Cardiovascular system scoring category" + }, + "valueCodeableConcept": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "cvs1", + "display": "Cardiovascular system SOFA score 1" + } ], + "text": "Mean arterial pressure (definitions) < 70 mmHg" + } + }, { + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "liv", + "display": "Liver" + } ], + "text": "SOFA Liver scoring category" + }, + "valueCodeableConcept": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "liv1", + "display": "Liver SOFA score 1" + } ], + "text": "Bilirubin (mg/dl) [umol/L] 1.2-1.9 [20-32]" + } + }, { + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "coa", + "display": "Coagulation" + } ], + "text": "SOFA Coagulation scoring category" + }, + "valueCodeableConcept": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/sofa-score", + "code": "coa0", + "display": "Coagulation SOFA score 0" + } ], + "text": "Platelets×10^3/ul ? 150" + } + } ] + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|c6f6bb4c56362d1fa454ecce2c8e2f91" + } + }, { + "fullUrl": "Observation/6f250b44c463792c053abb52996fdea7", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/respiratory-rate" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.atemfrequenz_code.1-atemfrequenz_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "9279-1" + }, { + "system": "http://snomed.info/sct", + "code": "86290005" + } ], + "text": "Respiratory rate" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 12, + "unit": "per minute", + "system": "http://unitsofmeasure.org", + "code": "/min" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|6f250b44c463792c053abb52996fdea7" + } + }, { + "fullUrl": "Observation/29c562a8deefb0ea52e80de99ad8c42e", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/blood-pressure" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.blutdruck_systolisch_code.1-blutdruck_systolisch_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "85354-9", + "display": "Blood pressure panel with all children optional" + }, { + "system": "http://snomed.info/sct", + "code": "75367002", + "display": "Blood pressure (observable entity)" + } ], + "text": "Blood pressure" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "component": [ { + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "8480-6" + }, { + "system": "http://snomed.info/sct", + "code": "271649006" + } ], + "text": "Systolic blood pressure" + }, + "valueQuantity": { + "value": 12, + "unit": "mmHg", + "system": "http://unitsofmeasure.org", + "code": "mm[Hg]" + } + }, { + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "8462-4" + }, { + "system": "http://snomed.info/sct", + "code": "271650006" + } ], + "text": "Diastolic blood pressure" + }, + "valueQuantity": { + "value": 12, + "unit": "mmHg", + "system": "http://unitsofmeasure.org", + "code": "mm[Hg]" + } + } ] + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|29c562a8deefb0ea52e80de99ad8c42e" + } + }, { + "fullUrl": "Observation/695442d147cccc0c169b6748ec0359c0", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/heart-rate" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.herzfrequenz_code.1-herzfrequenz_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "8867-4" + }, { + "system": "http://snomed.info/sct", + "code": "364075005" + } ], + "text": "Heart rate" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 60, + "unit": "per minute", + "system": "http://unitsofmeasure.org", + "code": "/min" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|695442d147cccc0c169b6748ec0359c0" + } + }, { + "fullUrl": "Observation/e5f9c86eafe6e1af1bcb9d442d9ec2ce", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/body-temperature" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.korpertemperatur_code.1-korpertemperatur_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "8310-5" + }, { + "system": "http://snomed.info/sct", + "code": "386725007" + } ], + "text": "Body temperature" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 38, + "unit": "°C", + "system": "http://unitsofmeasure.org", + "code": "Cel" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|e5f9c86eafe6e1af1bcb9d442d9ec2ce" + } + }, { + "fullUrl": "Observation/943c5d6bde4edbfad3f4621b37fba924", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/oxygen-saturation" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.1_fall_arm_1.1-Form.vitalparameter.1-vitalparameter.periphere_sauerstoffsattigung_code.1-periphere_sauerstoffsattigung_code", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } ] + } ], + "code": { + "coding": [ { + "system": "http://loinc.org", + "code": "2708-6" + }, { + "system": "http://loinc.org", + "code": "59408-5" + }, { + "system": "http://loinc.org", + "code": "20564-1" + }, { + "system": "http://snomed.info/sct", + "code": "431314004" + } ], + "text": "Oxygen saturation in Arterial blood" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "encounter": { + "reference": "Encounter/68b157940b50eb031e94379dbbc96f0c" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueQuantity": { + "value": 70, + "unit": "%", + "system": "http://unitsofmeasure.org", + "code": "%" + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|943c5d6bde4edbfad3f4621b37fba924" + } + }, { + "fullUrl": "Consent/e2e78e1c85111f2d58b7185f9f6e60b4", + "resource": { + "resourceType": "Consent", + "meta": { + "profile": [ "http://fhir.de/ConsentManagement/StructureDefinition/Consent" ] + }, + "identifier": [ { + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/consentId", + "value": "1-Event.basisdaten_arm_1.1-Form.einwilligungserklaerung_mii_broad_consent.1-einwilligungserklaerung_mii_broad_consent.miibc_dat_dok.1-miibc_consent_status" + } ], + "status": "active", + "scope": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes", + "code": "research", + "display": "Research Information Access" + } ] + }, + "category": [ { + "coding": [ { + "system": "http://loinc.org", + "code": "57016-8" + } ] + } ], + "patient": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "dateTime": "2020-12-11", + "organization": [ { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } ], + "policy": [ { + "uri": "https://www.medizininformatik-initiative.de/sites/default/files/2020-04/MII_AG-Consent_Einheitlicher-Mustertext_v1.6d.pdf" + } ], + "provision": { + "type": "deny", + "period": { + "start": "2020-12-11T00:00:00+00:00", + "end": "2050-12-11T00:00:00+00:00" + }, + "provision": [ { + "type": "permit", + "period": { + "start": "2020-12-11T00:00:00+00:00", + "end": "2050-12-11T00:00:00+00:00" + }, + "code": [ { + "coding": [ { + "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", + "code": "2.16.840.1.113883.3.1937.777.24.5.1.1", + "display": "gee_erhebung_verarbeitung" + } ] + } ] + }, { + "type": "permit", + "period": { + "start": "2015-12-11T00:00:00+00:00", + "end": "2020-12-11T00:00:00+00:00" + }, + "code": [ { + "coding": [ { + "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", + "code": "2.16.840.1.113883.3.1937.777.24.5.1.7", + "display": "gee_krankenkassendaten_retro" + } ] + } ] + }, { + "type": "permit", + "period": { + "start": "2020-12-11T00:00:00+00:00", + "end": "2025-12-11T00:00:00+00:00" + }, + "code": [ { + "coding": [ { + "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", + "code": "2.16.840.1.113883.3.1937.777.24.5.1.10", + "display": "gee_krankenkassendaten_pro" + } ] + } ] + }, { + "type": "deny", + "period": { + "start": "2020-12-11T00:00:00+00:00", + "end": "2050-12-11T00:00:00+00:00" + }, + "code": [ { + "coding": [ { + "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", + "code": "2.16.840.1.113883.3.1937.777.24.5.1.14", + "display": "gee_biomaterialien" + } ] + } ] + }, { + "type": "permit", + "period": { + "start": "2020-12-11T00:00:00+00:00", + "end": "2050-12-11T00:00:00+00:00" + }, + "code": [ { + "coding": [ { + "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", + "code": "2.16.840.1.113883.3.1937.777.24.5.1.31", + "display": "gee_biomaterialien_zusaetzlich" + } ] + } ] + }, { + "type": "permit", + "period": { + "start": "2020-12-11T00:00:00+00:00", + "end": "2050-12-11T00:00:00+00:00" + }, + "code": [ { + "coding": [ { + "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", + "code": "2.16.840.1.113883.3.1937.777.24.5.1.19", + "display": "gee_kontaktaufnahme" + } ] + } ] + }, { + "type": "deny", + "period": { + "start": "2020-12-11T00:00:00+00:00", + "end": "2050-12-11T00:00:00+00:00" + }, + "code": [ { + "coding": [ { + "system": "urn:oid:2.16.840.1.113883.3.1937.777.24.5.1", + "code": "2.16.840.1.113883.3.1937.777.24.5.1.23", + "display": "gee_kontaktaufnahme_zusatzbefunde" + } ] + } ] + } ] + } + }, + "request": { + "method": "POST", + "url": "Consent", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/consentId|e2e78e1c85111f2d58b7185f9f6e60b4" + } + }, { + "fullUrl": "Observation/093423f0996ef856f3357f1004b48ae8", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/study-inclusion-covid-19" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.basisdaten_arm_1.1-Form.studieneinschluss_einschlusskriterien.1-studieneinschluss_einschlusskriterien.covid19_aufnahme_code.1-covid19_aufnahme", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "survey", + "display": "Survey" + } ] + } ], + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "02", + "display": "Study inclusion due to Covid-19" + } ], + "text": "Confirmed Covid-19 diagnosis as main reason for enrolment in the study" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373066001" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|093423f0996ef856f3357f1004b48ae8" + } + }, { + "fullUrl": "Observation/1d82f3cb1072e66dbc76399a72608b38", + "resource": { + "resourceType": "Observation", + "meta": { + "profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/interventional-clinical-trial-participation" ] + }, + "identifier": [ { + "type": { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "OBI", + "display": "Observation Instance Identifier" + } ] + }, + "system": "https://mein.krankenhaus.de/fhir/NamingSystem/observationId", + "value": "1-Event.basisdaten_arm_1.1-Form.studieneinschluss_einschlusskriterien.1-studieneinschluss_einschlusskriterien.interventionelle_studienteilnahme_code.1-interventionelle_studienteilnahme", + "assigner": { + "reference": "Organization/7bf3ad593927360881a2fe7425317511" + } + } ], + "status": "final", + "category": [ { + "coding": [ { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "survey", + "display": "Survey" + } ] + } ], + "code": { + "coding": [ { + "system": "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/ecrf-parameter-codes", + "code": "03", + "display": "Participation in interventional clinical trials" + } ], + "text": "Has the patient participated in one or more interventional clinical trials?" + }, + "subject": { + "reference": "Patient/5f58baa651c0c48667912fc2b6580b4b" + }, + "_effectiveDateTime": { + "extension": [ { + "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", + "valueCode": "unknown" + } ] + }, + "valueCodeableConcept": { + "coding": [ { + "system": "http://snomed.info/sct", + "code": "373067005" + } ] + } + }, + "request": { + "method": "POST", + "url": "Observation", + "ifNoneExist": "identifier=https://mein.krankenhaus.de/fhir/NamingSystem/observationId|1d82f3cb1072e66dbc76399a72608b38" + } + } ] +} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3d73561..2f03892 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,17 +9,39 @@ on: pull_request: branches: - main + - develop jobs: - lint: runs-on: ubuntu-latest steps: - - - name: Checkout repository - uses: actions/checkout@v2 + - name: Check out Git repository + uses: actions/checkout@v3 - name: Check shell scripts uses: ludeeus/action-shellcheck@master + with: + ignore_paths: .github/scripts + + test-feasibility-triangle-fhir-server: + runs-on: ubuntu-latest + + steps: + - name: Check out Git repository + uses: actions/checkout@v3 + + - name: Install Blazectl + run: .github/scripts/install-blazectl.sh + + - name: Start Blaze FHIR Server + run: docker-compose -f feasibility-triangle/fhir-server/docker-compose.yml up -d + + - name: Wait for Blaze FHIR Server + run: .github/scripts/wait-for-url.sh http://localhost:8081/health + + - name: Load Data + run: blazectl --no-progress --server http://localhost:8081/fhir upload .github/test-data + - name: Run Test Queries + run: .github/scripts/test-consent-queries.sh diff --git a/feasibility-triangle/fhir-server/custom-search-parameters.json b/feasibility-triangle/fhir-server/custom-search-parameters.json new file mode 100644 index 0000000..e843f9a --- /dev/null +++ b/feasibility-triangle/fhir-server/custom-search-parameters.json @@ -0,0 +1,157 @@ +{ + "resourceType": "Bundle", + "type": "collection", + "entry": [ + { + "fullUrl": "http://codex.de/age", + "resource": { + "resourceType": "SearchParameter", + "id": "codex-age", + "url": "http://codex.de/age", + "version": "0.1.0", + "name": "codex-age", + "status": "active", + "description": "codex age", + "code": "codex-age", + "base": [ + "Patient" + ], + "type": "quantity", + "expression": "Patient.extension.where(url='https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/age').extension.where(url='age').value" + } + }, + { + "fullUrl": "http://codex.de/ethnicity", + "resource": { + "resourceType": "SearchParameter", + "id": "codex-ethnicity", + "url": "http://codex.de/ethnicity", + "version": "0.1.0", + "name": "codex-ethnicity", + "status": "active", + "description": "codex ethnicity", + "code": "codex-ethnicity", + "base": [ + "Patient" + ], + "type": "token", + "expression": "Patient.extension.where(url='https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/ethnic-group').value" + } + }, + { + "fullUrl": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisioncode", + "resource": { + "resourceType": "SearchParameter", + "id": "mii-provision-provision-code", + "url": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisioncode", + "version": "1.0.3", + "name": "MII_SP_Consent_ProvisionCode", + "status": "active", + "date": "2023-03-08", + "description": "Suche im Code der Provison", + "code": "mii-provision-provision-code", + "base": [ + "Consent" + ], + "type": "token", + "expression": "Consent.provision.provision.code" + } + }, + { + "fullUrl": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisiontype", + "resource": { + "resourceType": "SearchParameter", + "id": "mii-provision-provision-type", + "url": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisiontype", + "version": "1.0.3", + "name": "MII_SP_Consent_ProvisionType", + "status": "active", + "date": "2023-03-08", + "description": "Suche im Typ (type) der Provison", + "code": "mii-provision-provision-type", + "base": [ + "Consent" + ], + "type": "token", + "expression": "Consent.provision.provision.type" + } + }, + { + "fullUrl": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisionperiod", + "resource": { + "resourceType": "SearchParameter", + "id": "mii-provision-provision-period", + "url": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisionperiod", + "version": "1.0.3", + "name": "MII_SP_Consent_ProvisionPeriod", + "status": "active", + "date": "2023-03-08", + "description": "Suche im Zeitraum (period) der Provison", + "code": "mii-provision-provision-period", + "base": [ + "Consent" + ], + "type": "date", + "expression": "Consent.provision.provision.period" + } + }, + { + "fullUrl": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisioncodetype", + "resource": { + "resourceType": "SearchParameter", + "id": "mii-provision-provision-code-type", + "url": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisioncodetype", + "version": "1.0.3", + "name": "MII_SP_Consent_ProvisionCodeType", + "status": "active", + "date": "2023-03-08", + "description": "Suche nach Typ (type) einer bestimmten, durch einen Code definierten, Provision", + "code": "mii-provision-provision-code-type", + "base": [ + "Consent" + ], + "type": "composite", + "expression": "Consent.provision.provision", + "component": [ + { + "definition": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisioncode", + "expression": "code" + }, + { + "definition": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisiontype", + "expression": "type" + } + ] + } + }, + { + "fullUrl": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisioncodeperiod", + "resource": { + "resourceType": "SearchParameter", + "id": "mii-provision-provision-code-period", + "url": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisioncodeperiod", + "version": "1.0.3", + "name": "MII_SP_Consent_ProvisionCodePeriod", + "status": "active", + "date": "2023-03-08", + "description": "Suche nach Zeitraum (period) einer bestimmten, durch einen Code definierten, Provision", + "code": "mii-provision-provision-code-period", + "base": [ + "Consent" + ], + "type": "composite", + "expression": "Consent.provision.provision", + "component": [ + { + "definition": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisioncode", + "expression": "code" + }, + { + "definition": "https://www.medizininformatik-initiative.de/fhir/modul-consent/SearchParameter/mii-sp-consent-provisionperiod", + "expression": "period" + } + ] + } + } + ] +} diff --git a/feasibility-triangle/fhir-server/docker-compose.yml b/feasibility-triangle/fhir-server/docker-compose.yml index 4094fa1..107776b 100644 --- a/feasibility-triangle/fhir-server/docker-compose.yml +++ b/feasibility-triangle/fhir-server/docker-compose.yml @@ -1,18 +1,20 @@ version: '3.7' services: fhir-server: - image: ghcr.io/medizininformatik-initiative/blaze:0.20 + image: samply/blaze:0.21 environment: BASE_URL: ${FHIR_SERVER_BASE_URL:-http://fhir-server:8080} - LOG_LEVEL: ${FHIR_SERVER_LOG_LEVEL:-error} + LOG_LEVEL: ${FHIR_SERVER_LOG_LEVEL:-info} JAVA_TOOL_OPTIONS: ${BLAZE_JVM_ARGS:--Xmx4g} DB_BLOCK_CACHE_SIZE: ${BLAZE_BLOCK_CACHE_SIZE:-256} DB_RESOURCE_CACHE_SIZE: ${BLAZE_DB_RESOURCE_CACHE_SIZE:-2000000} DB_RESOURCE_HANDLE_CACHE_SIZE: ${BLAZE_DB_RESOURCE_HANDLE_CACHE_SIZE:-1000000} + DB_SEARCH_PARAM_BUNDLE: "/app/custom-search-parameters.json" ports: - ${PORT_FHIR_SERVER_LOCALHOST:-127.0.0.1:8081}:8080 restart: unless-stopped volumes: + - "./custom-search-parameters.json:/app/custom-search-parameters.json:ro" - "blaze-data:/app/data" volumes: From 53ff4cf16d03aca932f94d57841c6a8b4788b4f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 20 Jun 2023 12:54:44 +0200 Subject: [PATCH 105/118] fix nginx config bug - missing / for flare endpoint --- feasibility-triangle/rev-proxy/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-triangle/rev-proxy/nginx.conf b/feasibility-triangle/rev-proxy/nginx.conf index e1a0154..35fccd1 100644 --- a/feasibility-triangle/rev-proxy/nginx.conf +++ b/feasibility-triangle/rev-proxy/nginx.conf @@ -63,7 +63,7 @@ http { proxy_set_header X-Forwarded-Port $server_port; } - location /flare { + location /flare/ { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://flare:8080/; From c84ddd1f482f9cde965c7b96b108e6a706fbd4f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 20 Jun 2023 13:01:58 +0200 Subject: [PATCH 106/118] fix: change nginx config - change to var from ad forward header --- feasibility-triangle/rev-proxy/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-triangle/rev-proxy/nginx.conf b/feasibility-triangle/rev-proxy/nginx.conf index 35fccd1..c8e825b 100644 --- a/feasibility-triangle/rev-proxy/nginx.conf +++ b/feasibility-triangle/rev-proxy/nginx.conf @@ -59,7 +59,7 @@ http { proxy_set_header Authorization ""; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Port $server_port; } From f38426b4f1de0c036367de339c6301a3fcbdba11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 24 May 2023 12:28:48 +0200 Subject: [PATCH 107/118] Update Troubleshooting Documentation for Feasibility Triangle --- .gitignore | 2 +- feasibility-triangle/.gitignore | 3 +- .../troubleshooting/input-queries.json | 297 ++++++++++++++++++ .../troubleshooting/patient-query.json | 9 +- .../troubleshooting/test-flare.sh | 38 +++ .../troubleshooting/troubleshooting.md | 287 +++++++++++++++++ .../troubleshooting/update-test-queries.sh | 3 + troubleshooting/feasibility-test.sh | 36 --- .../test-queries/test-condition.json | 18 -- .../test-queries/test-consent.json | 17 - .../test-queries/test-observation.json | 27 -- .../test-queries/test-procedure.json | 18 -- .../test-queries/test-specimen.json | 18 -- troubleshooting/troubleshooting.md | 128 -------- 14 files changed, 635 insertions(+), 266 deletions(-) create mode 100644 feasibility-triangle/troubleshooting/input-queries.json rename troubleshooting/test-queries/test-patient.json => feasibility-triangle/troubleshooting/patient-query.json (73%) create mode 100644 feasibility-triangle/troubleshooting/test-flare.sh create mode 100644 feasibility-triangle/troubleshooting/troubleshooting.md create mode 100644 feasibility-triangle/troubleshooting/update-test-queries.sh delete mode 100644 troubleshooting/feasibility-test.sh delete mode 100644 troubleshooting/test-queries/test-condition.json delete mode 100644 troubleshooting/test-queries/test-consent.json delete mode 100644 troubleshooting/test-queries/test-observation.json delete mode 100644 troubleshooting/test-queries/test-procedure.json delete mode 100644 troubleshooting/test-queries/test-specimen.json delete mode 100644 troubleshooting/troubleshooting.md diff --git a/.gitignore b/.gitignore index 9e22373..740105a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ start-zars-and-num-node-all.sh deploy-config.json *.pem !ca.pem -.htpasswd \ No newline at end of file +.htpasswd diff --git a/feasibility-triangle/.gitignore b/feasibility-triangle/.gitignore index cd1780e..95ffcf1 100644 --- a/feasibility-triangle/.gitignore +++ b/feasibility-triangle/.gitignore @@ -1,3 +1,4 @@ /ontology/*.json /testdata/*.json -/testdata/*.zip \ No newline at end of file +/testdata/*.zip +troubleshooting/input-queries.json diff --git a/feasibility-triangle/troubleshooting/input-queries.json b/feasibility-triangle/troubleshooting/input-queries.json new file mode 100644 index 0000000..98926d8 --- /dev/null +++ b/feasibility-triangle/troubleshooting/input-queries.json @@ -0,0 +1,297 @@ +{ + "queries": [ + { + "query-name": "patient-gender", + "module": "Patient", + "sq": { + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "263495000", + "system": "http://snomed.info/sct", + "display": "Geschlecht" + } + ], + "valueFilter": { + "selectedConcepts": [ + { + "code": "female", + "display": "Female", + "system": "http://hl7.org/fhir/administrative-gender" + }, + { + "code": "male", + "display": "Male", + "system": "http://hl7.org/fhir/administrative-gender" + } + ], + "type": "concept" + } + } + ] + ] + } + }, + { + "query-name": "diabetes-any", + "module": "Condition", + "sq": { + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "E10-E14", + "system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm", + "version": "2023", + "display": "Diabetes mellitus" + } + ] + } + ] + ] + } + }, + { + "query-name": "hemoglobin-718-7", + "module": "Laboratory", + "sq": { + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "718-7", + "system": "http://loinc.org", + "display": "Hämoglobin" + } + ], + "valueFilter": { + "selectedConcepts": [], + "type": "quantity-comparator", + "unit": { + "code": "g/dL", + "display": "g/dL" + }, + "value": 0, + "comparator": "gt" + } + }, + { + "termCodes": [ + { + "code": "17856-6", + "system": "http://loinc.org", + "display": "Hämoglobin A1c" + } + ], + "valueFilter": { + "selectedConcepts": [], + "type": "quantity-comparator", + "unit": { + "code": "%", + "display": "%" + }, + "value": 0, + "comparator": "gt" + } + }, + { + "termCodes": [ + { + "code": "4548-4", + "system": "http://loinc.org", + "display": "Hämoglobin A1c" + } + ], + "valueFilter": { + "selectedConcepts": [], + "type": "quantity-comparator", + "unit": { + "code": "%", + "display": "%" + }, + "value": 0, + "comparator": "gt" + } + }, + { + "termCodes": [ + { + "code": "4549-2", + "system": "http://loinc.org", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood by Electrophoresis" + } + ], + "valueFilter": { + "selectedConcepts": [], + "type": "quantity-comparator", + "unit": { + "code": "%", + "display": "%" + }, + "value": 0, + "comparator": "gt" + } + } + ] + ] + } + }, + { + "query-name": "procedure-endocronological-function", + "module": "Procedure", + "sq": { + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "3-20", + "system": "http://fhir.de/CodeSystem/bfarm/ops", + "version": "2023", + "display": "Computertomographie [CT], nativ" + } + ] + }, + { + "termCodes": [ + { + "code": "8-19", + "system": "http://fhir.de/CodeSystem/bfarm/ops", + "version": "2023", + "display": "Verbände und Entfernung von erkranktem Gewebe an Haut und Unterhaut" + } + ] + } + ] + ] + } + }, + { + "query-name": "central-consent-eudsgvoniveau", + "module": "Consent", + "sq": { + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "central-consent", + "system": "mii.abide", + "display": "MDAT wissenschaftlich nutzen - EU DSGVO Niveau" + } + ] + } + ] + ] + } + }, + { + "query-name": "medication-administration-antidiab", + "module": "Medication", + "sq": { + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "A10", + "system": "http://fhir.de/CodeSystem/bfarm/atc", + "version": "2022", + "display": "Antidiabetika" + } + ] + } + ] + ] + } + }, + { + "query-name": "specimen-test", + "module": "Specimen", + "sq": { + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "119297000", + "system": "http://snomed.info/sct", + "version": "http://snomed.info/sct/900000000000207008/version/20220930", + "display": "Blood specimen" + } + ] + }, + { + "termCodes": [ + { + "code": "119361006", + "system": "http://snomed.info/sct", + "version": "http://snomed.info/sct/900000000000207008/version/20220930", + "display": "Plasma specimen" + } + ] + }, + { + "termCodes": [ + { + "code": "119376003", + "system": "http://snomed.info/sct", + "version": "http://snomed.info/sct/900000000000207008/version/20220930", + "display": "Tissue specimen" + } + ] + }, + { + "termCodes": [ + { + "code": "441652008", + "system": "http://snomed.info/sct", + "version": "http://snomed.info/sct/900000000000207008/version/20220930", + "display": "Formalin-fixed paraffin-embedded tissue specimen" + } + ] + }, + { + "termCodes": [ + { + "code": "441479001", + "system": "http://snomed.info/sct", + "version": "http://snomed.info/sct/900000000000207008/version/20220930", + "display": "Fresh tissue specimen" + } + ] + }, + { + "termCodes": [ + { + "code": "420135007", + "system": "http://snomed.info/sct", + "version": "http://snomed.info/sct/900000000000207008/version/20220930", + "display": "Whole blood" + } + ] + } + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/troubleshooting/test-queries/test-patient.json b/feasibility-triangle/troubleshooting/patient-query.json similarity index 73% rename from troubleshooting/test-queries/test-patient.json rename to feasibility-triangle/troubleshooting/patient-query.json index 5ba1e3a..a74b06f 100644 --- a/troubleshooting/test-queries/test-patient.json +++ b/feasibility-triangle/troubleshooting/patient-query.json @@ -15,8 +15,13 @@ "selectedConcepts": [ { "code": "female", - "system": "http://hl7.org/fhir/administrative-gender", - "display": "Female" + "display": "Female", + "system": "http://hl7.org/fhir/administrative-gender" + }, + { + "code": "male", + "display": "Male", + "system": "http://hl7.org/fhir/administrative-gender" } ], "type": "concept" diff --git a/feasibility-triangle/troubleshooting/test-flare.sh b/feasibility-triangle/troubleshooting/test-flare.sh new file mode 100644 index 0000000..ceb5681 --- /dev/null +++ b/feasibility-triangle/troubleshooting/test-flare.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +FLARE_SERVER_URL=${FEASIBILITY_TEST_FLARE_SERVER_URL:-"http://localhost:8084"} +PRINT_SQ=${FEASIBILITY_TEST_PRINT_SQ:-true} +CHECK_TRANSLATION=${FEASIBILITY_TEST_CHECK_TRANSLATION:-true} +CHECK_EXECUTION=${FEASIBILITY_TEST_CHECK_EXECUTION:-true} + +json_data=$(cat input-queries.json) +entries=$(echo "$json_data" | jq -r '.queries[] | @base64') + +for entry in $entries; do + decoded_entry=$(echo "$entry" | base64 -d) + sq=$(echo "$decoded_entry" | jq -r '.sq') + + query_name=$(echo "$decoded_entry" | jq -r '."query-name"') + + printf "\n\nTest query = #################### %s ####################\n\n" "$query_name" + + if [[ $PRINT_SQ == true ]];then + printf "\n### Query input structured query :\n" + echo "$sq" + fi + + if [[ $CHECK_TRANSLATION == true ]];then + printf "\n### FLARE FHIR Search translation for query is: \n" + curl --location "$FLARE_SERVER_URL/query/translate" \ + --header 'Content-Type: application/sq+json' \ + -d "$sq" + fi + + if [[ $CHECK_EXECUTION == true ]];then + printf "\n\n### FLARE FHIR Search execution result for query is: \n" + curl --location "$FLARE_SERVER_URL/query/execute" \ + --header 'Content-Type: application/sq+json' \ + -d "$sq" + fi + +done diff --git a/feasibility-triangle/troubleshooting/troubleshooting.md b/feasibility-triangle/troubleshooting/troubleshooting.md new file mode 100644 index 0000000..1044104 --- /dev/null +++ b/feasibility-triangle/troubleshooting/troubleshooting.md @@ -0,0 +1,287 @@ +# Troubleshooting Feasibility Triangle + +The feasibility triangle can be composed of the following components. +To debug your triangle it is important that you check each component, starting with the last component in the queue +and working your way towards the Middleware, which connects to the central portal. + +1. AKTIN - FLARE (FHIR Search) - FHIR Server (not CQL ready) +2. AKTIN - FHIR Server (CQL ready) +3. DSF - FLARE (FHIR Search) - FHIR Server (not CQL ready) +4. DSF - FHIR Server (CQL ready) + +=> Debugging Route +1. FHIR Server -> FLARE check translate -> FLARE check execute -> AKTIN +2. FHIR Server -> CQL check execution -> AKTIN +3. FHIR Server -> FLARE check translate -> FLARE check execute -> DSF +4. FHIR Server -> CQL check execution -> DSF + + +Additionally you can use the FLARE tool to check if your data is loaded into the FHIR server correctly. +See DQA below. + +For our monitoring we currently use the queries specified here +in the `input-queries.json` file. These will be updated regularly to reflect the newest tests and implemented FHIR modules. + +> **Before running any tests update the test queries by executing `bash update-test-queries.sh`** + + +## Communicating problems + +If you encounter a problem with any of the components and you have identified in which component the error occurs please create an issue for the respective component directly: +Blaze: +FLARE: +AKTIN: +DSF: + +If you cannot place the error directly use this repository to create an issue: + + +## FHIR Server + +Check if your FHIR server is running. In the default installation execute `curl http://localhost:8081/fhir/Patient?_summary=count` +This should return a result as follows: + +``` +{"id":"DCCM7GJX6LIW2SIL","type":"searchset","total":12040,"link":[{"relation":"self","url":"http://localhost:8081/fhir/Patient?_summary=count&_count=50&__t=12041"}],"resourceType":"Bundle"} +``` + +If this does not return a result check the logs of your fhir server, for default setup `docker logs -f feasibility-deploy_fhir-server_1` +and contact our team or create an issue here: https://github.com/samply/blaze + +Note: If you have a FHIR server other than Blaze please contact the appropriate vendor or support team. + + +## FLARE + +To see if FLARE is running use `docker ps` to list all your containers currently running. +There should be one container called: feasibility-deploy_flare_1 + +If it is running your can see its logs by using: `docker logs -f feasibility-deploy_flare_1` + +Before running any tests update the test queries by executing `bash update-test-queries.sh` + +If this does not work try to download the input-queries test file from github: + +To check if FLARE has the right ontology loaded and can execute the SQs from input-quries.json on your FHIR server, execute: +```bash +export FEASIBILITY_TEST_CHECK_TRANSLATION=true +export FEASIBILITY_TEST_CHECK_EXECUTION=true +bash test-flare.sh +``` + +### FLARE - Check translate Only + +To check if FLARE has the right ontology loaded and FLARE can translate the SQs from input-queries.json, execute: + +```bash +export FEASIBILITY_TEST_CHECK_TRANSLATION=true +export FEASIBILITY_TEST_CHECK_EXECUTION=false +bash test-flare.sh +``` + + +### FLARE - Check execute Only + +To check if FLARE is configured correctly, can connect to the FHIR server and execute the SQs from input-queries.json, execute: + +```bash +export FEASIBILITY_TEST_CHECK_TRANSLATION=false +export FEASIBILITY_TEST_CHECK_EXECUTION=true +bash test-flare.sh +``` + +### FLARE - Check translate (manual) + +To check if the translation is correct and you have updated to the correct ontology mapping files, +you can access the flare component directly: + +Flare has a translation endpoint /translate, which allows you to get the fhir search representation of a request: + +``` +curl --location --request POST 'http://localhost:8084/query/translate' \ +--header 'Content-Type: application/sq+json' \ +--data-raw '' +``` + +> **Note**: You can extract a structured query from the aktin logs once a request has been recieved by your system and send it to your local FLARE. +> Additionally you can also create a feasibility query in the UI and use the Download function under "save > > query" to download a current SQ to test. + +This will give you an output, which contains the fhir search translation for each criterion in our Structured-Query, for example: + +The Structured-Query: +``` +curl --location --request POST 'http://localhost:8084/query/tranlsate' \ +--header 'Content-Type: application/sq+json' \ +--data-raw '{ + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "263495000", + "system": "http://snomed.info/sct", + "display": "Geschlecht" + } + ], + "valueFilter": { + "selectedConcepts": [ + { + "code": "female", + "display": "Female", + "system": "http://hl7.org/fhir/administrative-gender" + }, + { + "code": "male", + "display": "Male", + "system": "http://hl7.org/fhir/administrative-gender" + } + ], + "type": "concept" + } + } + ] + ] + }' +``` + +### FLARE - Check execute (manual) + +To check if the execution is correct you can use the Flare execution endpoint /execute, which will execute the feasibility query on your FHIR server: + +``` +curl --location --request POST 'http://localhost:8084/query/execute' \ +--header 'Content-Type: application/sq+json' \ +--data-raw '' +``` + +Input for your structured query is identical to the input for the translation endpoint above. + +> **Note**: You can extract a structured query from the aktin logs once a request has been recieved by your system and send it to your local FLARE. +> Additionally you can also create a feasibility query in the UI and use the Download function under "save > > query" to download a current SQ to test. + + +The return value should be a number >= 0 + +## AKTIN + +To check if the aktin client is running use the command `docker logs -f feasibility-deploy_aktin-client_1` + +If it is running correctly it will display: +``` +INFO: websocket connection established +Mar 21, 2022 1:30:44 PM org.aktin.broker.client.live.sysproc.ProcessExecutionService run +INFO: websocket ping-pong delay set to 60s +``` + +If the container is not running follow these steps: + +Check if the aktin broker is currently available from your host: `curl https://aktin.forschen-fuer-gesundheit.de/broker/status` + +If the aktin client does not start up, add the following to the docker-compose.yml of the atkin client: +`entrypoint: sh -c "tail -f /dev/null"` and restart the container using `bash stop-node.sh`and `bash start-node.sh` + +Check if you can connect to the broker from within your docker container: + +`docker exec abide-deploy_aktin-client_1 sh -c "curl https://aktin.forschen-fuer-gesundheit.de/broker/status"` + +If you cannot connect to this endpoint, please check your proxy configurations. + +Other common errors invole the environment variables set. To check if they are correct: + +log in to the aktin container `docker exec -it feasibility-deploy_aktin-client_1 sh` and then execute `echo $`. +Note that you can find the name of your variable in the docker-compose.yml under environment. +If your variable is not set double check your .env file and if the env var is set and still not correct in the container directly +replace it in the docker-compose file, for example change, +from: +`BROKER_ENDPOINT_URI: ${FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI:-http://aktin-broker:8080/broker/}` +to: +`BROKER_ENDPOINT_URI: ` + +Remove or Comment-Out the `entrypoint: sh -c "tail -f /dev/null"` from your docker-compose.yml and restart the containers, using `bash stop-triangle.sh`and `bash start-triangle.sh`. + + +## DSF + +The DSF installation is described elsewhere. This troubleshooting focusses on troubleshooting the DSF Feasibility plugin. + + + +## Manual Connection test + +To test whether your site returns answers to a feasibility query you can log into the central UI +and upload your own test SQ under "My queries" (Meine Abfragen). To test whether you are generally connected you can use the `patient-query.json` in this folder. Should you not have an account please contact info@forschen-fuer-gesundheit.de. + +Once you have loaded and sent the query you should check the logs of your Middleware to see if the query is shown in the respective logs. + +### Manual Connection test - AKTIN + +For AKTIN in the logs you should see the query arriving and beeing completed as follows (example = AKTIN - FLARE - FHIR server): + +``` +May 24, 2023 11:58:49 AM org.aktin.broker.client.live.CLIExecutionService onStatusUpdate +INFO: status 1858 -> queued +May 24, 2023 11:58:49 AM org.aktin.broker.client.live.CLIExecutionService onStatusUpdate +INFO: status 1858 -> processing +May 24, 2023 11:58:50 AM feasibility.FeasibilityExecution doExecution +FINE: Evaluating SQ against FLARE, SQ evaluated is: +May 24, 2023 11:58:50 AM feasibility.FeasibilityExecution doExecution +FINE: {"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"263495000","system":"http://snomed.info/sct","display":"Geschlecht"}],"valueFilter":{"type":"concept","selectedConcepts":[{"code":"female","system":"http://hl7.org/fhir/administrative-gender","display":"Female"},{"code":"male","system":"http://hl7.org/fhir/administrative-gender","display":"Male"}]}}]]} +May 24, 2023 11:58:51 AM org.aktin.broker.client.live.CLIExecutionService onStatusUpdate +INFO: status 1858 -> completed +``` + +If your log contains an error first check if your FHIR Server and if applicable your FLARE are working correctly - see the respective parts of this readme. +Then collect the error messages and send them to our team or create an issue for the respective component. + +## DQA + +It is recommended for every DIC to use the DQA tool provided here to analyse the FHIR resources loaded in the FHIR server. + +Additionally the DIC can use the FLARE tool provided to see if the resources are found correctly: + +### FLARE - DQA + +FLARE can also be used to check if you have correctly implemented the FHIR resources so that they can be queried using our tools. +To check this, execute the following: + +```bash +export FEASIBILITY_TEST_PRINT_SQ=false +export FEASIBILITY_TEST_CHECK_TRANSLATION=true +export FEASIBILITY_TEST_CHECK_EXECUTION=false +bash test-flare.sh +``` + +This will print the FHIR Search translation for our standard test scripts, which you can use to debug the FHIR resources on your server. +For example, the Observation query for hemoglobin would return: +`[base]/Observation?code=http://loinc.org|718-7&value-quantity=gt0|http://unitsofmeasure.org|g/dL` + +which you can then execute against your FHIR server to see what it returns. If you cannot find any of the values try removing parts of the query, so that you can see +if you have any resources for the code, here: +`[base]/Observation?code=718-7` +Open the resource and then queck if your units are correct and you are using the right system. +If you cannot find any resources even with the code check whether this is correct and investigate further. + + +## Common problems and how to solve them + +PROBLEM: AKTIN Websocket connection fails + +DESCRIPTION: There are cases where the AKTIN websocket connection fails and cannot be re-established. +This error seems to be site specific and cannot be easily replicated. + + +SOLUTION: Restart the AKTIN client and send the AKTIN logs to + +--- + +PROBLEM: Requests time out + +DESCRIPTION: Some requests can time out depending on the used components and the hardware the site supplies. + +SOLUTION: If this problem persists contact to setup an appointment with one of our developers. +Please also see the tuning guide for the blaze server. +We do currently not recommend the HAPI FHIR server as it is not fast enough for larger datasets. + +--- diff --git a/feasibility-triangle/troubleshooting/update-test-queries.sh b/feasibility-triangle/troubleshooting/update-test-queries.sh new file mode 100644 index 0000000..ab9123d --- /dev/null +++ b/feasibility-triangle/troubleshooting/update-test-queries.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +curl -o input-queries.json https://raw.githubusercontent.com/medizininformatik-initiative/feasibility-monitoring/main/input-queries.json \ No newline at end of file diff --git a/troubleshooting/feasibility-test.sh b/troubleshooting/feasibility-test.sh deleted file mode 100644 index a73bdcf..0000000 --- a/troubleshooting/feasibility-test.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash - -BASE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P )" -# FHIR_SERVER_URL=${FEASIBILITY_TEST_FHIR_SERVER_URL:-"http://localhost:8081/fhir"} -FLARE_SERVER_URL=${FEASIBILITY_TEST_FLARE_SERVER_URL:-"http://localhost:8084"} -TEST_FILES=("$BASE_DIR"/test-queries/*) -PRINT_SQ=${FEASIBILITY_TEST_PRINT_SQ:-true} - -for testQuery in "${TEST_FILES[@]}"; do - queryName=$(basename "$testQuery") - printf "\n\nTest query = #################### %s ####################\n\n" "$queryName" - - printf "### Structured-Query file is:\n%s\n" "$testQuery" - - if [[ $PRINT_SQ == true ]];then - printf "\n### Query input structured query :\n" - cat "$testQuery" - fi - - printf "\n### FLARE FHIR Search translation for query is: \n" - curl --location --request POST "$FLARE_SERVER_URL/query/translate" \ - --header 'Content-Type: application/sq+json' \ - -d @"$testQuery" - - printf "\n\n### FLARE result (number of patients) for query is: \n" - - patientsFound=$(curl -s --location --request POST "$FLARE_SERVER_URL/query/execute" \ - --header 'Content-Type: application/sq+json' \ - -d @"$testQuery") - - if [[ "$patientsFound" == 0 ]];then - printf "Found 0 patients, please check if this is correct for your server\n" - else - printf "Number of patients found for the query %s is: %s" "$queryName" "$patientsFound" - fi -done diff --git a/troubleshooting/test-queries/test-condition.json b/troubleshooting/test-queries/test-condition.json deleted file mode 100644 index 2438efe..0000000 --- a/troubleshooting/test-queries/test-condition.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "http://to_be_decided.com/draft-1/schema#", - "display": "", - "inclusionCriteria": [ - [ - { - "termCodes": [ - { - "code": "I10.0", - "system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm", - "version": "2021", - "display": "Benigne essentielle Hypertonie" - } - ] - } - ] - ] -} \ No newline at end of file diff --git a/troubleshooting/test-queries/test-consent.json b/troubleshooting/test-queries/test-consent.json deleted file mode 100644 index 45e95d3..0000000 --- a/troubleshooting/test-queries/test-consent.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "http://to_be_decided.com/draft-1/schema#", - "display": "", - "inclusionCriteria": [ - [ - { - "termCodes": [ - { - "code": "central-consent", - "system": "mii.abide", - "display": "MDAT wissenschaftlich nutzen - EU DSGVO Niveau" - } - ] - } - ] - ] -} \ No newline at end of file diff --git a/troubleshooting/test-queries/test-observation.json b/troubleshooting/test-queries/test-observation.json deleted file mode 100644 index a449a53..0000000 --- a/troubleshooting/test-queries/test-observation.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "version": "http://to_be_decided.com/draft-1/schema#", - "display": "", - "inclusionCriteria": [ - [ - { - "termCodes": [ - { - "code": "718-7", - "system": "http://loinc.org", - "display": "Hämoglobin" - } - ], - "valueFilter": { - "selectedConcepts": [], - "type": "quantity-range", - "unit": { - "code": "g/dL", - "display": "g/dL" - }, - "minValue": 0, - "maxValue": 20 - } - } - ] - ] -} diff --git a/troubleshooting/test-queries/test-procedure.json b/troubleshooting/test-queries/test-procedure.json deleted file mode 100644 index d18fc6c..0000000 --- a/troubleshooting/test-queries/test-procedure.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "http://to_be_decided.com/draft-1/schema#", - "display": "", - "inclusionCriteria": [ - [ - { - "termCodes": [ - { - "code": "3-990", - "system": "http://fhir.de/CodeSystem/bfarm/ops", - "version": "2021", - "display": "Computergestützte Bilddatenanalyse mit 3D-Auswertung" - } - ] - } - ] - ] -} \ No newline at end of file diff --git a/troubleshooting/test-queries/test-specimen.json b/troubleshooting/test-queries/test-specimen.json deleted file mode 100644 index 25a0173..0000000 --- a/troubleshooting/test-queries/test-specimen.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "http://to_be_decided.com/draft-1/schema#", - "display": "", - "inclusionCriteria": [ - [ - { - "termCodes": [ - { - "code": "119364003", - "system": "http://snomed.info/sct", - "version": "http://snomed.info/sct/900000000000207008/version/20220930", - "display": "Serum specimen" - } - ] - } - ] - ] -} \ No newline at end of file diff --git a/troubleshooting/troubleshooting.md b/troubleshooting/troubleshooting.md deleted file mode 100644 index 67165e0..0000000 --- a/troubleshooting/troubleshooting.md +++ /dev/null @@ -1,128 +0,0 @@ -# - -## Troubleshooting AKTIN Connection - -To check if the aktin client is running use the command `docker logs -f abide-deploy_aktin-client_1` - -If it is running correctly it will display: -``` -INFO: websocket connection established -Mar 21, 2022 1:30:44 PM org.aktin.broker.client.live.sysproc.ProcessExecutionService run -INFO: websocket ping-pong delay set to 60s -``` - -If the container is not running follow these steps: - -Check if the aktin broker is currently available from your host: `curl https://aktin.forschen-fuer-gesundheit.de/broker/status` - -If the aktin client does not start up, add the following to the docker-compose.yml of the atkin client: -`entrypoint: sh -c "tail -f /dev/null"` and restart the container using `bash stop-node.sh`and `bash start-node.sh` - -Check if you can connect to the broker from within your docker container: - -`docker exec abide-deploy_aktin-client_1 sh -c "curl https://aktin.forschen-fuer-gesundheit.de/broker/status"` - -If you cannot connect to this endpoint, please check your proxy configurations. - -Other common errors invole the environment variables set. To check if they are correct: - -log in to the aktin container `docker exec -it abide-deploy_aktin-client_1 sh` and then execute `echo $`. -Note that you can find the name of your variable in the docker-compose.yml under environment. -If your variable is not set double check your .env file and if the env var is set and still not correct in the container directly -replace it in the docker-compose file, for example change, -from: -`BROKER_ENDPOINT_URI: ${CODEX_FEASIBILITY_AKTIN_CLIENT_BROKER_ENDPOINT_URI:-http://aktin-broker:8080/broker/}` -to: -`BROKER_ENDPOINT_URI: ' -``` - -You can extract a structured query from the `aktin-requests.log` once a request has been recieved by your system and send it to your local flare. - -this will give you an output, which contains the fhir search translation for each criterion in our Structured-Query, for example: - -The Structured-Query: -``` -curl --location --request POST 'http://localhost:8084/query/execute' \ ---header 'Content-Type: application/sq+json' \ ---data-raw '{ - "version": "http://to_be_decided.com/draft-1/schema#", - "display": "", - "inclusionCriteria": [ - [ - { - "termCodes": [ - { - "code": "263495000", - "system": "http://snomed.info/sct", - "display": "Geschlecht" - } - ], - "valueFilter": { - "selectedConcepts": [ - { - "code": "female", - "system": "http://hl7.org/fhir/administrative-gender", - "display": "Female" - } - ], - "type": "concept" - } - } - ] - ] -}' -``` - -should give you an output similar to: - -``` -{"name":"intersection","operands":[{"name":"union","operands":["[base]/Patient?gender=female"]}]} -``` - -The FHIR search string can then be used with your FHIR Server directly, to recieve the response from the server. -To use it the base url of the fhir server has to be replaced according to how you call the server from your system. -In our example: -Change `http://fhir-server:8080/fhir/Patient?gender=female` to `/Patient?gender=female` - -## Check if execution is correct and returns the expected results (manual) - - -To check if the execution is correct you can use the Flare execution endpoint /execute, which will execute the feasibility query on your FHIR server: - -``` -curl --location --request POST 'http://localhost:8084/query/execute' \ ---header 'Content-Type: application/sq+json' \ ---data-raw '' -``` - -Input for your structured query is identical to the input for the translation endpoint above. - -The return value should be a number >= 0 - From f892375762acb76d76327ba5ef5a673f1528cef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Tue, 25 Jul 2023 10:28:42 +0200 Subject: [PATCH 108/118] Update AKTIN, FLARE and Blaze --- changelog.md => CHANGELOG.md | 11 +++++++++++ feasibility-portal/aktin-broker/docker-compose.yml | 2 +- feasibility-triangle/aktin-client/docker-compose.yml | 2 +- feasibility-triangle/fhir-server/docker-compose.yml | 2 +- feasibility-triangle/flare/docker-compose.yml | 2 +- 5 files changed, 15 insertions(+), 4 deletions(-) rename changelog.md => CHANGELOG.md (80%) diff --git a/changelog.md b/CHANGELOG.md similarity index 80% rename from changelog.md rename to CHANGELOG.md index c365b8c..7ac8f26 100644 --- a/changelog.md +++ b/CHANGELOG.md @@ -16,6 +16,17 @@ Please refer to the respective repositories for a more in depth changelog of sin |FLARE|| |Blaze FHIR server|| +## [2.1.0] - 2023-07-25 + +### Overall + +- Updated AKTIN Client to 1.6.0: Fix websocket timeout and improve error handling - +- Updated FLARE to 1.0: Fix Execution Operation - +- Updated Blaze to 0.22: implements $everything, adds basic frontend, Support for Custom Search Parameters +- Added Troubleshooting specific for triangle +- Update testdata repo from MII + + ## [2.0.0] - 2023-03-29 ### Overall diff --git a/feasibility-portal/aktin-broker/docker-compose.yml b/feasibility-portal/aktin-broker/docker-compose.yml index d80b556..6c1430a 100644 --- a/feasibility-portal/aktin-broker/docker-compose.yml +++ b/feasibility-portal/aktin-broker/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-broker: - image: ghcr.io/aktin/aktin-broker:1.5.0 + image: ghcr.io/aktin/aktin-broker:1.5.1 environment: LOG_LEVEL: ${AKTIN_BROKER_LOG_LEVEL:-INFO} PASSWORD: ${AKTIN_ADMIN_PW:-changeme} diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 720dd95..abdcec1 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.5.0 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.6.0 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} diff --git a/feasibility-triangle/fhir-server/docker-compose.yml b/feasibility-triangle/fhir-server/docker-compose.yml index 107776b..4a1a459 100644 --- a/feasibility-triangle/fhir-server/docker-compose.yml +++ b/feasibility-triangle/fhir-server/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: fhir-server: - image: samply/blaze:0.21 + image: samply/blaze:0.22 environment: BASE_URL: ${FHIR_SERVER_BASE_URL:-http://fhir-server:8080} LOG_LEVEL: ${FHIR_SERVER_LOG_LEVEL:-info} diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index de67a13..de933ad 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: flare: - image: ghcr.io/medizininformatik-initiative/flare:0.2 + image: ghcr.io/medizininformatik-initiative/flare:1.0 ports: - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: From 1e4e0898c567580f6ee64d5bbd9c0f76ea1e1696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 29 Sep 2023 12:56:55 +0200 Subject: [PATCH 109/118] remove unnecessary ontology files and folders --- feasibility-portal/backend/docker-compose.yml | 6 +----- feasibility-portal/ontology/migration/.gitkeep | 0 feasibility-portal/ontology/ui_profiles/.gitkeep | 0 feasibility-triangle/down-triangle.sh | 1 - feasibility-triangle/flare/docker-compose.yml | 7 ++----- feasibility-triangle/ontology/.gitkeep | 0 6 files changed, 3 insertions(+), 11 deletions(-) delete mode 100644 feasibility-portal/ontology/migration/.gitkeep delete mode 100644 feasibility-portal/ontology/ui_profiles/.gitkeep delete mode 100644 feasibility-triangle/ontology/.gitkeep diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 08d36dd..96bf7a6 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:3.0.0 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:4.0.0-alpha1 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -64,10 +64,6 @@ services: LOG_LEVEL: ${FEASIBILITY_BACKEND_LOG_LEVEL:-warn} restart: unless-stopped volumes: - - ${FEASIBILITY_BACKEND_UI_PROFILES_PATH:-../ontology/ui_profiles}:/opt/codex-feasibility-backend/ontology/ui_profiles - - ${FEASIBILITY_BACKEND_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:/opt/codex-feasibility-backend/ontology/codex-code-tree.json - - ${FEASIBILITY_BACKEND_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:/opt/codex-feasibility-backend/ontology/codex-term-code-mapping.json - - ${FEASIBILITY_BACKEND_MIGRATION_PATH:-../ontology/migration/R__Load_latest_ui_profile.sql}:/opt/codex-feasibility-backend/ontology/migration/R__Load_latest_ui_profile.sql - ${FEASIBILITY_BACKEND_CERTS_PATH:-../secrets}:/opt/codex-feasibility-security feasibility-gui-backend-db: diff --git a/feasibility-portal/ontology/migration/.gitkeep b/feasibility-portal/ontology/migration/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/feasibility-portal/ontology/ui_profiles/.gitkeep b/feasibility-portal/ontology/ui_profiles/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/feasibility-triangle/down-triangle.sh b/feasibility-triangle/down-triangle.sh index 5e14964..0f45195 100755 --- a/feasibility-triangle/down-triangle.sh +++ b/feasibility-triangle/down-triangle.sh @@ -7,4 +7,3 @@ docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/aktin-client/docker-compose. docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/flare/docker-compose.yml down docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/fhir-server/docker-compose.yml down -v docker-compose -p "$COMPOSE_PROJECT" -f "$BASE_DIR"/rev-proxy/docker-compose.yml down -sh "$BASE_DIR"/dsf-client/down.sh "$COMPOSE_PROJECT" diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index de933ad..3d1a2ee 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: flare: - image: ghcr.io/medizininformatik-initiative/flare:1.0 + image: ghcr.io/medizininformatik-initiative/flare:2.0.0-rc2 ports: - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: @@ -11,8 +11,6 @@ services: FLARE_FHIR_PASSWORD: ${FLARE_FHIR_PW:-} FLARE_FHIR_MAX_CONNECTIONS: ${FLARE_FHIR_MAX_CONNECTIONS:-32} FLARE_FHIR_PAGE_COUNT: ${FLARE_FHIR_PAGE_COUNT:-500} - FLARE_MAPPING_MAPPING_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json - FLARE_MAPPING_CONCEPT_TREE_FILE: ${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json FLARE_CACHE_MEM_SIZE_MB: ${FLARE_CACHE_MEM_SIZE_MB:-1024} FLARE_CACHE_MEM_EXPIRE: ${FLARE_CACHE_MEM_EXPIRE:-PT48H} FLARE_CACHE_MEM_REFRESH: ${FLARE_CACHE_MEM_REFRESH:-PT24H} @@ -23,5 +21,4 @@ services: LOG_LEVEL: ${FLARE_LOG_LEVEL:-info} restart: unless-stopped volumes: - - ${FLARE_LOCAL_CONCEPT_TREE_PATH:-../ontology/codex-code-tree.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-code-tree.json - - ${FLARE_LOCAL_TERM_CODE_MAPPING_PATH:-../ontology/codex-term-code-mapping.json}:${FLARE_ONTOLOGY_FILES_FOLDER:-/opt/flare/ontology}/codex-term-code-mapping.json + - ${FLARE_SELF_SIGNED_CA_CERT_PATH:-./certs}:/app/certs diff --git a/feasibility-triangle/ontology/.gitkeep b/feasibility-triangle/ontology/.gitkeep deleted file mode 100644 index e69de29..0000000 From efce947403bd3818c1d6f5079c930b2a24d44f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 29 Sep 2023 15:10:44 +0200 Subject: [PATCH 110/118] Add volume to backend db, update ui and associated language files --- feasibility-portal/backend/docker-compose.yml | 9 +++ .../gui/deploy-config.json.default | 3 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-portal/gui/language/de.json | 57 ++++++++++++------- feasibility-portal/gui/language/en.json | 43 +++++++++----- feasibility-triangle/flare/docker-compose.yml | 2 +- 6 files changed, 76 insertions(+), 40 deletions(-) diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 96bf7a6..43072c3 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -59,6 +59,7 @@ services: PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_INTERVALSECONDS: ${FEASIBILITY_BACKEND_PRIVACY_QUOTA_READ_DETAILED_OBFUSCATED_INTERVALSECONDS:-7200} PRIVACY_THRESHOLD_RESULTS: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_RESULTS:-20} PRIVACY_THRESHOLD_SITES: ${FEASIBILITY_BACKEND_PRIVACY_THRESHOLD_SITES:-3} + QUERYRESULT_DISABLE_LOG_FILE_ENCRYPTION: "true" # ---- logging LOG_LEVEL_SQL: ${FEASIBILITY_BACKEND_LOG_LEVEL_SQL:-warn} LOG_LEVEL: ${FEASIBILITY_BACKEND_LOG_LEVEL:-warn} @@ -75,3 +76,11 @@ services: POSTGRES_PASSWORD: ${FEASIBILITY_BACKEND_DATASOURCE_PASSWORD:-guidbpw} POSTGRES_DB: codex_ui restart: unless-stopped + volumes: + - type: volume + source: feas-backend-db-data + target: /var/lib/postgresql/data + +volumes: + feas-backend-db-data: + name: "feas-backend-db-data" diff --git a/feasibility-portal/gui/deploy-config.json.default b/feasibility-portal/gui/deploy-config.json.default index 9a1379f..db928a8 100644 --- a/feasibility-portal/gui/deploy-config.json.default +++ b/feasibility-portal/gui/deploy-config.json.default @@ -6,7 +6,7 @@ "baseUrl": "/api" }, "uiBackendApi": { - "baseUrl": "https://localhost/api/v2" + "baseUrl": "https://localhost/api/v3" }, "auth": { "baseUrl": "https://localhost/auth", @@ -32,6 +32,7 @@ } }, "options": { + "sendsqcontexttobackend": true, "pollingtimeinseconds": 30, "pollingintervallinseconds": 10, "lowerboundarypatientresult": 0, diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 1188634..20f0678 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:1.0.0 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:1.2.0_RC1 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-portal/gui/language/de.json b/feasibility-portal/gui/language/de.json index cfc9273..c9cec34 100644 --- a/feasibility-portal/gui/language/de.json +++ b/feasibility-portal/gui/language/de.json @@ -5,32 +5,32 @@ "PARAGRAPH1": "Die CODEX Feasibility Plattform ist ein Angebot für Wissenschaftler:innen, die für ihre Forschung nach COVID-19 spezifischen Daten suchen.", "PARAGRAPH2": "Auf dieser Plattform steht hierfür ein frei zugängliches Suchtool zur Verfügung, das eine erste, unverbindliche Machbarkeitsabfrage ermöglicht. Auf diesem Weg kann festgestellt werden, wie viele Daten an den angeschlossenen CODEX-Standorten zur Verfügung stehen.", "PARAGRAPH3_1": "Anhand dieser Information können dann in einem nächsten Schritt konkrete Anfragen an die entsprechenden Standorte gestellt werden.", - "PARAGRAPH3_2":"", - "PARAGRAPH3_3":"", - "PARAGRAPH3_4":"", - "PARAGRAPH3_LINK":"", - "PARAGRAPH4_1":"", - "PARAGRAPH4_2":"", - "PARAGRAPH4_3":"", + "PARAGRAPH3_2": "", + "PARAGRAPH3_3": "", + "PARAGRAPH3_4": "", + "PARAGRAPH3_LINK": "", + "PARAGRAPH4_1": "", + "PARAGRAPH4_2": "", + "PARAGRAPH4_3": "", "PARAGRAPH5_1": "", "PARAGRAPH5_2": "", - "PARAGRAPH5_3":"" + "PARAGRAPH5_3": "" }, "ABIDETHEME": { "HEADLINE": "Willkommen auf der ABIDE Feasibility Plattform!", "PARAGRAPH1": "Die ABIDE Feasibility Plattform ist ein Unterstützungsangebot für Wissenschaftler und Wissenschaftlerinnen bei der Umsetzung ihrer Forschungsvorhaben.", "PARAGRAPH2": "Mit einer Machbarkeitsanfrage (Feasibility) erfahren Forschende, wie viele Fälle für ihre Suchkriterien (Ein- und Ausschlusskriterien) in den Datenintegrationszentren der universitätsmedizinischen Standorte bundesweit vorhanden sind und für medizinische Forschungszwecke beantragt werden können.", "PARAGRAPH3_1": "Zur Formulierung der Abfrage stehen aktuell der Kerndatensatz der Medizininformatikinitiative und der COVID-19 spezifische Datensatz GECCO zur Verfügung.", - "PARAGRAPH3_2":"", - "PARAGRAPH3_3":"", - "PARAGRAPH3_4":"", - "PARAGRAPH3_LINK":"", - "PARAGRAPH4_1":"", - "PARAGRAPH4_2":"", - "PARAGRAPH4_3":"", + "PARAGRAPH3_2": "", + "PARAGRAPH3_3": "", + "PARAGRAPH3_4": "", + "PARAGRAPH3_LINK": "", + "PARAGRAPH4_1": "", + "PARAGRAPH4_2": "", + "PARAGRAPH4_3": "", "PARAGRAPH5_1": "", "PARAGRAPH5_2": "", - "PARAGRAPH5_3":"" + "PARAGRAPH5_3": "" }, "FDPGTHEME": { "HEADLINE": "Willkommen im Bereich „Daten und Bioproben finden“ des Forschungsdatenportals für Gesundheit", @@ -41,8 +41,8 @@ "PARAGRAPH3_3": " haben Sie die Möglichkeit, eine neue Suchanfrage auf Basis des ", "PARAGRAPH3_4": " zu formulieren und abzuschicken, um einen Überblick über die verfügbaren Datensätze zu erhalten.", "PARAGRAPH3_LINK": "Kerndatensatzes der MII", - "PARAGRAPH4_1":"Gespeicherte Abfragen oder gespeicherte Entwürfe können Sie über ", - "PARAGRAPH4_2":"Meine Abfragen", + "PARAGRAPH4_1": "Gespeicherte Abfragen oder gespeicherte Entwürfe können Sie über ", + "PARAGRAPH4_2": "Meine Abfragen", "PARAGRAPH4_3": " einsehen und weiter bearbeiten.", "PARAGRAPH5_1": "Sobald Ihnen alle relevanten Informationen für Ihr Forschungsvorhaben zur Verfügung stehen, können Sie über ", "PARAGRAPH5_2": "Antrag stellen", @@ -61,6 +61,16 @@ "TEXT": "Stellen Sie einen Antrag zur Datennutzung im Antragsportal" } }, + "DATASELECTION": { + "DATASELECTION": "Datenselektion", + "SEARCH": { + "LABEL": "Code oder Suchbegriff eingeben", + "CRITERIA": "Suchkriterien" + }, + "DISPLAY": { + "LABEL": "Ausgewählte Merkmale" + } + }, "LANGUAGE": { "GERMAN": "Deutsch", "ENGLISH": "Englisch", @@ -76,8 +86,9 @@ }, "NAVIGATION": { "DASHBOARD": "Startseite", - "QUERYBUILDER_EDITOR": "Neue Abfrage", + "QUERYBUILDER_EDITOR": "Machbarkeitsabfrage", "QUERYBUILDER_OVERVIEW": "Meine Abfragen", + "DATASELECTION_EDITOR": "Datenselektion", "OPTIONS": "Einstellungen", "SIGNOUT": "Abmelden" }, @@ -150,7 +161,7 @@ "HEADER_FILTER_CONCEPT_OPTIONAL": "Wählen Sie einen oder mehrere zulässige Werte:", "HEADER_FILTER_CONCEPT_MANDATORY": "Geben Sie einen oder mehrere zulässige Werte an:", "HEADER_FILTER_CONCEPT_FOR_DISPLAY": "Geben Sie einen oder mehrere zulässige Werte an ({{ label }}):", - "CHOOSE_GROUP":"Gruppe auswählen", + "CHOOSE_GROUP": "Gruppe auswählen", "MANDATORY_HINT": "Pflichtfeld", "UNIT": "Einheit", "MIN": "Min", @@ -226,6 +237,7 @@ "SAVE": "Speichern", "CANCEL": "Abbrechen", "CLOSE": "Schließen", + "DOWNLOAD": "Herunterladen", "ADD": "Auswählen", "ADD_TOOLTIP": "Merkmal einschränken", "ADDALL": "Alle hinzufügen", @@ -235,6 +247,7 @@ "SAVEQUERY": "Abfrage speichern", "VALIDATE": "Validieren", "IMPORT": "Query laden", - "IMPORT_FROM_FILE": "Datei auswählen" + "IMPORT_FROM_FILE": "Datei auswählen", + "IMPORT_DATASELECTION": "Datenselektion laden" } -} +} \ No newline at end of file diff --git a/feasibility-portal/gui/language/en.json b/feasibility-portal/gui/language/en.json index 73fa2a6..487c14a 100644 --- a/feasibility-portal/gui/language/en.json +++ b/feasibility-portal/gui/language/en.json @@ -5,12 +5,12 @@ "PARAGRAPH1": "Die CODEX Feasibility Plattform ist ein Angebot für Wissenschaftler:innen, die für ihre Forschung nach COVID-19 spezifischen Daten suchen.", "PARAGRAPH2": "Auf dieser Plattform steht hierfür ein frei zugängliches Suchtool zur Verfügung, das eine erste, unverbindliche Machbarkeitsabfrage ermöglicht. Auf diesem Weg kann festgestellt werden, wie viele Daten an den angeschlossenen CODEX-Standorten zur Verfügung stehen.", "PARAGRAPH3_1": "Anhand dieser Information können dann in einem nächsten Schritt konkrete Anfragen an die entsprechenden Standorte gestellt werden.", - "PARAGRAPH3_2":"", + "PARAGRAPH3_2": "", "PARAGRAPH3_3": "", "PARAGRAPH3_4": "", - "PARAGRAPH3_LINK":"", - "PARAGRAPH4_1":"", - "PARAGRAPH4_2":"", + "PARAGRAPH3_LINK": "", + "PARAGRAPH4_1": "", + "PARAGRAPH4_2": "", "PARAGRAPH4_3": "", "PARAGRAPH5_1": "", "PARAGRAPH5_2": "", @@ -21,12 +21,12 @@ "PARAGRAPH1": "Die ABIDE Feasibility Plattform ist ein Unterstützungsangebot für Wissenschaftler und Wissenschaftlerinnen bei der Umsetzung ihrer Forschungsvorhaben.", "PARAGRAPH2": "Mit einer Machbarkeitsanfrage (Feasibility) erfahren Forschende, wie viele Fälle für ihre Suchkriterien (Ein- und Ausschlusskriterien) in den Datenintegrationszentren der universitätsmedizinischen Standorte bundesweit vorhanden sind und für medizinische Forschungszwecke beantragt werden können.", "PARAGRAPH3_1": "Zur Formulierung der Abfrage stehen aktuell der Kerndatensatz der Medizininformatikinitiative und der COVID-19 spezifische Datensatz GECCO zur Verfügung.", - "PARAGRAPH3_2":"", + "PARAGRAPH3_2": "", "PARAGRAPH3_3": "", "PARAGRAPH3_4": "", - "PARAGRAPH3_LINK":"", - "PARAGRAPH4_1":"", - "PARAGRAPH4_2":"", + "PARAGRAPH3_LINK": "", + "PARAGRAPH4_1": "", + "PARAGRAPH4_2": "", "PARAGRAPH4_3": "", "PARAGRAPH5_1": "", "PARAGRAPH5_2": "", @@ -41,8 +41,8 @@ "PARAGRAPH3_3": " you have the possibility to formulate and send a new query based on the ", "PARAGRAPH3_4": " to get an overview of the available patient data records.", "PARAGRAPH3_LINK": "core data set of the MII", - "PARAGRAPH4_1":"You can view and further edit saved queries or saved drafts via ", - "PARAGRAPH4_2":"My Queries", + "PARAGRAPH4_1": "You can view and further edit saved queries or saved drafts via ", + "PARAGRAPH4_2": "My Queries", "PARAGRAPH4_3": ".", "PARAGRAPH5_1": "Once you have all the relevant information for your research project, you can submit an application for data use in the proposal portal of the German Research Data Portal for Health via", "PARAGRAPH5_2": "Submit Application", @@ -61,6 +61,16 @@ "TEXT": "Make a request for data use in the proposal portal" } }, + "DATASELECTION": { + "DATASELECTION": "Dataselection", + "SEARCH": { + "LABEL": "Insert code or serach text", + "CRITERIA": "Search Criteria" + }, + "DISPLAY": { + "LABEL": "Selected Criteria" + } + }, "LANGUAGE": { "GERMAN": "German", "ENGLISH": "English", @@ -76,8 +86,9 @@ }, "NAVIGATION": { "DASHBOARD": "Home", - "QUERYBUILDER_EDITOR": "New query", - "QUERYBUILDER_OVERVIEW": "My queries", + "QUERYBUILDER_EDITOR": "Feasibility Query", + "QUERYBUILDER_OVERVIEW": "My Queries", + "DATASELECTION_EDITOR": "Dataselection", "OPTIONS": "Options", "SIGNOUT": "Sign out" }, @@ -150,7 +161,7 @@ "HEADER_FILTER_CONCEPT_OPTIONAL": "Choose one or more valid values:", "HEADER_FILTER_CONCEPT_MANDATORY": "Choose one or more valid values:", "HEADER_FILTER_CONCEPT_FOR_DISPLAY": "Choose one or more valid values ({{ label }}):", - "CHOOSE_GROUP":"Choose a group", + "CHOOSE_GROUP": "Choose a group", "MANDATORY_HINT": "Mandatory field", "UNIT": "Unit", "MIN": "Min", @@ -226,6 +237,7 @@ "SAVE": "Save", "CANCEL": "Cancel", "CLOSE": "Close", + "DOWNLOAD": "Download", "ADD": "Add", "ADD_TOOLTIP": "restrict criteria", "ADDALL": "Add all", @@ -235,6 +247,7 @@ "SAVEQUERY": "Save query", "VALIDATE": "Validate", "IMPORT": "Load query", - "IMPORT_FROM_FILE": "choose file" + "IMPORT_FROM_FILE": "choose file", + "IMPORT_DATASELECTION": "Load Dataselection" } -} +} \ No newline at end of file diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index 3d1a2ee..5b833d7 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: flare: - image: ghcr.io/medizininformatik-initiative/flare:2.0.0-rc2 + image: ghcr.io/medizininformatik-initiative/flare:2.0.0-rc3 ports: - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: From 919041474cd94241ae7d61f2d73445c7782ce766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 29 Sep 2023 15:18:24 +0200 Subject: [PATCH 111/118] Begin Update Readme --- feasibility-portal/README.md | 22 ++-------------------- feasibility-triangle/README.md | 32 ++------------------------------ 2 files changed, 4 insertions(+), 50 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 5ce4417..d25d5cf 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -35,27 +35,9 @@ Set the rights for all files of the auth folder to 655 `chmod 655 /opt/feasibili - Not providing the certificate files is not an option. -### Step 5 - Load the ontology mapping files +### Step 5 - Load the ontology -If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. -Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie - -Upload the ontology .zip files to your server, unpack them and copy the ontology files to your feasibility portal ontology folder - -```bash -sudo -s -mkdir ///// -cd ///// -unzip mapping_*.zip -unzip ui_profile_*.zip -unzip db_migration_*.zip -cd mapping -cp * /opt/feasibility-deploy/feasibility-portal/ontology -cd ../ui_profile -cp * /opt/feasibility-deploy/feasibility-portal/ontology/ui_profiles -cd ../db_migration -cp * /opt/feasibility-deploy/feasibility-portal/ontology/migration -``` +**Note:** The ontology is now part of the image and will not have to be loaded manually. ### Step 6 - Configure your feasibility portal diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 9dc28e0..d5ca673 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -72,19 +72,7 @@ Set the rights for all files of the auth folder to 655 `chmod 655 /opt/feasibili ### Step 6 - Load the ontology mapping files -If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. -Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie - -Upload the mapping_*.zip file to your server, unpack it and copy the ontology files to your triangle ontology folder - -```bash -sudo -s -mkdir ///// -cd ///// -unzip mapping_*.zip -cd mapping -cp * /opt/feasibility-deploy/feasibility-triangle/ontology -``` +**Note:** The ontology is now part of the FLARE image and will not have to be loaded manually. ### Step 7 - Configure your feasibility triangle @@ -243,23 +231,7 @@ Keep the existing configuration as is. ### Step 4 - Update your ontology -If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. -Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie. - -Make sure that you use the newest version. - -Upload the mapping_*.zip file to your server, unpack it and copy the ontology files to your triangle ontology folder. - -```bash -sudo -s -mkdir ///// -cd ///// -unzip mapping_*.zip -cd mapping -cp * /opt/feasibility-deploy/feasibility-triangle/ontology -``` - -Existing mapping files should be replaced. +**Note:** The ontology is now part of the FLARE image and will not have to be loaded manually. ### Step 5 - Start your triangle From a6dcfc3ced257f9e6b6f30ab5dc05ce4a206e6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 29 Sep 2023 17:12:31 +0200 Subject: [PATCH 112/118] refactor, bump backend version --- feasibility-portal/backend/docker-compose.yml | 3 ++- .../keycloak/docker-compose.yml | 2 +- .../aktin-client/.env.default | 1 + .../aktin-client/docker-compose.yml | 3 ++- .../rev-proxy/add-nginx-user.sh | 3 --- .../rev-proxy/q_nginx_start.sh | 20 ------------------ .../rev-proxy/setup-base-auth.sh | 21 ------------------- feasibility-triangle/setup-base-auth.sh | 12 ----------- 8 files changed, 6 insertions(+), 59 deletions(-) delete mode 100755 feasibility-triangle/rev-proxy/add-nginx-user.sh delete mode 100755 feasibility-triangle/rev-proxy/q_nginx_start.sh delete mode 100755 feasibility-triangle/rev-proxy/setup-base-auth.sh diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index 43072c3..d342c1f 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:4.0.0-alpha1 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:4.0.0-alpha2 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: @@ -66,6 +66,7 @@ services: restart: unless-stopped volumes: - ${FEASIBILITY_BACKEND_CERTS_PATH:-../secrets}:/opt/codex-feasibility-security + - ./certs:/opt/codex-feasibility-backend/certs feasibility-gui-backend-db: image: 'postgres:15-alpine' diff --git a/feasibility-portal/keycloak/docker-compose.yml b/feasibility-portal/keycloak/docker-compose.yml index 6f4725c..3cd6395 100644 --- a/feasibility-portal/keycloak/docker-compose.yml +++ b/feasibility-portal/keycloak/docker-compose.yml @@ -12,7 +12,7 @@ services: - "feasibility-auth-db:/var/lib/postgresql/data" auth: - image: keycloak/keycloak:21.0 + image: keycloak/keycloak:22.0 command: ["start", "--import-realm"] restart: unless-stopped environment: diff --git a/feasibility-triangle/aktin-client/.env.default b/feasibility-triangle/aktin-client/.env.default index 49b525a..1bbac17 100644 --- a/feasibility-triangle/aktin-client/.env.default +++ b/feasibility-triangle/aktin-client/.env.default @@ -14,6 +14,7 @@ FEASIBILITY_AKTIN_PROCESS_EXECUTOR_THREADS=2 FEASIBILITY_AKTIN_CQL_FHIR_BASE_URL= FEASIBILITY_AKTIN_CQL_FHIR_USER= FEASIBILITY_AKTIN_CQL_FHIR_PW= +FEASIBILITY_AKTIN_CQL_SOCKET_TIMEOUT_MS=50000 FEASIBILITY_AKTIN_FLARE_URL=http://flare:8080/query/execute FEASIBILITY_AKTIN_FLARE_USER= FEASIBILITY_AKTIN_FLARE_PW= diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index abdcec1..184bc7f 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:1.6.0 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:2.0.0-rc1 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} @@ -18,6 +18,7 @@ services: CQL_FHIR_BASE_URL: ${FEASIBILITY_AKTIN_CQL_FHIR_BASE_URL} CQL_FHIR_USER: ${FEASIBILITY_AKTIN_CQL_FHIR_USER} CQL_FHIR_PW: ${FEASIBILITY_AKTIN_CQL_FHIR_PW} + CQL_SOCKET_TIMEOUT_MS: ${FEASIBILITY_AKTIN_CQL_SOCKET_TIMEOUT_MS} FLARE_URL: ${FEASIBILITY_AKTIN_FLARE_URL:-http://flare:8080/query/execute} FLARE_USER: ${FEASIBILITY_AKTIN_FLARE_USER} FLARE_PW: ${FEASIBILITY_AKTIN_FLARE_PW} diff --git a/feasibility-triangle/rev-proxy/add-nginx-user.sh b/feasibility-triangle/rev-proxy/add-nginx-user.sh deleted file mode 100755 index f8986b8..0000000 --- a/feasibility-triangle/rev-proxy/add-nginx-user.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -echo "generating user and pw: $1 , $2" -docker run --rm --entrypoint htpasswd registry:2.7.0 -nb "$1" "$2" >> .htpasswd diff --git a/feasibility-triangle/rev-proxy/q_nginx_start.sh b/feasibility-triangle/rev-proxy/q_nginx_start.sh deleted file mode 100755 index c746a8b..0000000 --- a/feasibility-triangle/rev-proxy/q_nginx_start.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -ALLOWED_IPS=${ALLOWED_IPS:-""} - -echo "$ALLOWED_IPS" - -ips=$(echo "$ALLOWED_IPS" | tr ",'" "\n") - -printf "" > /etc/nginx/conf.d/queue_allow_ips.conf - -for ip in $ips -do - echo "allow $ip;" >> /etc/nginx/conf.d/queue_allow_ips.conf -done - -if [[ -n $ALLOWED_IPS ]];then - echo "deny all;" >> /etc/nginx/conf.d/queue_allow_ips.conf -fi - -#starting nginx -nginx -g 'daemon off;' diff --git a/feasibility-triangle/rev-proxy/setup-base-auth.sh b/feasibility-triangle/rev-proxy/setup-base-auth.sh deleted file mode 100755 index f6c4ea0..0000000 --- a/feasibility-triangle/rev-proxy/setup-base-auth.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env sh - -#FILE=$PWD/node-rev-proxy/dhparam.pem -#if [ ! -f "$FILE" ]; then -# echo "Creating longer Diffie-Hellman Prime for extra security... this may take a while \n\n" -# docker run --rm -v $PWD/node-rev-proxy:/export --entrypoint openssl alpine/openssl dhparam -out /export/dhparam.pem 4096 -# echo $FILE -# -#fi - -if ! readlink "$0" >/dev/null; then - BASE_DIR=$(dirname "$0") -else - BASE_DIR=$(dirname "$(readlink "$0")") -fi - -echo "Generating default certificate..." -docker run --rm -v "$BASE_DIR"/auth:/export --entrypoint openssl alpine/openssl req -nodes -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout /export/key.pem -out /export/cert.pem -days 99999 - -#echo "generating user: $1 , with password: $2" -#docker run --rm --entrypoint htpasswd registry:2.7.0 -nb $1 $2 > .htpasswd diff --git a/feasibility-triangle/setup-base-auth.sh b/feasibility-triangle/setup-base-auth.sh index b013a23..f65351e 100755 --- a/feasibility-triangle/setup-base-auth.sh +++ b/feasibility-triangle/setup-base-auth.sh @@ -1,12 +1,5 @@ #!/usr/bin/env sh -#FILE=$PWD/node-rev-proxy/dhparam.pem -#if [ ! -f "$FILE" ]; then -# echo "Creating longer Diffie-Hellman Prime for extra security... this may take a while \n\n" -# docker run --rm -v $PWD/node-rev-proxy:/export --entrypoint openssl alpine/openssl dhparam -out /export/dhparam.pem 4096 -# echo $FILE -# -#fi if [ -z "$BASE_DIR" ]; then BASE_DIR=$( cd -- "$(dirname "$0")" >/dev/null 2>&1 || exit 1 ; pwd -P ) fi @@ -17,10 +10,5 @@ if [ -z "$1" ] && [ -z "$2" ]; then exit fi -#echo "Generating default certificate..." -#docker run --rm -v $BASE_DIR/auth:/export --entrypoint openssl alpine/openssl req -nodes -subj '/CN=localhost' -x509 -newkey rsa:4096 -keyout /export/key.pem -out /export/cert.pem -days 99999 -#docker run --rm -v $BASE_DIR/auth:/export alpine chmod 655 /export/* - echo "generating user: $1 , with password: $2" docker run --rm --entrypoint htpasswd registry:2.7.0 -nb "$1" "$2" > "$BASE_DIR"/auth/.htpasswd - From 644f14a998d70ceb765c689132715588f84b4361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Wed, 4 Oct 2023 13:02:10 +0200 Subject: [PATCH 113/118] Add persistent cache volume to flare --- feasibility-triangle/flare/docker-compose.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index 5b833d7..b858702 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -22,3 +22,10 @@ services: restart: unless-stopped volumes: - ${FLARE_SELF_SIGNED_CA_CERT_PATH:-./certs}:/app/certs + - type: volume + source: feas-flare-cache + target: /app/cache + +volumes: + feas-flare-cache: + name: "feas-flare-cache" From c7f2cf15a9c4d71612a1c3f355574e0ba5b1e2bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Thu, 5 Oct 2023 16:03:09 +0200 Subject: [PATCH 114/118] Update backend, gui and readme --- feasibility-portal/README.md | 102 ++++++++-------- feasibility-portal/backend/docker-compose.yml | 2 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-portal/gui/language/de.json | 1 + feasibility-triangle/README.md | 114 ++++++++++-------- 5 files changed, 118 insertions(+), 103 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index d25d5cf..1bccabf 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -55,7 +55,7 @@ If you use the default local feasibility portal setup you will only have to chan | backend/.env | FLARE_WEBSERVICE_BASE_URL | http://flare:8080 | | backend/.env | FEASIBILITY_BACKEND_ALLOWED_ORIGINS | base-url-of-your-local-feasibility-portal | |backend/.env |FEASIBILITY_BACKEND_KEYCLOAK_BASE_URL_ISSUER| base-url-of-your-local-feasibility-portal/auth | -| gui/deploy-config.json | uiBackendApi > baseUrl | base-url-of-your-local-feasibility-portal/api/v2 | +| gui/deploy-config.json | uiBackendApi > baseUrl | base-url-of-your-local-feasibility-portal/api/v3 | | gui/deploy-config.json | auth > baseUrl | base-url-of-your-local-feasibility-portal | Please note that all user env variables (variables containing USER) should be changed and all password variables (variables containing PASSWORD or PW) should be set to secure passwords. @@ -111,7 +111,46 @@ Click on **New query**, create a query and send it using the **send** button. After a few moments you should see the results to your query in the **Number of patients** window. -## Configurable environment variables +## Updating your local feasibility portal + +If you have already installed the local feasibility portal and just want to update it, follow these steps: + + +### Step 1 - Stop your portal + +`cd /opt/feasibility-deploy/feasibility-portal && bash stop-feasibility-portal.sh` + +### Step 2 - Update repository and check out new tag + +`cd /opt/feasibility-deploy && git pull` +`git checkout ` + +### Step 3 - transfer the new env variables + +Compare the .env and .env.default files for each component and add any new variables from the .env.default file to the .env file. +Keep the existing configuration as is. + +### Step 4 - Update your ontology + +**Note:** The ontology is now part of the image and will not have to be loaded manually. + +### Step 5 - Start your portal + +To start the portal navigate to `/opt/feasibility-deploy/feasibility-portal` and +execute `bash start-feasibility-portal-local.sh`. + +### Step 6 - Log in to the local feasibility portal and test your connection + +Ask for the Url of the central portal at the FDPG or check Confluence for the correct address. + +Log in to the portal and send a request with the Inclusion Criterion chosen from the Inclusion criteria tree (folder sign under Inclusion Criteria) +"Person > PatientIn > Geschlecht: Female,Male" + +and press "send". + +## Configuration + +### Configurable environment variables | Env Var | Description | Default | Possible values | Component | @@ -192,60 +231,15 @@ After a few moments you should see the results to your query in the **Number of | FEASIBILITY_DSF_BROKER_PROCESS_FHIR_SERVER_BASE_URL | Base URL to a FHIR server or proxy for feasibility evaluation. This can also be the base URL of a reverse proxy if used. Only required if evaluation strategy is set to cql. | https://dsf-zars-fhir-proxy/fhir | URL | DSF | +### Support for self-signed certificates -## Updating your local feasibility portal - -If you have already installed the local feasibility portal and just want to update it, follow these steps: - - -### Step 1 - Stop your portal - -`cd /opt/feasibility-deploy/feasibility-portal && bash stop-feasibility-portal.sh` - -### Step 2 - Update repository and check out new tag - -`cd /opt/feasibility-deploy && git pull` -`git checkout ` - -### Step 3 - transfer the new env variables - -Compare the .env and .env.default files for each component and add any new variables from the .env.default file to the .env file. -Keep the existing configuration as is. - -### Step 4 - Update your ontology - -If used, (see "Overview") The FLARE component requires a mapping file and ontology tree file to translate an incoming feasibility query into FHIR Search queries. -Both can be downloaded here: https://confluence.imi.med.fau.de/display/ABIDEMI/Ontologie - -Upload the ontology .zip files to your server, unpack them and copy the ontology files to your feasibility portal ontology folder. - -```bash -sudo -s -mkdir ///// -cd ///// -unzip mapping_*.zip -unzip ui_profile_*.zip -unzip db_migration_*.zip -cd mapping -cp * /opt/feasibility-deploy/feasibility-portal/ontology -cd ../ui_profile -cp * /opt/feasibility-deploy/feasibility-portal/ontology/ui_profiles -cd ../db_migration -cp * /opt/feasibility-deploy/feasibility-portal/ontology/migration -``` - -Existing files should be replaced. - -### Step 5 - Start your portal +Depending on your setup you might need to use self-singed certificates and the tools will have to accept your CAs. +For the portal then only tool for which this is relevant is the backend. -To start the portal navigate to `/opt/feasibility-deploy/feasibility-portal` and -execute `bash start-feasibility-portal-local.sh`. +#### Feasibility Backend -### Step 6 - Log in to the local feasibility portal and test your connection +The feasibility backend supports the use of self-signed certificates from your own CAs. On each startup, the feasibility backend will search through the folder /app/certs inside the container, add all found CA *.pem files to a java truststore and start the application with this truststore. -Ask for the Url of the central portal at the FDPG or check Confluence for the correct address. +Using docker-compose, mount a folder from your host (e.g.: ./certs) to the /app/certs folder, add your *.pem files (one for each CA you would like to support) to the folder and ensure that they have the .pem extension. -Log in to the portal and send a request with the Inclusion Criterion chosen from the Inclusion criteria tree (folder sign under Inclusion Criteria) -"Person > PatientIn > Geschlecht: Female,Male" - -and press "send". +In this deployment repository we have prepared this for you. To add your own CA add the respective ca *.pem files to the backend/certs folder. diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index d342c1f..eb56ad0 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:4.0.0-alpha2 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:4.0.0-alpha3 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 20f0678..a339d99 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:1.2.0_RC1 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:1.2.0_RC4 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-portal/gui/language/de.json b/feasibility-portal/gui/language/de.json index c9cec34..c335e48 100644 --- a/feasibility-portal/gui/language/de.json +++ b/feasibility-portal/gui/language/de.json @@ -121,6 +121,7 @@ "LABEL_OR": "ODER" }, "DISPLAY": { + "REFERENCED_CRITERIA": "Referenzierte Kriterien", "LABEL": "Ausgewählte Merkmale", "ONE_OF": "", "MORE": "weitere", diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index d5ca673..4d6278a 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -25,8 +25,8 @@ All components work with well-defined interfaces making them interchangeable. Th This leads to the following setup options: -- AKTIN - FLARE (FHIR Search) - FHIR Server (not CQL ready) -- AKTIN - FHIR Server (CQL ready) +- AKTIN - FLARE (FHIR Search) - FHIR Server (not CQL ready) - DEPRECATED FROM 31.12.2023 +- AKTIN - FHIR Server (CQL ready) - DEPRECATED FROM 31.12.2023 - DSF - FLARE (FHIR Search) - FHIR Server (not CQL ready) - DSF - FHIR Server (CQL ready) @@ -39,7 +39,7 @@ This leads to the following setup options: The installation of the Feasibility Triangle requires Docker (https://docs.docker.com/engine/install/ubuntu/) and docker-compose (https://docs.docker.com/compose/install/). If not already installed on your VM, install using the links provided above. -### Step 2 - clone this Repository to your virtual machine +### Step 2 - Clone this Repository to your virtual machine ssh to your virtual machine and switch to sudo `sudo -s`. Designate a folder for your setup in which to clone the deploy repository, we suggest /opt (`cd /opt`) @@ -138,6 +138,60 @@ unpack it and save it to the testdata folder of this repository. You can then load the data into your FHIR Server using the `upload-testdata.sh` script. + +## Updating the Feasibility Triangle + +If you have already installed the feasibility triangle and just want to update it, follow these steps: + + +### Step 1 - Stop your triangle + +`cd /opt/feasibility-deploy/feasibility-triangle && bash stop-triangle.sh` + +### Step 2 - Update repository and check out new tag + +`cd /opt/feasibility-deploy/feasibility-triangle && git pull` +`git checkout ` + +### Step 3 - transfer the new env variables + +Compare the .env and .env.default files for each component and add any new variables from the .env.default file to the .env file. +Keep the existing configuration as is. + +### Step 4 - Update your ontology + +**Note:** The ontology is now part of the FLARE image and will not have to be loaded manually. + +### Step 5 - Start your triangle + +To start the triangle navigate to `/opt/feasibility-deploy/feasibility-triangle` and +execute `bash start-triangle.sh`. + +### Step 6 - Update your DSF + +If you are using the DSF to connect to the central feasibility portal, please follow the instructions here: +https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup + +### Step 7 - Log in to the central feasibility portal and test your connection + +Ask for the Url of the central portal at the FDPG or check Confluence for the correct address. + +Log in to the portal and send a request with the Inclusion Criterion chosen from the Inclusion criteria tree (folder sign under Inclusion Criteria) +"Person > PatientIn > Geschlecht: Female,Male" + +and press "send". + +Check your triangle aktin client logs: +docker logs -f id-of-the-aktin-client-container + +you should see output similar to: +``` +Mar 29, 2023 12:59:57 PM feasibility.FeasibilityExecution doExecution +FINE: {"version":"http://to_be_decided.com/draft-1/schema#","display":"","inclusionCriteria":[[{"termCodes":[{"code":"263495000","system":"http://snomed.info/sct","display":"Geschlecht"}],"context":{"code":"Patient","system":"fdpg.mii.cds","version":"1.0.0","display":"Patient"},"valueFilter":{"selectedConcepts":[{"code":"female","display":"Female","system":"http://hl7.org/fhir/administrative-gender"},{"code":"male","display":"Male","system":"http://hl7.org/fhir/administrative-gender"}],"type":"concept"}}]]} +``` + +## Configuration + ### Configurable environment variables | Env Variable | Description | Default | Possible Values | Component | @@ -209,54 +263,20 @@ You can then load the data into your FHIR Server using the `upload-testdata.sh` | FEASIBILITY_DSF_CLIENT_PROCESS_FLARE_WEBSERVICE_BASE_URL | Base URL to a FLARE instance. Only required if evaluation strategy is set to structured-query. | http://node-flare:5000/ | URL | DSF | +### Support for self-singed certificates -## Updating the Feasibility Triangle - -If you have already installed the feasibility triangle and just want to update it, follow these steps: - - -### Step 1 - Stop your triangle - -`cd /opt/feasibility-deploy/feasibility-triangle && bash stop-triangle.sh` - -### Step 2 - Update repository and check out new tag - -`cd /opt/feasibility-deploy/feasibility-triangle && git pull` -`git checkout ` +Depending on your setup you might need to use self-singed certificates and the tools will have to accept your CAs. +For the triangle self-singed certificates are currently supported for the PATH: BPE (DSF) -> FLARE -> FHIR SERVER. -### Step 3 - transfer the new env variables +#### BPE (DSF) -Compare the .env and .env.default files for each component and add any new variables from the .env.default file to the .env file. -Keep the existing configuration as is. +The DSF Feasibility Plugin supports self-signed certificates - please see [DSF configuration wiki](https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup) +for details. -### Step 4 - Update your ontology +#### FLARE -**Note:** The ontology is now part of the FLARE image and will not have to be loaded manually. +FLARE supports the use of self-signed certificates from your own CAs. On each startup FLARE will search through the folder /app/certs inside the container , add all found CA *.pem files to a java truststore and start FLARE with this truststore. -### Step 5 - Start your triangle +In order to add your own CA files, add your own CA *.pem files to the /app/certs folder of the container. -To start the triangle navigate to `/opt/feasibility-deploy/feasibility-triangle` and -execute `bash start-triangle.sh`. - -### Step 6 - Update your DSF - -If you are using the DSF to connect to the central feasibility portal, please follow the instructions here: -https://github.com/medizininformatik-initiative/feasibility-deploy/wiki/DSF-Middleware-Setup - -### Step 7 - Log in to the central feasibility portal and test your connection - -Ask for the Url of the central portal at the FDPG or check Confluence for the correct address. - -Log in to the portal and send a request with the Inclusion Criterion chosen from the Inclusion criteria tree (folder sign under Inclusion Criteria) -"Person > PatientIn > Geschlecht: Female,Male" - -and press "send". - -Check your triangle aktin client logs: -docker logs -f id-of-the-aktin-client-container - -you should see output similar to: -``` -Mar 29, 2023 12:59:57 PM feasibility.FeasibilityExecution doExecution -FINE: {"version":"http://to_be_decided.com/draft-1/schema#","inclusionCriteria":[[{"termCodes":[{"code":"718-7","system":"http://loinc.org","display":"Hämoglobin"}],"valueFilter":{"type":"quantity-comparator","selectedConcepts":[],"comparator":"gt","unit":{"code":"g/dL","display":"g/dL"},"value":0.0}}]]} -``` +Using docker-compose mount a folder from your host (e.g.: ./certs) to the /app/certs folder, add your *.pem files (one for each CA you would like to support) to the folder and ensure that they have the .pem extension. From 60e2e480e9424712063518e7f024bbcfabdaf5c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Fri, 6 Oct 2023 12:32:52 +0200 Subject: [PATCH 115/118] Update lang files --- feasibility-portal/gui/language/de.json | 6 +++++- feasibility-portal/gui/language/en.json | 10 ++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/feasibility-portal/gui/language/de.json b/feasibility-portal/gui/language/de.json index c335e48..fc987ea 100644 --- a/feasibility-portal/gui/language/de.json +++ b/feasibility-portal/gui/language/de.json @@ -162,6 +162,8 @@ "HEADER_FILTER_CONCEPT_OPTIONAL": "Wählen Sie einen oder mehrere zulässige Werte:", "HEADER_FILTER_CONCEPT_MANDATORY": "Geben Sie einen oder mehrere zulässige Werte an:", "HEADER_FILTER_CONCEPT_FOR_DISPLAY": "Geben Sie einen oder mehrere zulässige Werte an ({{ label }}):", + "HEADER_FILTER_REFERENCE": "Festgestellte Diagnose", + "HEADER_FILTER_VALUE": "Wertebereich", "CHOOSE_GROUP": "Gruppe auswählen", "MANDATORY_HINT": "Pflichtfeld", "UNIT": "Einheit", @@ -170,6 +172,7 @@ "VALUE": "Wert", "OPERATOR": "Operator", "AND": "und", + "NONE": "kein Filter", "EQUAL": "gleich", "LESS_THAN": "kleiner", "GREATER_THAN": "größer", @@ -232,7 +235,8 @@ }, "LEGAL": { "DISCLOSURE": "Impressum", - "DATAPROTECTION": "Datenschutz" + "DATAPROTECTION": "Datenschutz", + "CONTACT": "Kontakt" }, "BUTTON": { "SAVE": "Speichern", diff --git a/feasibility-portal/gui/language/en.json b/feasibility-portal/gui/language/en.json index 487c14a..5a60e1e 100644 --- a/feasibility-portal/gui/language/en.json +++ b/feasibility-portal/gui/language/en.json @@ -99,6 +99,7 @@ "TIMERESTRICTION": "Time restricted criteria", "DISPLAYVALUEFILTERICON": "Use icons for comparator symbols", "POLLINGTIME": "Polling Time", + "CONTEXT_IN_SQ": "Include Context in SQ", "POLLINGINTERVALL": "Polling Intervall", "FHIRPORT": "FHIR Port" }, @@ -133,6 +134,7 @@ "TO": "before {{ to }}", "NONE": "no time restriction" }, + "REFERENCED_CRITERIA": "referenced criteria:", "GROUPS": { "LINKEDGROUPS": "groups are linked", "SHOW_CONNECTION": "show connection", @@ -161,6 +163,8 @@ "HEADER_FILTER_CONCEPT_OPTIONAL": "Choose one or more valid values:", "HEADER_FILTER_CONCEPT_MANDATORY": "Choose one or more valid values:", "HEADER_FILTER_CONCEPT_FOR_DISPLAY": "Choose one or more valid values ({{ label }}):", + "HEADER_FILTER_REFERENCE": "observed diagnosis", + "HEADER_FILTER_VALUE": "Value restriction", "CHOOSE_GROUP": "Choose a group", "MANDATORY_HINT": "Mandatory field", "UNIT": "Unit", @@ -169,6 +173,7 @@ "VALUE": "Value", "OPERATOR": "Operator", "AND": "and", + "NONE": "none", "EQUAL": "equals", "LESS_THAN": "less than", "GREATER_THAN": "more than", @@ -214,7 +219,7 @@ }, "HINT": { "NO_VALUE_SELECTED": "Choose at least one value", - "MINIMUM_GREATER_MAXIMUM": "Minimal value must be greater than maximal value", + "MINIMUM_GREATER_MAXIMUM": "Minimal value must be less than maximal value", "MINIMUM_EXCEEDED": "Value must be at least {{ min }}", "MAXIMUM_EXCEEDED": "Value must be at most {{ max }}", "SEARCH_TEXT_NO_INPUT": "Enter a search criteria or open the category tree view", @@ -231,7 +236,8 @@ }, "LEGAL": { "DISCLOSURE": "Disclosure", - "DATAPROTECTION": "Data Protection" + "DATAPROTECTION": "Data Protection", + "CONTACT": "Contact" }, "BUTTON": { "SAVE": "Save", From d5f08ac2dbc6a05c151e3c7d395e1535eab17b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Sun, 8 Oct 2023 20:45:05 +0200 Subject: [PATCH 116/118] bump versions to release versions for flare, aktin, backend --- feasibility-portal/README.md | 2 +- feasibility-portal/backend/docker-compose.yml | 2 +- feasibility-portal/gui/docker-compose.yml | 2 +- feasibility-triangle/README.md | 6 +++--- feasibility-triangle/aktin-client/docker-compose.yml | 2 +- feasibility-triangle/flare/docker-compose.yml | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 1bccabf..01e097a 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -17,7 +17,7 @@ ssh to your virtual machine and switch to sudo `sudo -s`. Designate a folder for your setup in which you clone the deploy repository, we suggest /opt (`cd /opt`) Navigate to the directory and clone this repository: `git clone https://github.com/medizininformatik-initiative/feasibility-deploy.git` Navigate to the feasibility-portal folder of the repository: `cd /opt/feasibility-deploy/feasibility-portal` -Checkout the version (git tag) of the feasibility portal you would like to install: `git checkout tags/` +Checkout the version (git tag) of the feasibility portal you would like to install: `git checkout ` ### Step 3 - Initialise .env files diff --git a/feasibility-portal/backend/docker-compose.yml b/feasibility-portal/backend/docker-compose.yml index eb56ad0..4acd547 100644 --- a/feasibility-portal/backend/docker-compose.yml +++ b/feasibility-portal/backend/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: feasibility-gui-backend: - image: ghcr.io/medizininformatik-initiative/feasibility-backend:4.0.0-alpha3 + image: ghcr.io/medizininformatik-initiative/feasibility-backend:4.0.0 ports: - ${FEASIBILITY_BACKEND_PORT:-127.0.0.1:8091}:8090 depends_on: diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index a339d99..0e11a42 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:1.2.0_RC4 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:1.2.0_RC5 ports: - "443:8443" restart: unless-stopped diff --git a/feasibility-triangle/README.md b/feasibility-triangle/README.md index 4d6278a..cf1381f 100644 --- a/feasibility-triangle/README.md +++ b/feasibility-triangle/README.md @@ -25,8 +25,8 @@ All components work with well-defined interfaces making them interchangeable. Th This leads to the following setup options: -- AKTIN - FLARE (FHIR Search) - FHIR Server (not CQL ready) - DEPRECATED FROM 31.12.2023 -- AKTIN - FHIR Server (CQL ready) - DEPRECATED FROM 31.12.2023 +- AKTIN - FLARE (FHIR Search) - FHIR Server (not CQL ready) - END OF SUPPORT FOR FEASIBILITY 31.12.2023 +- AKTIN - FHIR Server (CQL ready) - END OF SUPPORT FOR FEASIBILITY 31.12.2023 - DSF - FLARE (FHIR Search) - FHIR Server (not CQL ready) - DSF - FHIR Server (CQL ready) @@ -45,7 +45,7 @@ ssh to your virtual machine and switch to sudo `sudo -s`. Designate a folder for your setup in which to clone the deploy repository, we suggest /opt (`cd /opt`) Navigate to the directory and clone this repository: `git clone https://github.com/medizininformatik-initiative/feasibility-deploy.git` Navigate to the feasibility-triangle folder of the repository: `cd /opt/feasibility-deploy/feasibility-triangle` -Checkout the version (git tag) of the feasibility triangle you would like to install: `git checkout tags/` +Checkout the version (git tag) of the feasibility triangle you would like to install: `git checkout ` ### Step 3 - Initialise .env files diff --git a/feasibility-triangle/aktin-client/docker-compose.yml b/feasibility-triangle/aktin-client/docker-compose.yml index 184bc7f..5ed744a 100644 --- a/feasibility-triangle/aktin-client/docker-compose.yml +++ b/feasibility-triangle/aktin-client/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: aktin-client: - image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:2.0.0-rc1 + image: ghcr.io/medizininformatik-initiative/feasibility-aktin-client:2.0.0 environment: BROKER_REQUEST_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_REQUEST_MEDIATYPE:-application/sq+json} BROKER_RESULT_MEDIATYPE: ${FEASIBILITY_AKTIN_CLIENT_BROKER_RESULT_MEDIATYPE:-application/json} diff --git a/feasibility-triangle/flare/docker-compose.yml b/feasibility-triangle/flare/docker-compose.yml index b858702..c19ce8e 100644 --- a/feasibility-triangle/flare/docker-compose.yml +++ b/feasibility-triangle/flare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: flare: - image: ghcr.io/medizininformatik-initiative/flare:2.0.0-rc3 + image: ghcr.io/medizininformatik-initiative/flare:2.0.0 ports: - ${FEASIBILITY_FLARE_PORT:-127.0.0.1:8084}:8080 environment: From 90ef2ea57e73647720359e9b95f3138ffae251a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Sun, 8 Oct 2023 21:42:45 +0200 Subject: [PATCH 117/118] bump ui version --- feasibility-portal/gui/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feasibility-portal/gui/docker-compose.yml b/feasibility-portal/gui/docker-compose.yml index 0e11a42..b929851 100644 --- a/feasibility-portal/gui/docker-compose.yml +++ b/feasibility-portal/gui/docker-compose.yml @@ -1,6 +1,6 @@ services: feasibility-gui: - image: ghcr.io/medizininformatik-initiative/feasibility-gui:1.2.0_RC5 + image: ghcr.io/medizininformatik-initiative/feasibility-gui:2.0.0 ports: - "443:8443" restart: unless-stopped From 5315aacaa3db21584f3913450086f65e8b74257c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Gru=CC=88ndner?= Date: Sun, 8 Oct 2023 22:10:07 +0200 Subject: [PATCH 118/118] Release v3.0.0 --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ac8f26..d2f3a75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Please refer to the respective repositories for a more in depth changelog of sin |Component|Link| |--|--| |UI|| +|Ontology Generation|| |Backend|| |AKTIN Broker|| |AKTIN Feasibility Plugin|| @@ -16,6 +17,27 @@ Please refer to the respective repositories for a more in depth changelog of sin |FLARE|| |Blaze FHIR server|| +## [3.0.0] - 2023-08-08 + +### Overall + +- Updated all components and underlying libraries to the new versions +- Updated all components to version compatible with ontology version 2.0 +- Adjusted readme to reflect changes in the underlying components + +### Features + +| Feature | Affected Components | +| -- | -- | +|Added support for referenced criteria|UI, backend, Ontology, Sq2cql, FLARE| +|Added support for composite search parameters|UI, SQ, Ontology, Sq2cql, FLARE| +|Updated to new DSF version v1.0.0 compatible with new DSF verison v1.x | Backend, DSF feasibility plugin| +|Added Dateselection|UI| +|Update ontology to new ontology generation and added ontology to images directly| Ontology, Backend, FLARE| +|Added encrypted result logging| Backend| +|Add support for self-signed certificates| Backend, FLARE, DSF feasibility plugin | + + ## [2.1.0] - 2023-07-25 ### Overall

    2bzj8sa({WN7~c*PATs_c6oNbwq;J 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 Date: Tue, 12 Apr 2022 22:08:20 +0200 Subject: [PATCH 010/118] update feasibility portal readme --- feasibility-portal/README.md | 41 +++--------------------------------- 1 file changed, 3 insertions(+), 38 deletions(-) diff --git a/feasibility-portal/README.md b/feasibility-portal/README.md index 28a67ad..739f1e6 100644 --- a/feasibility-portal/README.md +++ b/feasibility-portal/README.md @@ -1,41 +1,6 @@ -# Codex Feasibility Platform +# Feasibility Portal -The codex feasibility platform provides a feasibility query user interface with an appropriate backend, query translation to CQL and FHIR Search as well as -two Middlewares for the transfer of the queries from the feasibility platform to the so called num-nodes located inside hospitals. +The feasibility portal provides a feasibility query user interface with an appropriate backend, query translation to CQL and FHIR Search as well as +the central part of two Middleware for the transfer of the queries from the feasibility portal to the feasibility triangles located at participating sites (hospitals). -The feasibility platform can be run standalone inside a data integration center for local queries or, if connected via the middlewares provided as part of this project, -connected to decentral num-nodes inside data integration centers. - -The feasibility gui allows a researcher to define feasibility queries, by combining inclusion and exlcusion search criterions using boolean logic (see example Figure 1 below). - -

!)}vCu!O@X(mAPWn@eIg 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