Mengelola resource FHIR menggunakan paket FHIR

Halaman ini menjelaskan cara mengelola resource FHIR dengan mengeksekusi paket FHIR, yang merupakan kumpulan resource dan operasi FHIR untuk dijalankan pada resource FHIR tersebut.

Metode ExecuteBundle mengimplementasikan interaksi batch/transaksi standar FHIR (DSTU2, STU3, dan R4) serta operasi histori.

Paket FHIR

Paket FHIR berisi array entri, yang masing-masing mewakili operasi, seperti membuat, mengupdate, atau menghapus, pada resource, seperti Pengamatan atau Pasien. Lihat deskripsi mendetail untuk elemen dalam resource Bundle.

Saat Anda menjalankan paket FHIR, jenis paket menentukan cara operasi dalam paket dijalankan. Berikut jenis paket yang tersedia:

  • batch: menjalankan operasi sebagai beberapa permintaan independen.
  • transaction: menjalankan operasi sebagai beberapa permintaan yang bergantung satu sama lain.
  • history: menyisipkan entri ke dalam histori resource.

Misalnya, anggaplah paket transaksi mencakup pembuatan resource Pasien dan resource Observation. Jika permintaan pembuatan resource Pasien gagal, resource Observation tidak akan dibuat.

Jika operasi gagal saat jenis paket adalah batch, Cloud Healthcare API menjalankan operasi yang tersisa dalam paket. Jika operasi gagal saat jenis paket adalah transaction, Cloud Healthcare API akan berhenti menjalankan operasi dan me-roll back transaksi.

Paket histori

Paket histori adalah ekstensi kustom untuk standar FHIR yang mendukung kasus penggunaan pencadangan dan pemulihan, seperti sinkronisasi. Anda dapat menggunakan paket histori untuk menyisipkan atau mengganti versi resource dalam histori resource FHIR. Anda hanya dapat menghapus versi resource menggunakan metode Resource-purge. Paket history dijalankan sebagai transaksi tunggal dengan batas 100 entri per paket. Jika versi resource dalam paket history memiliki stempel waktu yang lebih besar daripada versi terbaru di penyimpanan FHIR, maka versi terbaru akan diupdate. Jika paket history berhasil disisipkan, respons kosong akan ditampilkan. Jika tidak, OperationOutcome akan ditampilkan yang menjelaskan kegagalan.

Dukungan untuk paket histori tidak diaktifkan secara default. Administrator penyimpanan FHIR harus menetapkan enableHistoryModifications ke true pada konfigurasi penyimpanan FHIR. Anda tidak dapat menggunakan paket histori jika disableResourceVersioning ditetapkan ke true pada konfigurasi penyimpanan FHIR.

Paket histori disediakan dalam format yang sama dengan yang ditampilkan dari metode fhir.history. Agar valid, setiap entri paket memerlukan ID resource, stempel waktu perubahan, dan status. Selain itu, semua entri harus memiliki ID resource yang sama. ID resource disediakan dengan kolom resource.id atau kolom request.url. Jika kolom diberikan, ID resource yang diberikan sama. Stempel waktu resource disediakan dengan kolom meta.lastUpdated dalam resource atau kolom response.lastModified.

Memberikan izin untuk menjalankan paket

Peran izin datasets.fhirStores.fhir.executeBundle diperlukan untuk menjalankan paket. Untuk memberikan izin ini, gunakan peran healthcare.fhirResourceReader. Untuk mengetahui langkah-langkah dalam memberikan izin ini, lihat Mengubah kebijakan.

Untuk menjalankan paket histori, peran izin datasets.fhirStores.fhir.import juga diperlukan.

Cloud Healthcare API memeriksa izin untuk setiap operasi dalam paket. Jika memiliki izin healthcare.fhirResources.create tetapi tidak memiliki izin healthcare.fhirResources.update, Anda hanya dapat menjalankan paket yang berisi operasi healthcare.fhirResources.create.

Menjalankan paket

Untuk menjalankan paket FHIR, gunakan metode projects.locations.datasets.fhirStores.fhir.executeBundle.

Dalam contoh berikut, BUNDLE.json adalah jalur dan nama file untuk paket FHIR berenkode JSON. Anda juga dapat menyertakan paket dalam isi permintaan.

Contoh Paket berikut membuat resource Pasien dan menghapus resource Pasien lainnya:

{
  "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"
      }
    }
  ]
}

Contoh berikut menunjukkan cara mengeksekusi paket.

