medizininformatik-initiative / torch

Apache License 2.0
0 stars 0 forks source link

CRTDL Endpoint #19

Open Lucas0T opened 3 weeks ago

Lucas0T commented 3 weeks ago

Torch should be extended for a webservice endpoint, which given a CRTDL as input extracts the cohort and then the data. The endpoint should be implemented asynchronosly and as close to the following specification as possible. http://hl7.org/fhir/R5/async-bulk.html

as a FHIR endpoint it should receive the CRTDL in form of a Measure and Library as a direct payload (so that a Measure and Library endpoint is unnecessary)

Example Measure and Library to transport a SQ in the mii-process-feasibility, see here: https://github.com/medizininformatik-initiative/mii-process-feasibility

Note that the crtdl has to be base64 encoded to be added to the library

{
    "resourceType": "Measure",
    "id": "aee70d55-99ff-474a-8055-b539ae137644",
    "meta": {
        "versionId": "1",
        "lastUpdated": "2024-07-15T07:14:50.286+02:00",
        "profile": [
            "http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-measure"
        ],
        "tag": [
            {
                "system": "http://dsf.dev/fhir/CodeSystem/read-access-tag",
                "code": "ALL"
            }
        ]
    },
    "url": "https://dsf.fdpg.test.forschen-fuer-gesundheit.de/fhir/Measure/702e14c0-0459-4fc4-8463-493e4a3b069f",
    "status": "active",
    "library": [
        "urn:uuid:a67b655b-ab65-46d2-aef1-c070ee28573e"
    ],
    "scoring": {
        "coding": [
            {
                "system": "http://terminology.hl7.org/CodeSystem/measure-scoring",
                "code": "cohort"
            }
        ]
    },
    "group": [
        {
            "population": [
                {
                    "code": {
                        "coding": [
                            {
                                "system": "http://terminology.hl7.org/CodeSystem/measure-population",
                                "code": "initial-population"
                            }
                        ]
                    },
                    "criteria": {
                        "language": "text/cql",
                        "expression": "InInitialPopulation"
                    }
                }
            ]
        }
    ]
}
{
    "resourceType": "Library",
    "id": "606aceec-264b-494d-8291-15121314188e",
    "meta": {
        "versionId": "1",
        "lastUpdated": "2024-07-15T07:14:50.192+02:00",
        "profile": [
            "http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-library"
        ],
        "tag": [
            {
                "system": "http://dsf.dev/fhir/CodeSystem/read-access-tag",
                "code": "ALL"
            }
        ]
    },
    "url": "urn:uuid:a67b655b-ab65-46d2-aef1-c070ee28573e",
    "version": "1.0.0",
    "name": "Retrieve",
    "status": "active",
    "type": {
        "coding": [
            {
                "system": "http://terminology.hl7.org/CodeSystem/library-type",
                "code": "logic-library"
            }
        ]
    },
    "content": [
        {
            "contentType": "text/cql",
            "data": "bGlicmFyeSBSZXRyaWV2ZSB2ZXJzaW9uICcxLjAuMCcKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMCcKaW5jbHVkZSBGSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMCcKCmNvbnRleHQgUGF0aWVudAoKZGVmaW5lIENyaXRlcmlvbjoKICBQYXRpZW50LmdlbmRlciA9ICdmZW1hbGUnCgpkZWZpbmUgSW5Jbml0aWFsUG9wdWxhdGlvbjoKICBDcml0ZXJpb24K"
        },
        {
            "contentType": "application/json",
            "data": "eyJ2ZXJzaW9uIjoiaHR0cDovL3RvX2JlX2RlY2lkZWQuY29tL2RyYWZ0LTEvc2NoZW1hIyIsImluY2x1c2lvbkNyaXRlcmlhIjpbW3siY29udGV4dCI6eyJjb2RlIjoiUGF0aWVudCIsInN5c3RlbSI6ImZkcGcubWlpLmNkcyIsInZlcnNpb24iOiIxLjAuMCIsImRpc3BsYXkiOiJQYXRpZW50In0sInRlcm1Db2RlcyI6W3siY29kZSI6IjI2MzQ5NTAwMCIsInN5c3RlbSI6Imh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJkaXNwbGF5IjoiR2VzY2hsZWNodCJ9XSwidmFsdWVGaWx0ZXIiOnsidHlwZSI6ImNvbmNlcHQiLCJzZWxlY3RlZENvbmNlcHRzIjpbeyJjb2RlIjoiZmVtYWxlIiwic3lzdGVtIjoiaHR0cDovL2hsNy5vcmcvZmhpci9hZG1pbmlzdHJhdGl2ZS1nZW5kZXIiLCJkaXNwbGF5IjoiRmVtYWxlIn1dfX1dXSwiZGlzcGxheSI6IkF1c2dld8OkaGx0ZSBNZXJrbWFsZSJ9"
        }
    ]
}

@alexanderkiel the content type would also be "application/json" or should it be something like "application/crtdl+json" analogous to flare?

juliangruendner commented 4 days ago

@Lucas0T example Library with encoded crtdl

