Extensões FHIR

Nesta página, explicamos como a API Cloud Healthcare oferece suporte a extensões FHIR.

Visão geral

O FHIR permite extensões definidas pelo usuário em recursos e tipos de dados. A API Cloud Healthcare é oferece suporte ao armazenamento e à recuperação dessas extensões.

Valores de extensão

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 opção que pode conter muitos tipos de dados do FHIR diferentes.

Esse mecanismo é o mesmo em todas as versões do FHIR, mas as versões anteriores têm menos tipos de dados disponíveis. Os tipos de dados disponíveis para extensões podem ser encontrados no padrão FHIR (DSTU2, STU3, R4).

O exemplo a seguir 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"
        }]
      }
    }
  ]
}

Tipos de dados complexos e elementos com campos filhos 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 filhos:

{
  "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 pode ter apenas um campo de valor. Para definir uma extensão que tenha uma matriz de valores, defina vários elementos de extensão com o mesmo url.

Não é possível 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 nome url da extensão filha é relativo à extensão externa. Cada elemento de extensão precisa ter um elemento de valor ou uma extensão filha aninhada, mas não ambos.

O exemplo a seguir mostra um recurso Patient que tem uma extensão patient-citizenship complexa com extensões filhas 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 em outra propriedade JSON com _ anexado ao nome do elemento primitivo, conforme definido na representação JSON do FHIR.

No exemplo a seguir, no formato JSON, mostramos 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 será processada como uma matriz, com valores nulos, usados para alinhar os valores de extensão com os primitivos correspondentes.

No exemplo a seguir, mostramos um recurso Patient com uma extensão no segundo valor de name.given, mas nenhuma extensão no primeiro valor:

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

Como 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. Isso é opcional ao usar extensões na API Cloud Healthcare.

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

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

Extensões modificadoras

Extensões modificadoras são semelhantes a extensões, mas são armazenadas no campo modifierExtension. Uma extensão modificadora é o dado adicional que não pode ser ignorado porque pode invalidar a interpretação do elemento que o contém.

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

A API Cloud Healthcare armazena e recupera extensões modificadoras, mas não tenta interpretar o significado delas. Recomendamos que sejam adotadas medidas adequadas pelos aplicativos ao encontrar uma extensão modificadora que eles não entendam, possivelmente exibindo um aviso ou rejeitando completamente o recurso. Os implementadores precisam evitar o uso de extensões modificadoras sempre que possível.