curl

Untuk menjalankan paket, buat permintaan POST dan tentukan informasi berikut:

  • Nama dan lokasi set data induk dan penyimpanan FHIR
  • Lokasi file paket di komputer lokal Anda
  • Token akses

Contoh berikut menunjukkan permintaan POST menggunakan 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"

Terlepas dari hasil operasi individual, setelah mengeksekusi paket batch, server akan menampilkan representasi yang dienkode JSON dari resource Bundle jenis batch-response. Resource Bundle berisi satu entri untuk setiap entri dalam permintaan dengan hasil pemrosesan entri, yang dapat berupa campuran hasil sukses dan error.

Jika paket transaksi berhasil, server akan menampilkan representasi yang dienkode JSON dari resource Bundle jenis transaction-response yang berisi satu entri untuk setiap entri dalam permintaan dengan hasil operasi yang sukses.

Jika terjadi error saat menjalankan paket transaksi, isi respons tidak berisi paket. Sebagai gantinya, file ini berisi resource OperationOutcome berenkode JSON yang menjelaskan alasan terjadinya error. Operasi yang berhasil dan di-roll back tidak dilaporkan dalam respons.

Paket contoh berikut adalah output dari keberhasilan mengeksekusi contoh di atas. Entri pertama menunjukkan keberhasilan operasi untuk membuat Patient dan menyertakan ID resource baru. Entri kedua menunjukkan keberhasilan operasi penghapusan.

{
  "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

Untuk menjalankan paket, buat permintaan POST dan tentukan informasi berikut:

  • Nama dan lokasi set data induk dan penyimpanan FHIR
  • Lokasi file paket di komputer lokal Anda
  • Token akses

Contoh berikut menunjukkan permintaan POST menggunakan 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

Terlepas dari hasil operasi individual, setelah mengeksekusi paket batch, server akan menampilkan representasi yang dienkode JSON dari resource Bundle jenis batch-response. Resource Bundle berisi satu entri untuk setiap entri dalam permintaan dengan hasil pemrosesan entri, yang dapat berupa campuran hasil sukses dan error.

Jika paket transaksi berhasil, server akan menampilkan representasi yang dienkode JSON dari resource Bundle jenis transaction-response yang berisi satu entri untuk setiap entri dalam permintaan dengan hasil operasi yang sukses.

Jika terjadi error saat menjalankan paket transaksi, isi respons tidak berisi paket. Sebagai gantinya, file ini berisi resource OperationOutcome berenkode JSON yang menjelaskan alasan terjadinya error. Operasi yang berhasil dan di-roll back tidak dilaporkan dalam respons.

Paket contoh berikut adalah output dari keberhasilan mengeksekusi contoh di atas. Entri pertama menunjukkan keberhasilan operasi untuk membuat Patient dan menyertakan ID resource baru. Entri kedua menunjukkan keberhasilan operasi penghapusan.

{
  "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

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"

	healthcare "google.golang.org/api/healthcare/v1"
)

// fhirExecuteBundle executes an FHIR bundle.
func fhirExecuteBundle(w io.Writer, projectID, location, datasetID, fhirStoreID string) error {
	ctx := context.Background()

	healthcareService, err := healthcare.NewService(ctx)
	if err != nil {
		return fmt.Errorf("healthcare.NewService: %w", err)
	}

	fhirService := healthcareService.Projects.Locations.Datasets.FhirStores.Fhir

	payload := map[string]interface{}{
		"resourceType": "Bundle",
		"type":         "transaction",
		"entry": []map[string]interface{}{
			{
				"resource": map[string]interface{}{
					"resourceType": "Patient",
					"active":       true,
				},
				"request": map[string]interface{}{
					"method": "POST",
					"url":    "Patient",
				},
			},
		},
	}
	jsonPayload, err := json.Marshal(payload)
	if err != nil {
		return fmt.Errorf("json.Encode: %w", err)
	}

	parent := fmt.Sprintf("projects/%s/locations/%s/datasets/%s/fhirStores/%s", projectID, location, datasetID, fhirStoreID)

	call := fhirService.ExecuteBundle(parent, bytes.NewReader(jsonPayload))
	call.Header().Set("Content-Type", "application/fhir+json;charset=utf-8")
	resp, err := call.Do()
	if err != nil {
		return fmt.Errorf("ExecuteBundle: %w", err)
	}
	defer resp.Body.Close()

	respBytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("could not read response: %w", err)
	}

	if resp.StatusCode > 299 {
		return fmt.Errorf("Create: status %d %s: %s", resp.StatusCode, resp.Status, respBytes)
	}
	fmt.Fprintf(w, "%s", respBytes)

	return nil
}

