Esta página explica como gerir recursos FHIR executando pacotes FHIR, que são uma coleção de recursos FHIR e operações a realizar nesses recursos FHIR.
O método
ExecuteBundle
implementa a interação de lote/transação padrão FHIR
(DSTU2,
STU3,
R4,
e R5) e as operações de histórico.
Pacotes FHIR
Um pacote FHIR contém uma matriz de entradas, cada uma das quais representa uma operação, como criar, atualizar ou eliminar, num recurso, como uma observação ou um paciente. Consulte as descrições detalhadas dos elementos no recurso Bundle.
Quando executa um pacote FHIR, o tipo de pacote determina a forma como as operações no pacote são realizadas. Estão disponíveis os seguintes tipos de pacotes:
batch
: executa as operações como vários pedidos independentes.transaction
: executa as operações como vários pedidos que dependem uns dos outros.history
: insere as entradas no histórico de um recurso.
Por exemplo, suponhamos que um pacote de transações inclui a criação de um recurso Patient e um recurso Observation. Se o pedido de criação do recurso Patient falhar, o recurso Observation não é criado.
Se uma operação falhar quando o tipo de pacote é batch
, a API Cloud Healthcare executa as operações restantes no pacote. Se uma operação falhar quando o tipo de pacote for transaction
, a Cloud Healthcare API para de executar operações e reverte a transação.
Pacotes de histórico
Os pacotes de histórico são extensões personalizadas à norma FHIR que suportam exemplos de utilização de cópia de segurança e restauro, como a sincronização. Pode usar history bundles para inserir ou substituir versões de recursos no histórico de um recurso FHIR. Só pode remover versões de recursos através do método Resource-purge
. O pacote history
é executado como uma única transação com um limite de 100 entradas por pacote. Se uma versão de recurso no pacote history
tiver uma data/hora superior à versão mais recente na loja FHIR, a versão mais recente é atualizada em conformidade. Se o pacote history
for inserido com êxito, é devolvida uma resposta vazia. Caso contrário, é devolvido um OperationOutcome
a descrever a falha.
A compatibilidade com pacotes de histórico não está ativada por predefinição. Um administrador da FHIR store tem de definir enableHistoryModifications
como true
na configuração da FHIR store.
Não pode usar pacotes de histórico se disableResourceVersioning
estiver definido como true
na configuração da loja FHIR.
Os pacotes de histórico são fornecidos no mesmo formato em que são devolvidos pelo método
fhir.history
. Para ser válida, cada entrada do pacote requer um ID do recurso, uma indicação de tempo de modificação e um estado. Além disso, todas as entradas têm de ter o mesmo ID do recurso. O ID do recurso é fornecido com o campo resource.id
ou o campo request.url
. Se forem fornecidos campos, o ID do recurso indicado tem de ser o mesmo. A data/hora do recurso é fornecida com o campo meta.lastUpdated
no recurso ou o campo response.lastModified
.
Conceder autorizações para executar pacotes
A função de autorização datasets.fhirStores.fhir.executeBundle
é necessária para
executar pacotes. Para conceder esta autorização, use a função healthcare.fhirResourceReader
. Para ver os passos para conceder esta autorização,
consulte o artigo Modificar uma política.
Para executar pacotes de histórico, também é necessária a função de autorização datasets.fhirStores.fhir.import
.
A API Cloud Healthcare verifica as autorizações de cada operação no pacote.
Se tiver a autorização healthcare.fhirResources.create
, mas não a autorização healthcare.fhirResources.update
, só pode executar pacotes que contenham operações healthcare.fhirResources.create
.
Executar um pacote
Para executar um pacote FHIR, use o método
projects.locations.datasets.fhirStores.fhir.executeBundle
.
Nos exemplos seguintes, BUNDLE.json é o caminho e o nome do ficheiro de um pacote FHIR codificado em JSON. Também pode incluir o pacote no corpo do pedido.
O exemplo de pacote seguinte cria um recurso Patient e elimina outro recurso Patient:
{
"resourceType": "Bundle",
"id": "bundle-transaction",
"meta": {
"lastUpdated": "2018-03-11T11:22:16Z"
},
"type": "transaction",
"entry": [
{
"resource": {
"resourceType": "Patient",
"name": [
{
"family": "Smith",
"given": [
"Darcy"
]
}
],
"gender": "female",
"address": [
{
"line": [
"123 Main St."
],
"city": "Anycity",
"state": "CA",
"postalCode": "12345"
}
]
},
"request": {
"method": "POST",
"url": "Patient"
}
},
{
"request": {
"method": "DELETE",
"url": "Patient/1234567890"
}
}
]
}
Os exemplos seguintes mostram como executar um pacote.
curl
Para executar um pacote, faça um pedido POST
e especifique as seguintes informações:
- O nome e a localização do conjunto de dados principal e da loja FHIR
- A localização do ficheiro do pacote na sua máquina local
- Uma chave de acesso
O exemplo seguinte mostra um pedido POST
através do curl:
curl -X POST \ -H "Content-Type: application/fhir+json; charset=utf-8" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ --data @BUNDLE_FILE.json \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"
Independentemente do resultado das operações individuais, após a execução de um pacote
em lote, o servidor devolve uma representação codificada em JSON de um recurso
do tipo batch-response
.Bundle
O recurso Bundle
contém uma entrada para cada entrada no pedido com o resultado do processamento da entrada, que pode ser uma combinação de resultados de êxito e de erro.
Se um pacote de transações for bem-sucedido, o servidor devolve uma representação codificada em JSON de um recurso Bundle
do tipo transaction-response
que contém uma entrada para cada entrada no pedido com o resultado bem-sucedido da operação.
Se ocorrer um erro durante a execução de um pacote de transações, o corpo da resposta não contém um pacote. Em alternativa, contém um recurso codificado em JSON que descreve o motivo do erro.OperationOutcome
As operações bem-sucedidas que foram revertidas não são comunicadas na resposta.
O seguinte pacote de exemplo é o resultado da execução bem-sucedida do exemplo acima. A primeira entrada indica o êxito da operação para criar um paciente e inclui o ID do novo recurso. A segunda entrada indica o êxito da operação de eliminação.
{ "entry": [ { "response": { "location": projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/RESOURCE/RESOURCE_ID, "status": "201 Created" } }, { "response": { "status": "200 OK" } } ], "resourceType": "Bundle", "type": "transaction-response" }
PowerShell
Para executar um pacote, faça um pedido POST
e especifique as seguintes informações:
- O nome e a localização do conjunto de dados principal e da loja FHIR
- A localização do ficheiro do pacote na sua máquina local
- Uma chave de acesso
O exemplo seguinte mostra um pedido POST
através do Windows PowerShell:
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-RestMethod ` -Method Post ` -Headers $headers ` -ContentType: "application/fhir+json" ` -InFile BUNDLE_FILE.json ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir" | ConvertTo-Json
Independentemente do resultado das operações individuais, após a execução de um pacote
em lote, o servidor devolve uma representação codificada em JSON de um recurso
do tipo batch-response
.Bundle
O recurso Bundle
contém uma entrada para cada entrada no pedido com o resultado do processamento da entrada, que pode ser uma combinação de resultados de êxito e de erro.
Se um pacote de transações for bem-sucedido, o servidor devolve uma representação codificada em JSON de um recurso Bundle
do tipo transaction-response
que contém uma entrada para cada entrada no pedido com o resultado bem-sucedido da operação.
Se ocorrer um erro durante a execução de um pacote de transações, o corpo da resposta não contém um pacote. Em alternativa, contém um recurso codificado em JSON que descreve o motivo do erro.OperationOutcome
As operações bem-sucedidas que foram revertidas não são comunicadas na resposta.
O seguinte pacote de exemplo é o resultado da execução bem-sucedida do exemplo acima. A primeira entrada indica o êxito da operação para criar um paciente e inclui o ID do novo recurso. A segunda entrada indica o êxito da operação de eliminação.
{ "entry": [ { "response": { "etag": "ETAG", "lastModified": "2020-08-03T04:12:47.312669+00:00", "location": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/RESOURCE/RESOURCE_ID", "status": "201 Created" } }, { "response": { "etag": "ETAG", "lastModified": "2020-08-03T04:12:47.312669+00:00", "status": "200 OK" } } ], "resourceType": "Bundle", "type": "transaction-response" }
Go
Java
Node.js
Está disponível um ficheiro de pacote de exemplo no repositório do GitHub do exemplo de código.
Python
Está disponível um ficheiro de pacote de exemplo no repositório do GitHub do exemplo de código.
Fazer um PATCH
pedido
Pode usar pacotes FHIR para fazer pedidos PATCH
JSON em recursos FHIR.
Consulte o artigo Executar um pedido PATCH
num pacote FHIR
para mais informações.
Resolver referências a recursos criados num pacote
Os recursos num pacote de transações podem conter referências a recursos que não existem no sistema de destino, mas são criados durante a execução do pacote. A API Cloud Healthcare resolve a associação entre os recursos através do campo entry.fullUrl
. As referências que correspondem ao valor entry.fullUrl
de outro recurso no pacote são reescritas para o ID do recurso correspondente na loja. Esta ação é bem-sucedida independentemente da ordem das operações no pacote.
A Cloud Healthcare API aceita o fullUrl
nos seguintes formatos:
urn:uuid:UUID
urn:oid:OID
- qualquer URL
- um nome de recurso no formato
RESOURCE_TYPE/RESOURCE_ID
, comoPatient/123
. A utilização deste formato não é recomendada porquefullUrl
é um marcador de posição local para o pacote. Isto pode criar confusão se um recurso na loja tiver o mesmo nome, mas o recurso no pacote for resolvido para um nome diferente como resultado de uma operação de criação.
O pacote de exemplo seguinte cria um recurso Patient e um recurso Observation que faz referência ao recurso Patient.
{
"resourceType": "Bundle",
"type": "transaction",
"entry":[
{
"request": {
"method":"POST",
"url":"Patient"
},
"fullUrl": "urn:uuid:05efabf0-4be2-4561-91ce-51548425acb9",
"resource": {
"resourceType":"Patient",
"gender":"male"
}
},
{
"request": {
"method":"POST",
"url":"Observation"
},
"resource": {
"resourceType":"Observation",
"subject": {
"reference": "urn:uuid:05efabf0-4be2-4561-91ce-51548425acb9"
},
"status":"preliminary",
"code": {
"text":"heart rate"
}
}
}
]
}
Os exemplos seguintes mostram como executar um pacote.
curl
Está disponível um ficheiro de pacote de exemplo no repositório do GitHub do exemplo de código.
Para executar um pacote, faça um pedido POST e especifique as seguintes informações:
- O nome e a localização do conjunto de dados principal e da loja FHIR
- A localização do ficheiro do pacote no Cloud Storage
- Uma chave de acesso
O exemplo seguinte mostra um pedido POST
através do curl:
curl -X POST \ -H "Content-Type: application/fhir+json; charset=utf-8" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ --data @BUNDLE_FILE.json \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"
O seguinte pacote de exemplo é o resultado da execução bem-sucedida do exemplo acima. A primeira entrada indica o êxito da operação para criar um paciente e inclui o ID do novo recurso. A segunda entrada indica o êxito da operação para criar a Observation e inclui o ID do novo recurso.
{ "entry": [ { "response": { "etag": "ETAG1", "lastModified": "2020-08-04T16:14:14.273976+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/datasets/REGION/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_ID/_history/HISTORY_ID", "status": "201 Created" } }, { "response": { "etag": "ETAG", "lastModified": "2020-08-04T16:14:14.273976+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/datasets/REGION/fhirStores/FHIR_STORE_ID/fhir/Observation/OBSERVATION_ID/_history/HISTORY_ID", "status": "201 Created" } } ], "resourceType": "Bundle", "type": "transaction-response" }
PowerShell
Está disponível um ficheiro de pacote de exemplo no repositório do GitHub do exemplo de código.
Para executar um pacote, faça um pedido POST e especifique as seguintes informações:
- O nome e a localização do conjunto de dados principal e da loja FHIR
- A localização do ficheiro do pacote no Cloud Storage
- Uma chave de acesso
O exemplo seguinte mostra um pedido POST
através do Windows PowerShell:
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-RestMethod ` -Method Post ` -Headers $headers ` -ContentType: "application/fhir+json" ` -InFile BUNDLE_FILE.json ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir" | ConvertTo-Json
O seguinte pacote de exemplo é o resultado da execução bem-sucedida do exemplo acima. A primeira entrada indica o êxito da operação para criar um paciente e inclui o ID do novo recurso. A segunda entrada indica o êxito da operação para criar a Observation e inclui o ID do novo recurso.
{ "entry": [ { "response": { "etag": "ETAG1", "lastModified": "2020-08-04T16:14:14.273976+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/datasets/REGION/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_ID/_history/HISTORY_ID", "status": "201 Created" } }, { "response": { "etag": "ETAG", "lastModified": "2020-08-04T16:14:14.273976+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/datasets/REGION/fhirStores/FHIR_STORE_ID/fhir/Observation/OBSERVATION_ID/_history/HISTORY_ID", "status": "201 Created" } } ], "resourceType": "Bundle", "type": "transaction-response" }