Extensões FHIR

Esta página explica como a Cloud Healthcare API suporta extensões FHIR.

Vista geral

O FHIR permite extensões definidas pelo utilizador em recursos e tipos de dados. A API Cloud Healthcare suporta o armazenamento e a obtenção destas extensões.

Valores das extensões

Um elemento de extensão é um par de chave-valor. A chave, armazenada no campo url, indica o URL canónico de uma definição de extensão que define o conteúdo e o significado da extensão. O campo value é um elemento de escolha que pode conter muitos tipos de dados FHIR diferentes.

Este mecanismo é o mesmo em todas as versões da FHIR, exceto que as versões anteriores têm menos tipos de dados disponíveis. Pode encontrar os tipos de dados disponíveis para extensões na norma FHIR (DSTU2, STU3, R4).

O exemplo seguinte mostra um recurso Patient com duas extensões, cor do cabelo e cidadania, no elemento raiz:

{
  "resourceType": "Patient",
  "active": true,
  "gender": "male",
  "extension": [
    {
      "url": "http://example.com/fhir/StructureDefinition/hair-color",
      "valueString": "brown"
    },
    {
      "url": "http://example.com/fhir/StructureDefinition/patient-citizenship",
      "valueCodeableConcept": {
        "coding" : [{
          "system" : "urn:iso:std:iso:3166",
          "code" : "US"
        }]
      }
    }
  ]
}

Os tipos de dados complexos e os elementos com campos secundários também podem ter extensões. Por exemplo, este Patient contém uma extensão no campo identifier, que é um tipo de dados complexo, e uma extensão no campo communication, que tem outros campos secundários:

{
  "resourceType": "Patient",
  "active": true,
  "gender": "male",
  "identifier": [
    "system": "MRN",
    "value": "AB1234",
    "extension": [
      {
        "url": "http://example.com/fhir/StructureDefinition/last-verified",
        "valueDateTime": "2021-01-01T00:00:00Z"
      }
    ]
  ],
  "communication": [
    {
      "language": {
        "coding": [{
          "system": "urn:iso:std:iso:639",
          "code": "EN"
        }]
      },
      "extension": [
        {
          "url": "http://example.com/fhir/StructureDefinition/fluency-level",
          "valueInteger": 7
        }
      ]
    }
  ]
}

Cada elemento de extensão só pode ter um campo de valor único. Para definir uma extensão que contenha uma matriz de valores, tem de definir vários elementos de extensão com o mesmo url.

Não pode definir extensões no elemento raiz para os seguintes tipos de recursos:

  • Binary
  • Bundle
  • Parameters

Extensões complexas

As extensões podem conter extensões para definir uma estrutura aninhada. O url nome da extensão secundária é relativo à extensão exterior. Cada elemento de extensão tem de ter um elemento de valor ou uma extensão secundária aninhada, mas não ambos.

O exemplo seguinte mostra um recurso Patient que contém uma extensão patient-citizenship complexa com extensões secundárias code e period:

{
  "resourceType": "Patient",
  "extension": [
    {
      "url": "http://hl7.org/fhir/StructureDefinition/patient-citizenship",
      "extension": [
        {
          "url": "code",
          "valueCodeableConcept": {
            "coding": [{
              "system": "urn:iso:std:iso:3166",
              "code": "CA"
            }]
           }
        },
        {
          "url": "period",
          "valuePeriod": {
            "start": "2010-01-01"
          }
        }
      ]
      }
  ]
}

Extensões em tipos primitivos

Os tipos de dados primitivos no FHIR também podem ter extensões. Quando representadas no formato JSON, as extensões são representadas numa propriedade JSON adicional com _ anteposto ao nome do elemento primitivo, conforme definido na representação JSON do FHIR.

O exemplo seguinte, no formato JSON, mostra um recurso Patient com uma extensão no campo birthDate:

{
  "resourceType": "Patient",
  "active": true,
  "gender": "male",
  "birthDate": "1970-01-01",
  "_birthDate": {
    "extension": [
      {
        "url": "http://example.com/fhir/StructureDefinition/date-type",
        "valueString": "A"
      }
    ]
  }
}

Se o elemento primitivo for repetido, a propriedade com _ também é processada como uma matriz, com valores nulos usados para alinhar os valores de extensão com os respetivos primitivos correspondentes.

O exemplo seguinte mostra um recurso Patient com uma extensão no segundo valor de name.given, mas sem extensão no primeiro valor:

{
  "resourceType": "Patient",
  "name": {
    "given": [
      "ABC",
      "DEF"
    ],
    "_given": [
      null,
      {
        "extension": [
          {
            "url": "http://hl7.org/fhir/StructureDefinition/display",
            "valueString": "XYZ"
          }
        ]
      }
    ]
  }
}

Definir uma extensão com um StructureDefinition

Para fins de interoperabilidade, o nome e o significado de uma extensão podem ser definidos com um recurso StructureDefinition que pode ser publicado ou distribuído para permitir que os consumidores dos dados os interpretem. Isto é opcional quando usa extensões na Cloud Healthcare API.

A identidade desta definição é indicada pelo URL canónico no campo "url". Para todos os dados trocados entre organizações, é recomendável usar um URL que os consumidores de dados possam seguir para obter o StructureDefinition. A API Cloud Healthcare não valida este URL nem tenta resolvê-lo.

O conteúdo de um recurso StructureDefinition pode ser complexo e é frequentemente definido através de ferramentas para criar perfis FHIR.

Extensões de modificadores

As extensões de modificadores são semelhantes às extensões, mas são armazenadas no campo modifierExtension. Uma extensão de modificador são dados adicionais que não podem ser ignorados porque podem invalidar a interpretação do elemento que os contém.

Por exemplo, uma extensão de modificador pode indicar que o paciente não tem a condição especificada ou que um medicamento não deve ser prescrito.

A Cloud Healthcare API armazena e obtém extensões de modificadores, mas não tenta interpretar o respetivo significado. Recomendamos que as aplicações tomem as medidas adequadas quando encontrarem uma extensão de modificador que não compreendem, possivelmente apresentando um aviso ou rejeitando o recurso na totalidade. Os implementadores devem evitar a utilização de extensões de modificadores sempre que possível.