Java

import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.healthcare.v1.CloudHealthcare;
import com.google.api.services.healthcare.v1.CloudHealthcareScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Collections;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;

public class FhirStoreExecuteBundle {
  private static final String FHIR_NAME = "projects/%s/locations/%s/datasets/%s/fhirStores/%s";
  private static final JsonFactory JSON_FACTORY = new GsonFactory();
  private static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  public static void fhirStoreExecuteBundle(String fhirStoreName, String data)
      throws IOException, URISyntaxException {
    // String fhirStoreName =
    //    String.format(
    //        FHIR_NAME, "your-project-id", "your-region-id", "your-dataset-id", "your-fhir-id");
    // String data = "{\"resourceType\": \"Bundle\",\"type\": \"batch\",\"entry\": []}"

    // Initialize the client, which will be used to interact with the service.
    CloudHealthcare client = createClient();
    HttpClient httpClient = HttpClients.createDefault();
    String baseUri = String.format("%sv1/%s/fhir", client.getRootUrl(), fhirStoreName);
    URIBuilder uriBuilder = new URIBuilder(baseUri).setParameter("access_token", getAccessToken());
    StringEntity requestEntity = new StringEntity(data);

    HttpUriRequest request =
        RequestBuilder.post()
            .setUri(uriBuilder.build())
            .setEntity(requestEntity)
            .addHeader("Content-Type", "application/fhir+json")
            .addHeader("Accept-Charset", "utf-8")
            .addHeader("Accept", "application/fhir+json; charset=utf-8")
            .build();

    // Execute the request and process the results.
    HttpResponse response = httpClient.execute(request);
    HttpEntity responseEntity = response.getEntity();
    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
      System.err.print(
          String.format(
              "Exception executing FHIR bundle: %s\n", response.getStatusLine().toString()));
      responseEntity.writeTo(System.err);
      throw new RuntimeException();
    }
    System.out.print("FHIR bundle executed: ");
    responseEntity.writeTo(System.out);
  }

  private static CloudHealthcare createClient() throws IOException {
    // Use Application Default Credentials (ADC) to authenticate the requests
    // For more information see https://cloud.google.com/docs/authentication/production
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    // Create a HttpRequestInitializer, which will provide a baseline configuration to all requests.
    HttpRequestInitializer requestInitializer =
        request -> {
          new HttpCredentialsAdapter(credential).initialize(request);
          request.setConnectTimeout(60000); // 1 minute connect timeout
          request.setReadTimeout(60000); // 1 minute read timeout
        };

    // Build the client for interacting with the service.
    return new CloudHealthcare.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
        .setApplicationName("your-application-name")
        .build();
  }

  private static String getAccessToken() throws IOException {
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    return credential.refreshAccessToken().getTokenValue();
  }
}

Node.js

File paket sampel tersedia di repositori GitHub contoh kode.

const google = require('@googleapis/healthcare');
const healthcare = google.healthcare({
  version: 'v1',
  auth: new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  }),
  headers: {'Content-Type': 'application/fhir+json'},
});
const fs = require('fs');

