Search code examples
hl7-fhir

FHIR: Extending the Basic resource with extensions


I'm an absolute FHIR newbie and I'm trying to create a set of StructureDefinitions and examples for an upcoming medical project.

For this project, we need a very specific resource, which is not supported by any FHIR resource yet. Here's our use case:

We are placing sensors on our Patients while they execute certain exercises (e.g. a leg squat) - we capture the sensor measurements and based on those we assign a pre-calculated bio-mechanical body model to each individual Patient. Those body models are calculated and assigned somewhere else in our system (this process is not relevant here). In a first step, I would like to add all the pre-calculated body models itself to our FHIR dataset as resources - so that I'm able to output all existing body models in our system.

Such a body model consists of an unique identifier, a human readable title and a set of attributes which describe the body model. The crucial part are the attributes - those might vary for each body model and we don't know the set of possible attributes beforehand, hence I need a dynamic format representing key and value of each attribute. If I were to represent this in a simple json structure I'd look as follows:

{
    "id": "0",
    "title": "SAMPLE_BODY_MODEL",
    "attributes": [
        {
            "key": "ATTRIBUTE_1",
            "value": "EXAMPLE_1"
        },
        {
            "key": "ATTRIBUTE_2",
            "value": "EXAMPLE_2"
        }
    ]
}

My goal now is to create a StructureDefinition corresponding to the custom resource I've described above.

Hence I looked up the topic of "custom resources" and found this article on the HL7 site: https://hl7.org/fhir/basic.html - explaining that the Basic resource should be used for custom resources.

So I went ahead and tried to create a basic resource and extending it:

{
    "resourceType": "StructureDefinition",
    ...
    "type": "Basic",
    "differential": {
        "element": [
            {
                "id" : "Basic",
                "path": "Basic",
                "definition": "This element describes a general body model captured during an exercise or a movement, e.g. whilst doing leg squats."
            },
            {
                "id" : "Basic.id",
                "path": "Basic.id",
                "definition": "ID of the body model"
            }
            {
                "id": "Basic.extension:title",
                "path": "Basic.extension",
                "sliceName": "definition",
                "definition": "Title of the body model",
                "min": 0,
                "max": "1",
                "type":  [
                    {
                        "code": "string" // I know that's wrong, but I somehow would like to restrict this to a string only
                    }
                ]
            },
            {
                "id": "Basic.extension:attributes",
                "path": "Basic.extension",
                "sliceName": "attributes",
                "definition": "Attributes of the body model",
                // This is where I'm stuck - how do I define this to be a list of objects consisting of attributes key and value?
            }
        ]
    }
}

To sum it all up: How do I create a new StructureDefinition from a basic resource allowing me to specify a new required attribute named "attributes", which consists of one-to-many elements, which again contain the attributes key and value for the key and value of the body model attributes?

Hope this makes sense - otherwise please feel free to let me know and I'll try to rephrase my question.

Many thanks in advance!


Solution

  • First, for a newbie, you're doing really well :) (And nice job on framing the question well too!)

    Your first extension slice has a few issues:

    • sliceName should be "title", not "definition" - essentially the 'extra' bit in the id is the slicename
    • The 'type' needs to be Extension. (The type of all extensions is always Extension.) However, you should also specify a specific profile on Extension that indicates the canonical URL the StructureDefinition you've used to define the 'title' extension. That extension will have a context of Basic and will constrain extension.value[x] to be of type string and will also establish a fixed URL for extension.url.

    Your second slice will be similar. However, the profile on extension it points to won't constrain extension.value. Instead, it'll slice extension.extension to have two slices, one with a fixed url of "name" and the other with a fixed url of "value". There's an example here of a 2-element complex extension. Your slice names and data types will differ, as will the context, but it should make a good model for you.

    If you still have issues, add your revised version to your question and we'll see if we can help further.