{
    "resourceType": "Library",
    "id": "606aceec-264b-494d-8291-15121314188e",
    "meta": {
        "versionId": "1",
        "lastUpdated": "2024-07-15T07:14:50.192+02:00",
        "profile": [
            "http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-library"
        ],
        "tag": [
            {
                "system": "http://dsf.dev/fhir/CodeSystem/read-access-tag",
                "code": "ALL"
            }
        ]
    },
    "url": "urn:uuid:a67b655b-ab65-46d2-aef1-c070ee28573e",
    "version": "1.0.0",
    "name": "Retrieve",
    "status": "active",
    "type": {
        "coding": [
            {
                "system": "http://terminology.hl7.org/CodeSystem/library-type",
                "code": "logic-library"
            }
        ]
    },
    "content": [
        {
            "contentType": "application/crtdl+json",
            "data": "ewogICAgInZlcnNpb24iOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy90by1iZS1kb25lL3NjaGVtYSMiLAogICAgImRpc3BsYXkiOiAiIiwKICAgICJjb2hvcnREZWZpbml0aW9uIjogewogICAgICAidmVyc2lvbiI6ICJodHRwOi8vdG9fYmVfZGVjaWRlZC5jb20vZHJhZnQtMS9zY2hlbWEjIiwKICAgICAgImRpc3BsYXkiOiAiIiwKICAgICAgImluY2x1c2lvbkNyaXRlcmlhIjogWwogICAgICAgIFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJ0ZXJtQ29kZXMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICJjb2RlIjogIjQyNDE0NDAwMiIsCiAgICAgICAgICAgICAgICAgICJzeXN0ZW0iOiAiaHR0cDovL3Nub21lZC5pbmZvL3NjdCIsCiAgICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIkdlZ2Vud8OkcnRpZ2VzIGNocm9ub2xvZ2lzY2hlcyBBbHRlciIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICJjb250ZXh0IjogewogICAgICAgICAgICAgICAgImNvZGUiOiAiUGF0aWVudCIsCiAgICAgICAgICAgICAgICAic3lzdGVtIjogImZkcGcubWlpLmNkcyIsCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCiAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICJQYXRpZW50IgogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgInZhbHVlRmlsdGVyIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAicXVhbnRpdHktY29tcGFyYXRvciIsCiAgICAgICAgICAgICAgICAidW5pdCI6IHsKICAgICAgICAgICAgICAgICAgImNvZGUiOiAiYSIsCiAgICAgICAgICAgICAgICAgICJkaXNwbGF5IjogImEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInZhbHVlIjogMTgsCiAgICAgICAgICAgICAgICAiY29tcGFyYXRvciI6ICJndCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAidGVybUNvZGVzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiY29kZSI6ICIyNjM0OTUwMDAiLAogICAgICAgICAgICAgICAgICAic3lzdGVtIjogImh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLAogICAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICJHZXNjaGxlY2h0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgImNvbnRleHQiOiB7CiAgICAgICAgICAgICAgICAiY29kZSI6ICJQYXRpZW50IiwKICAgICAgICAgICAgICAgICJzeXN0ZW0iOiAiZmRwZy5taWkuY2RzIiwKICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIlBhdGllbnQiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAidmFsdWVGaWx0ZXIiOiB7CiAgICAgICAgICAgICAgICAic2VsZWN0ZWRDb25jZXB0cyI6IFsKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJjb2RlIjogImZlbWFsZSIsCiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiRmVtYWxlIiwKICAgICAgICAgICAgICAgICAgICAic3lzdGVtIjogImh0dHA6Ly9obDcub3JnL2ZoaXIvYWRtaW5pc3RyYXRpdmUtZ2VuZGVyIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInR5cGUiOiAiY29uY2VwdCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAidGVybUNvZGVzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiY29kZSI6ICI4LTkxOCIsCiAgICAgICAgICAgICAgICAgICJzeXN0ZW0iOiAiaHR0cDovL2ZoaXIuZGUvQ29kZVN5c3RlbS9iZmFybS9vcHMiLAogICAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIyMDIzIiwKICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiSW50ZXJkaXN6aXBsaW7DpHJlIG11bHRpbW9kYWxlIFNjaG1lcnp0aGVyYXBpZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICJjb250ZXh0IjogewogICAgICAgICAgICAgICAgImNvZGUiOiAiUHJvY2VkdXJlIiwKICAgICAgICAgICAgICAgICJzeXN0ZW0iOiAiZmRwZy5taWkuY2RzIiwKICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIlByb3plZHVyIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgXQoKICAgICAgXSwKICAgICAgICAiZGF0YUV4dHJhY3Rpb24iOiB7CiAgICAgICAgICAiYXR0cmlidXRlR3JvdXBzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImdyb3VwUmVmZXJlbmNlIjogImh0dHBzOi8vd3d3Lm1lZGl6aW5pbmZvcm1hdGlrLWluaXRpYXRpdmUuZGUvZmhpci9jb3JlL21vZHVsLWxhYm9yL1N0cnVjdHVyZURlZmluaXRpb24vT2JzZXJ2YXRpb25MYWIiLAogICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiYXR0cmlidXRlUmVmIjogIk9ic2VydmF0aW9uLmNvZGUiLAogICAgICAgICAgICAgICAgICAibXVzdEhhdmUiOiBmYWxzZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZVJlZiI6ICJPYnNlcnZhdGlvbi52YWx1ZSIsCiAgICAgICAgICAgICAgICAgICJtdXN0SGF2ZSI6IHRydWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICJmaWx0ZXIiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRva2VuIiwKICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29kZSIsCiAgICAgICAgICAgICAgICAgICJjb2RlcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAiY29kZSI6ICI3MTgtNyIsCiAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtIjogImh0dHA6Ly9sb2luYy5vcmciLAogICAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiSGVtb2dsb2JpbiBbTWFzcy92b2x1bWVdIGluIEJsb29kIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiAiMzM1MDktMSIsCiAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtIjogImh0dHA6Ly9sb2luYy5vcmciLAogICAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiSGVtb2dsb2JpbiBbTWFzcy92b2x1bWVdIGluIEJvZHkgZmx1aWQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAidHlwZSI6ICJkYXRlIiwKICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZGF0ZSIsCiAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDIxLTA5LTA5IiwKICAgICAgICAgICAgICAgICAgImVuZCI6ICIyMDIxLTEwLTA5IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXQogICAgICAgIH0KICAgIH0KfQo="
        }
    ]
}