async function executeFhirBundle() {
  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const datasetId = 'my-dataset';
  // const fhirStoreId = 'my-fhir-store';
  // const bundleFile = 'bundle.json';
  const parent = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/fhirStores/${fhirStoreId}`;

  const bundle = JSON.parse(fs.readFileSync(bundleFile));

  const request = {parent, requestBody: bundle};
  const resource =
    await healthcare.projects.locations.datasets.fhirStores.fhir.executeBundle(
      request
    );
  console.log('FHIR bundle executed');
  console.log(resource.data);
}

executeFhirBundle();

Python

File paket sampel tersedia di repositori GitHub contoh kode.

def execute_bundle(
    project_id,
    location,
    dataset_id,
    fhir_store_id,
    bundle,
):
    """Executes the operations in the given bundle.

    See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
    before running the sample."""
    # Imports Python's built-in "os" module
    import os

    # Imports the google.auth.transport.requests transport
    from google.auth.transport import requests

    # Imports a module to allow authentication using a service account
    from google.oauth2 import service_account

    # Gets credentials from the environment.
    credentials = service_account.Credentials.from_service_account_file(
        os.environ["GOOGLE_APPLICATION_CREDENTIALS"]
    )
    scoped_credentials = credentials.with_scopes(
        ["https://www.googleapis.com/auth/cloud-platform"]
    )
    # Creates a requests Session object with the credentials.
    session = requests.AuthorizedSession(scoped_credentials)

    # URL to the Cloud Healthcare API endpoint and version
    base_url = "https://healthcare.googleapis.com/v1"

    # TODO(developer): Uncomment these lines and replace with your values.
    # project_id = 'my-project'  # replace with your GCP project ID
    # location = 'us-central1'  # replace with the parent dataset's location
    # dataset_id = 'my-dataset'  # replace with the parent dataset's ID
    # fhir_store_id = 'my-fhir-store' # replace with the FHIR store ID
    # bundle = 'bundle.json'  # replace with the bundle file
    url = f"{base_url}/projects/{project_id}/locations/{location}"

    resource_path = "{}/datasets/{}/fhirStores/{}/fhir".format(
        url, dataset_id, fhir_store_id
    )

    headers = {"Content-Type": "application/fhir+json;charset=utf-8"}

    with open(bundle) as bundle_file:
        bundle_file_content = bundle_file.read()

    response = session.post(resource_path, headers=headers, data=bundle_file_content)
    response.raise_for_status()

    resource = response.json()

    print(f"Executed bundle from file: {bundle}")
    print(json.dumps(resource, indent=2))

    return resource

Buat permintaan PATCH

Anda dapat menggunakan paket FHIR untuk membuat permintaan PATCH JSON pada resource FHIR. Lihat Mengeksekusi permintaan PATCH dalam paket FHIR untuk informasi selengkapnya.

Menyelesaikan referensi ke resource yang dibuat dalam paket

Resource dalam paket transaksi dapat berisi referensi ke resource yang tidak ada dalam sistem target, tetapi dibuat selama eksekusi paket. Cloud Healthcare API menyelesaikan pengaitan antara resource menggunakan kolom entry.fullUrl. Referensi yang cocok dengan nilai entry.fullUrl resource lain dalam paket ditulis ulang ke ID resource yang sesuai di penyimpanan. Proses ini akan berhasil terlepas dari urutan operasi dalam paket.

Cloud Healthcare API menerima fullUrl dalam format berikut:

  • urn:uuid:UUID
  • urn:oid:OID
  • URL apa pun
  • nama resource dalam format RESOURCE_TYPE/RESOURCE_ID, seperti Patient/123. Penggunaan format ini tidak direkomendasikan karena fullUrl adalah placeholder lokal untuk paket. Hal ini dapat menimbulkan kebingungan jika resource di toko memiliki nama yang sama, tetapi resource dalam paket me-resolve ke nama yang berbeda sebagai akibat dari operasi create.

Paket contoh berikut membuat resource Pasien dan resource Observation yang merujuk ke resource Pasien.

{
  "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"
        }
      }
    }
  ]
}

Contoh berikut menunjukkan cara mengeksekusi paket.

curl

File paket sampel tersedia di repositori GitHub contoh kode.

Untuk mengeksekusi paket, buat permintaan POST dan tentukan informasi berikut:

  • Nama dan lokasi set data induk dan penyimpanan FHIR
  • Lokasi file Paket di Cloud Storage
  • Token akses

Contoh berikut menunjukkan permintaan POST menggunakan 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"

Paket contoh berikut adalah output dari keberhasilan mengeksekusi contoh di atas. Entri pertama menunjukkan keberhasilan operasi untuk membuat Patient dan menyertakan ID resource baru. Entri kedua menunjukkan keberhasilan operasi untuk membuat Observation dan menyertakan ID resource baru tersebut.

{
  "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

File paket sampel tersedia di repositori GitHub contoh kode.

Untuk mengeksekusi paket, buat permintaan POST dan tentukan informasi berikut:

  • Nama dan lokasi set data induk dan penyimpanan FHIR
  • Lokasi file Paket di Cloud Storage
  • Token akses

Contoh berikut menunjukkan permintaan POST menggunakan 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

Paket contoh berikut adalah output dari keberhasilan mengeksekusi contoh di atas. Entri pertama menunjukkan keberhasilan operasi untuk membuat Patient dan menyertakan ID resource baru. Entri kedua menunjukkan keberhasilan operasi untuk membuat Observation dan menyertakan ID resource baru tersebut.

{
  "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"
}