Controlla l'accesso alle risorse FHIR nell'API Cloud Healthcare

In questa pagina viene descritto come utilizzare Risorse per il consenso FHIR per determinare l'accesso ai dati dei datastore FHIR nell'API Cloud Healthcare.

Per configurare un datastore FHIR con l'applicazione del consenso, completa i seguenti passaggi:

  1. Crea un datastore FHIR se non ne hai già uno.

  2. Imposta i seguenti parametri ConsentConfig del datastore FHIR per abilitare l'applicazione del consenso:

    • version: specifica per quale versione dell'applicazione del consenso viene utilizzata la versione il datastore FHIR. Questo valore può essere impostato una sola volta tramite CreateFhirStore o UpdateFhirStore. Una volta impostato, devi chiamare ApplyConsents o ApplyAdminConsents per cambiare la versione.

    • access_enforced: se impostato su true, quando si accede alle risorse FHIR, le intestazioni di consenso fornite verranno verificate in base alle direttive di consenso fornite dai consumatori.

    • consent_header_handling: Se impostato su PERMIT_EMPTY_SCOPE (valore predefinito), il server consente le richieste senza (o vuota) l'intestazione X-Consent-Scope. Se impostato su REQUIRED_ON_READ e access_enforced = true, il server rifiuta tutte le richieste senza (o vuoto) intestazione X-Consent-Scope.

Configura un nuovo datastore FHIR con ConsentConfig

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'version': 'R4',
      'enableUpdateCreate': true,
      'consentConfig': {
        'version': 'V1',
        'accessEnforced': true
      }
    }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores?fhirStoreId=FHIR_STORE_ID"

Dovresti ricevere una risposta JSON simile alla seguente:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
  "version": "R4",
  "enableUpdateCreate": true,
  "consentConfig": {
    "version": "V1"
  }
}

Se hai già un negozio, usa UpdateFhirStore per impostare il ConsentConfig con l'applicazione del consenso version V1 e imposta accessEnforced su true.

curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'consentConfig': {
        'version': 'V1',
        'accessEnforced': true
      }
    }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"

I criteri sono rappresentati tramite Risorsa per il consenso. I campi della risorsa lo scopo e l'utilizzo sono descritti nella documentazione sul modello di dati.

Ecco un esempio di tutte le risorse che possono essere create per questo particolare esempio.

Creare risorse FHIR

L'esempio seguente mostra come eseguire un [pacchetto FHIR](/healthcare-api/docs/how-tos/fhir-bundles) per compilare il seguenti risorse:

  • Una risorsa professionista con il nome Jeffrey Brown
  • Una risorsa paziente con nome Darcy Smith
  • Una risorsa di osservazione che mostra la misurazione dell'emoglobina di Darcy (LOINC718-7) raccolta dall'ospedale Happy
  • Una risorsa di osservazione che mostra la misurazione del glucosio di Darcy (LOINC15074-8).
  • Consenso di Darcy a permettere a Jeffrey Brown di utilizzare la richiesta App/123 per accedere ai suoi dati raccolti da Happy Hospital
  • Un consenso di Darcy a permettere a Jeffrey Brown di accedere a qualsiasi suo dato per cure di emergenza (ETREAT)
  • Un consenso di Happy Hospital per consentire a Jeffrey Brown di accedere a tutti i dati durante la ricerca biomedica (BIORCH) con applicazione App/golden

cat > bundle.json << 'EOF'
{
  "resourceType": "Bundle",
  "type": "transaction",
  "entry": [
    {
      "request": {"method": "PUT", "url": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"},
      "resource": {
        "active": true,
        "birthDate": "1970-05-23",
        "gender": "male",
        "id": "12942879-f89f-41ae-aa80-0b911b649833",
        "name": [{
            "family": "Brown",
            "given": ["Jeffrey"],
            "use": "official"
        }],
        "resourceType": "Practitioner"
      }
    },
    {
      "request": {"method": "PUT", "url": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
      "resource": {
        "active": true,
        "birthDate": "1990-01-01",
        "gender": "female",
        "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2",
        "name": [{
            "family": "Smith",
            "given": ["Darcy"],
            "use": "official"
        }],
        "meta": {
          "tag": [{
            "system": "http://terminology.hl7.org/CodeSystem/common-tags",
            "code": "employee"
          }]
        },
        "resourceType": "Patient"
      }
    },
    {
      "request": {"method": "PUT", "url": "Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"},
      "resource": {
        "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
        "meta": {"source": "http://example.com/HappyHospital"},
        "code": {
          "coding": [{
            "code": "718-7",
            "system": "http://loinc.org",
            "display": "Hemoglobin [Mass/volume] in Blood"
          }]
        },
        "effectivePeriod": {"start": "2021-12-10T05:30:10+01:00"},
        "issued": "2021-12-10T13:30:10+01:00",
        "resourceType": "Observation",
        "status": "final",
        "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
        "valueQuantity": {
          "code": "g/dL",
          "system": "http://unitsofmeasure.org",
          "unit": "g/dl",
          "value": 7.2
        }
      }
    },
    {
      "request": {"method": "PUT", "url": "Observation/68583624-9921-4158-8754-2a306c689abd"},
      "resource": {
        "id": "68583624-9921-4158-8754-2a306c689abd",
        "code": {
          "coding": [{
            "code": "15074-8",
            "system": "http://loinc.org",
            "display": "Glucose [Moles/volume] in Blood"
          }]
        },
        "effectivePeriod": {"start": "2021-12-01T05:30:10+01:00"},
        "issued": "2021-12-01T13:30:10+01:00",
        "resourceType": "Observation",
        "status": "final",
        "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
        "valueQuantity": {
          "code": "mmol/L",
          "system": "http://unitsofmeasure.org",
          "unit": "mmol/l",
          "value": 6.3
        }
      }
    },
    {
      "request": {"method": "PUT", "url": "Consent/10998b60-a252-405f-aa47-0702554ddc8e"},
      "resource": {
        "category": [{
          "coding": [{
            "code": "59284-0",
            "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes"
          }]
        }],
        "id": "10998b60-a252-405f-aa47-0702554ddc8e",
        "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
        "policyRule": {
          "coding": [{
            "code": "OPTIN",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
          }]
        },
        "provision": {
          "actor": [
            {
              "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"},
              "role": {
                "coding": [{
                  "code": "GRANTEE",
                  "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode"
                }]
              }
            }
          ],
          "extension": [
            {
              "url": "https://g.co/fhir/medicalrecords/Environment",
              "valueCodeableConcept": {
                "coding": [{
                  "code": "123",
                  "system": "App"
                }]
              }
            },
            {
              "url": "https://g.co/fhir/medicalrecords/DataSource",
              "valueUri": "http://example.com/HappyHospital"
            }
          ],
          "type": "permit"
        },
        "resourceType": "Consent",
        "scope": {
          "coding": [{
            "code": "patient-privacy",
            "system": "http://terminology.hl7.org/CodeSystem/consentscope"
          }]
        },
        "status": "active"
      }
    },
    {
      "request": {"method": "PUT", "url": "Consent/73c54e8d-2789-403b-9dee-13085c5d5e34"},
      "resource": {
        "category": [{
          "coding": [{
            "code": "59284-0",
            "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes"
          }]
        }],
        "id": "73c54e8d-2789-403b-9dee-13085c5d5e34",
        "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
        "policyRule": {
          "coding": [{
            "code": "OPTIN",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
          }]
        },
        "provision": {
          "actor": [
            {
              "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"},
              "role": {
                "coding": [{
                  "code": "GRANTEE",
                  "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode"
                }]
              }
            }
          ],
          "purpose": [{
            "code": "ETREAT",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason"
          }],
          "type": "permit"
        },
        "resourceType": "Consent",
        "scope": {
          "coding": [{
            "code": "patient-privacy",
            "system": "http://terminology.hl7.org/CodeSystem/consentscope"
          }]
        },
        "status": "active"
      }
    },
    {
      "request": {"method": "PUT", "url": "Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde"},
      "resource": {
        "category": [{
          "coding": [{
            "code": "57017-6",
            "system": "http://loinc.org"
          }]
        }],
        "id": "5c8e3f8a-9fd5-480d-a08e-f29b89feccde",
        "patient": {},
        "extension": [{
          "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy"
        }],
        "policyRule": {
          "coding": [{
            "code": "OPTIN",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
          }]
        },
        "provision": {
          "actor": [
            {
              "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"},
              "role": {
                "coding": [{
                  "code": "GRANTEE",
                  "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode"
                }]
              }
            }
          ],
          "purpose": [{
            "code": "BIORCH",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason"
          }],
          "extension": [
            {
              "url": "https://g.co/fhir/medicalrecords/Environment",
              "valueCodeableConcept": {
                "coding": [{
                  "code": "golden",
                  "system": "App"
                }]
              }
            }
          ],
          "type": "permit"
        },
        "resourceType": "Consent",
        "scope": {},
        "status": "active"
      }
    }
  ]
}
EOF
curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/fhir+json; charset=utf-8" \
    --data @bundle.json \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"

Dovresti ricevere una risposta JSON simile alla seguente:

{
  "entry": [
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/10998b60-a252-405f-aa47-0702554ddc8e/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/73c54e8d-2789-403b-9dee-13085c5d5e34/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID",
        "status": "201 Created"
      }
    }
  ],
  "resourceType": "Bundle",
  "type": "transaction-response"
}

Di seguito sono riportati altri esempi di risorsa per il consenso R4 che dimostrano come possono essere rappresentate norme complesse.

{
  "resourceType": "Consent",
  "id": "patient-consent-example",
  "patient": {
    "reference": "Patient/f001"
  },
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "59284-0"
        }
      ]
    }
  ],
  "scope": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/consentscope",
        "code": "patient-privacy"
      }
    ]
  },
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Encounter"
      }
    ],
    "data": [
      {
        "meaning": "instance",
        "reference": {
          "reference": "Encounter/e001"
        }
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "actionable"
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "extension": [
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "archived"
            }
          },
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "insensitive"
            }
          }
        ]
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataSource",
        "valueUri": "http://somesystem.example.org/foo"
      }
    ],
    "securityLabel": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality",
        "code": "R"
      },
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "PSY"
      }
    ]
  }
}

L'esempio precedente rappresenta una risorsa di consenso del paziente in cui un paziente f001 autorizza un professionista f002 con allo scopo di offrire un trattamento regolare rappresentato da TREAT. Il professionista proviene dalla geolocalizzazione iso3166-1/CA. Questa risorsa Consenso consente al professionista di accedere ai dati del paziente se questi soddisfano tutte le seguenti condizioni.

  • Si tratta di un tipo Encounter con ID Encounter/e001.
  • Proviene dall'origine http://somesystem.example.org/foo.
  • Soddisfa almeno una delle seguenti condizioni sul tag (le risorse possono essere taggate impostando i campi system e code di Meta.tag):
    • Contiene il tag (system = http://terminology.hl7.org/CodeSystem/common-tags e code = actionable)
    • Ha entrambi i tag (system = http://example.com/custom-tags e code = archived) e (system = http://example.com/custom-tags e code = insensitive)
  • Ha almeno una delle seguenti etichette di sicurezza
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality e code è uno di R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode e code = PSY.

Istruzione del criterio di amministrazione di esempio

{
  "resourceType": "Consent",
  "id": "admin-policy-example",
  "patient": {},
  "extension": [{
    "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy"
  }],
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "57017-6"
        }
      ]
    }
  ],
  "scope": {},
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Encounter"
      }
    ],
    "data": [
      {
        "meaning": "instance",
        "reference": {
          "reference": "Encounter/e001"
        }
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "actionable"
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "extension": [
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "archived"
            }
          },
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "insensitive"
            }
          }
        ]
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataSource",
        "valueUri": "http://somesystem.example.org/foo"
      }
    ],
    "securityLabel": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality",
        "code": "R"
      },
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "PSY"
      }
    ]
  }
}

L'esempio precedente rappresenta una risorsa di consenso per i criteri amministrativi che concede l'autorizzazione per un professionista f002 allo scopo di fornire regolari rappresentato da TREAT. Il professionista è geolocalizzazione iso3166-1/CA. Questa risorsa per il consenso consente per accedere ai dati dei pazienti se soddisfano tutti i le seguenti condizioni:

  • Si tratta di un tipo Encounter con ID Encounter/e001.
  • Proviene dall'origine http://somesystem.example.org/foo.
  • Soddisfa almeno una delle seguenti condizioni sul tag:
    • Contiene il tag (system = http://terminology.hl7.org/CodeSystem/common-tags e code = actionable)
    • Ha entrambi i tag (system = http://example.com/custom-tags e code = archived) e (system = http://example.com/custom-tags e code = insensitive)
  • Ha almeno una delle seguenti etichette di sicurezza
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality e code è uno di R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode e code = PSY.

Direttiva di esempio relativa alle norme a cascata dell'amministratore

{
  "resourceType": "Consent",
  "id": "admin-cascading-policy-example",
  "patient": {},
  "extension": [
    { "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy" },
    { "url": "https://g.co/fhir/medicalrecords/CascadingPolicy" }
  ],
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "57017-6"
        }
      ]
    }
  ],
  "scope": {},
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Patient"
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "employee"
        }
      }
    ]
  }
}

L'esempio precedente rappresenta una risorsa di consenso per i criteri a cascata dell'amministratore che fornisce l'autorizzazione a un professionista f002 allo scopo di fornire trattamento regolare rappresentato da TREAT. Il professionista è da la geolocalizzazione iso3166-1/CA. Questa risorsa per il consenso consente di accedere ai dati del compartimento dei pazienti con tag employee. Tutti i criteri delle risorse si applica solo alle risorse della base del compartimento, ovvero alla risorsa Paziente, controlla da quali risorse passare.

Applicare i consensi dei pazienti o i criteri per gli amministratori

Richiedi il consenso del paziente entro il giorno ApplyConsents

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{'validateOnly': false}" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

Dovresti ricevere una risposta JSON simile alla seguente:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

La risposta contiene il nome di un'operazione. Per monitorare lo stato dell'operazione, puoi utilizzare [Operazione Metodo "get"](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

Al termine dell'operazione, il server restituisce una risposta con lo stato l'operazione in formato JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.fhir.FhirStoreService.ApplyConsents",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter": {
      "success": "2",
      "secondarySuccess": "5"
    }
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.fhir.ApplyConsentsResponse",
    "consentApplySuccess": "2",
    "affectedResources": "5"
  }
}

Questa risposta ha indicato che il server ha elaborato correttamente 2 consensi e aggiornato l’accesso consensuale a 5 risorse (1 paziente, 2 consensi, osservazioni).

Applica il criterio di amministrazione entro il giorno ApplyAdminConsents

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'validateOnly': false,
      'newConsentsList': {
        'names': ['projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID']
      }
    }" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

Dovresti ricevere una risposta JSON simile alla seguente:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

La risposta contiene il nome di un'operazione. Per monitorare lo stato dell'operazione, puoi utilizzare [Operazione Metodo "get"](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

Al termine dell'operazione, il server restituisce una risposta con lo stato dell'operazione in formato JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.fhir.FhirStoreService.ApplyAdminConsents",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter": {
      "success": "1",
      "secondarySuccess": "7"
    }
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.fhir.ApplyAdminConsentsResponse",
    "consentApplySuccess": "1",
    "affectedResources": "7"
  }
}

Questa risposta indica che il server ha elaborato correttamente 1 criterio di amministrazione e aggiornato l’accesso consensuale a 7 risorse (1 medico, 1 paziente, 2 osservazioni, 2 consensi dei pazienti e 1 politica amministrativa).

L'applicazione dei consensi archiviati in un archivio FHIR non entrerà in vigore fino a quando ApplyConsents (per i consensi dei pazienti) o ApplyAdminConsents (per le norme di amministrazione e le norme di amministrazione gerarchiche) non viene chiamato e completato correttamente. Se aggiungi, modifichi o rimuovi i consensi dopo aver eseguito ApplyConsents o ApplyAdminConsents, devi eseguirlo di nuovo affinché tali consensi vengano inclusi nel il modello di applicazione.

Le risorse FHIR vengono indicizzate in modo asincrono, pertanto potrebbe verificarsi un leggero ritardo tra il momento in cui viene completato ApplyConsents o ApplyAdminConsents e il momento in cui il modello di applicazione si riflette nei risultati di ricerca. Questo ritardo è previsto solo per le richieste di ricerca.

Se è la prima volta che configuri l'applicazione del consenso sul datastore FHIR store, attendi l'esecuzione a lunga esecuzione di ApplyConsents o ApplyAdminConsents dell'operazione da completare prima di effettuare richieste sensibili al consenso.

Per chiamare ApplyConsents su un sottoinsieme di pazienti, puoi utilizzare quanto segue filtri:

  • PatientScope: per eseguire ApplyConsents su un elenco di ID paziente con un massimo di 10.000 pazienti

  • TimeRange: per eseguire ApplyConsent su un elenco di ID risorsa paziente le cui risorse per il consenso vengono aggiornate durante un determinato intervallo di tempo

Per chiamare ApplyAdminConsents: devi fornire l'elenco completo di tutti i criteri che vuoi applicare (non un elenco incrementale). Di conseguenza, viene restituito annullerà l'applicazione di tutti i criteri amministrativi dello store. Ogni criterio deve essere un nome versione della risorsa Negozio FHIR è il controllo delle versioni, mentre un nome risorsa.

Puoi utilizzare operations.get per recuperare il ProgressCounter dell'operazione. Al termine, c'è una richiesta ApplyConsentsResponse che è inclusa nel Operation.response I contatori in ProgressCounter e ApplyConsentsResponse o ApplyAdminConsentsResponse sono descritti nella seguente tabella.

ProgressCounter ApplyConsentsResponse o ApplyAdminConsentsResponse Descrizione
success consentApplySuccess Il numero di risorse per il consenso elaborate correttamente dall'operazione.
failure consentApplyFailure Il numero di risorse per il consenso non supportate o non valide. Puoi visualizzare i log degli errori in Cloud Logging oppure, quando validateOnly è false, controllare lo stato dell'applicazione del consenso utilizzando CheckConsentEnforcementStatus o CheckPatientConsentEnforcementStatus per recuperare i dettagli dell'errore.
secondarySuccess affectedResources Quando validateOnly è false, rappresenta il numero di risorse FHIR che sono state reindicizzate correttamente a causa dell'effetto della modifica del consenso.
secondaryFailure failedResources Quando validateOnly è false, rappresenta il numero di risorse FHIR che potrebbero avere una modifica del consenso, ma che non sono state reindicizzate. Ciò potrebbe influire sulla ricerca con contesto del consenso, ma non su altri metodi. Per visualizzare i dettagli dell'errore, puoi visualizzare i log degli errori in Cloud Logging.

Quando le risorse di consenso FHIR vengono elaborate, puoi utilizzare le seguenti API per controllare lo stato dell'applicazione delle norme per un singolo consenso o per tutti i consensi di un paziente:

Per il criterio di amministrazione, CheckConsentEnforcementStatus può essere utilizzato soltanto per verificare Lo stato di applicazione di un singolo criterio di amministrazione del consenso. In alternativa, è possibile utilizzare fhirStores.get per visualizzare tutti i criteri amministrativi attivi applicati allo store.

consent-enforcement-status può avere uno qualsiasi dei seguenti valori:

  • OFF: rappresenta lo stato di applicazione predefinito di una nuova risorsa per il consenso in cui la risorsa di consenso non è mai stata elaborato.

  • ENFORCEABLE: stato in cui è stata elaborata la risorsa per il consenso correttamente.

  • INACTIVE: uno stato inattivo in cui la risorsa Consenso viene ignorata.

  • UNSUPPORTED: lo stato di una risorsa per il consenso conforme a FHIR ma non è azionabile. Ciò è dovuto a un'implementazione limitata dell'applicazione del consenso FHIR con l'attuale livello di supporto delle funzionalità.

  • ENFORCEMENT_LIMIT_EXCEEDED: lo stato in cui la risorsa di consenso FHIR formato e il livello di supporto per la risorsa sono privi di errori, ma o più delle seguenti condizioni sono vere:

    • Il paziente dispone di un'ampia serie di risorse per il consenso.

    • La dimensione delle istruzioni sul consenso in tutti i consensi attivi è maggiore rispetto alla dimensione massima consentita delle istruzioni di consenso per un FHIR server per applicarle.

L'API Cloud Healthcare supporta le ricerche di risorse FHIR in un determinato archivio FHIR con actor, purpose e environment come parametri di query. La la risposta contiene solo le risorse per le quali è stato dato il consenso.

  1. Medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizzando un'applicazione attendibile App/123 cerca in tutte le osservazioni con status=final.
  2. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"

    Dovresti ricevere una risposta JSON simile alla seguente:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "718-7",
                  "display": "Hemoglobin [Mass/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-10T05:30:10+01:00"
            },
            "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
            "issued": "2021-12-10T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "source": "http://example.com/HappyHospital",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "g/dL",
              "system": "http://unitsofmeasure.org",
              "unit": "g/dl",
              "value": 7.2
            }
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    
  3. Medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizzando l'applicazione App/123 cerca in tutte le osservazioni relative a Patient Darcy.
  4. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"

    Dovresti ricevere una risposta JSON simile alla seguente:

    {
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        }
      ],
      "resourceType": "Bundle",
      "total": 0,
      "type": "searchset"
    }
    

    La query precedente è una ricerca in catena. Poiché lo scenario relativo al consenso actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 non possa accedere alla risorsa Patient Darcy (identificata da Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2), il server FHIR non restituisce nessuna osservazione da parte del paziente come se il paziente non esistesse.

  5. Il professionista Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizzando l'applicazione App/123 esegue ricerche in tutte le osservazioni del paziente Darcy a fini di trattamento di emergenza.
  6. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/ETREAT env/App/123" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"

    Dovresti ricevere una risposta JSON simile alla seguente:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "15074-8",
                  "display": "Glucose [Moles/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-01T05:30:10+01:00"
            },
            "id": "68583624-9921-4158-8754-2a306c689abd",
            "issued": "2021-12-01T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "mmol/L",
              "system": "http://unitsofmeasure.org",
              "unit": "mmol/l",
              "value": 6.3
            }
          },
          "search": {
            "mode": "match"
          }
        },
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "718-7",
                  "display": "Hemoglobin [Mass/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-10T05:30:10+01:00"
            },
            "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
            "issued": "2021-12-10T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "source": "http://example.com/HappyHospital",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "g/dL",
              "system": "http://unitsofmeasure.org",
              "unit": "g/dl",
              "value": 7.2
            }
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        }
      ],
      "resourceType": "Bundle",
      "total": 2,
      "type": "searchset"
    }
    
  7. Medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) cerca le osservazioni con status=final per due scopi: gruppo sperimentale e ricerca
  8. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/TREAT purp/v3/HRESCH" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"

    Dovresti ricevere una risposta JSON simile alla seguente:

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "the maximum number of allowed consent purpose scopes is 1, got 2",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    

    In questo caso, il medico Jeffrey Brown dovrebbe rimuovere lo scopo da "X-Consent-Scope" nella richiesta.

  9. Un amministratore IT di un ospedale usa bypass per cercare tutti Medici in ospedale.
  10. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: bypass actor/Admin/ef0592c9-6724-467e-878d-f879e537cd15 env/net/HappyNet" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner?"

    Poiché è stato fornito il numero bypass, i controlli del consenso sono stati ignorati. Tu dovrebbe ricevere una risposta JSON simile alla seguente:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833",
          "resource": {
            "active": true,
            "birthDate": "1970-05-23",
            "gender": "male",
            "id": "12942879-f89f-41ae-aa80-0b911b649833",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "versionId": "VERSION_ID"
            },
            "name": [
              {
                "family": "Brown",
                "given": [
                  "Jeffrey"
                ],
                "use": "official"
              }
            ],
            "resourceType": "Practitioner"
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    

L'API Cloud Healthcare supporta la risorsa FHIR per il recupero in un Datastore FHIR con actor, purpose e environment come parametri di ricerca. La la risposta contiene solo le risorse per le quali è stato dato il consenso.

  1. Il professionista Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizzando l'applicazione App/123 legge la misurazione dell'emoglobina del paziente (in questo esempio, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  2. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    Poiché al richiedente è stato concesso il consenso, la risposta è costituita dai contenuti della risorsa Observation.

    {
      "code": {
        "coding": [
          {
            "code": "718-7",
            "display": "Hemoglobin [Mass/volume] in Blood",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectivePeriod": {
        "start": "2021-12-10T05:30:10+01:00"
      },
      "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
      "issued": "2021-12-10T13:30:10+01:00",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "source": "http://example.com/HappyHospital",
        "versionId": "VERSION_ID"
      },
      "resourceType": "Observation",
      "status": "final",
      "subject": {
        "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
      },
      "valueQuantity": {
        "code": "g/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "g/dl",
        "value": 7.2
      }
    }
    
  3. Medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizzando un'applicazione sconosciuta App/unknown legge la misurazione dell'emoglobina del paziente (in questo esempio, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  4. curl -X GET \
      -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/unknown" \
      "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    Poiché l'accesso ai confini del richiedente ("App/unknown") non è consentito dal consenso del paziente, la richiesta viene rifiutata.

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "Consent access denied or the resource being accessed does not exist",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    
  5. Medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) effettuare una ricerca biomedica utilizzando l'applicazione App/golden legge la Data di nascita del Darcy (in esempio, Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2).
  6. curl -X GET \
      -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/BIORCH env/App/golden" \
      "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"

    Poiché il richiedente ha dato il consenso, la risposta è costituita dai contenuti della risorsa Patient.

    {
      "active": true,
      "birthDate": "1990-01-01",
      "gender": "female",
      "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "versionId": "VERSION_ID",
        "tag": [{
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "employee"
        }]
      },
      "name": [
        {
          "family": "Smith",
          "given": [
            "Darcy"
          ],
          "use": "official"
        }
      ],
      "resourceType": "Patient"
    }
    
  7. Medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) richiede l'accesso non autorizzato di emergenza alla cartella clinica di un paziente, utilizzando protocollo. (in questo esempio, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  8. curl -X GET \
      -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -H "X-Consent-Scope: btg actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833" \
      "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    Poiché il metodo di autorizzazione del consenso è btg, il server ignora il consenso controlli. La risposta è il contenuto della risorsa Observation.

    {
      "code": {
        "coding": [
          {
            "code": "718-7",
            "display": "Hemoglobin [Mass/volume] in Blood",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectivePeriod": {
        "start": "2021-12-10T05:30:10+01:00"
      },
      "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
      "issued": "2021-12-10T13:30:10+01:00",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "source": "http://example.com/HappyHospital",
        "versionId": "VERSION_ID"
      },
      "resourceType": "Observation",
      "status": "final",
      "subject": {
        "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
      },
      "valueQuantity": {
        "code": "g/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "g/dl",
        "value": 7.2
      }
    }
    

Le seguenti sezioni descrivono i metodi di applicazione del consenso supportati nel API Cloud Healthcare e come viene applicato l'accesso alle risorse quando richiesta che riconosce il consenso.

Quando effettui una richiesta, il tuo server di autorizzazione è responsabile di generare di accesso ai token con l'ambito del consenso pertinente.

Impostare l'intestazione HTTP

Gli ambiti di consenso vengono passati all'API Cloud Healthcare utilizzando Intestazione HTTP X-Consent-Scope. L'API Cloud Healthcare utilizza questa intestazione applicare in modo forzato il controllo dell'accesso basato sul consenso ai dati negli archivi FHIR.

Una richiesta FHIR può supportare un numero limitato di ambiti per le voci di consenso. Fino a tre è possibile includere le voci actor, uno tra purp e uno tra env richiesta FHIR.

Per ambiti speciali, una richiesta FHIR può supportare uno dei seguenti: btg, oppure bypass.

Imposta le intestazioni HTTP per le applicazioni attendibili

Questa sezione è obbligatoria solo se utilizzi un account gestito dal cliente di autorizzazione. In questo caso, è necessario utilizzare anche un proxy SMART proxy simile.

Alcune applicazioni attendibili potrebbero effettuare chiamate direttamente all'API Cloud Healthcare con gli ambiti di consenso nell'intestazione HTTP specificata. In questo modo, viene abilitata l'applicazione diretta del consenso senza la necessità di un proxy SMART o di un altro proxy per la conversione tra i server di autorizzazione esterni e Google Cloud.

Ad esempio, la tua applicazione potrebbe essere registrata per un sottoinsieme di ambiti, nell'ambito dell'applicazione environment, oppure l'applicazione potrebbe presentare widget di selezione per impostare alcune voci dell'ambito come purpose della funzione di accesso.

Un utente attendibile o un'applicazione attendibile potrebbe anche utilizzare le voci di ambito btg o bypass, che sono soggette a revisioni post-audit.

L'API Cloud Healthcare fornisce il supporto integrato per l'applicazione del consenso FHIR in base agli ambiti del consenso inseriti. Gli amministratori del repository FHIR sono responsabili della creazione e della configurazione di un server di autorizzazione esterno all'API Cloud Healthcare che concede gli ambiti del consenso.

Token di accesso di esempio

L'esempio seguente mostra un token di accesso codificato in base64:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB

Dopo aver decodificato il token di accesso, puoi vedere che contiene: payload:

{
  "iss": "consent.token.org",
  "iat": 1612884085,
  "exp": 1644420085,
  "aud": "www.example.com",
  "sub": "doctor.gabriela@example.com",
  "scope": "oidc actor/Practitioner/123 actor/Group/999 purp/v3/TREAT env/App/abc"
}

Configura SMARTProxy

SMARTProxy è un proxy open source di Google che fornisce le seguenti funzionalità caratteristiche:

  • Consente al server FHIR dell'API Cloud Healthcare di accettare e convalidare di accesso sensibili al consenso.

  • Consente all'implementazione FHIR nell'API Cloud Healthcare di includere di accesso sensibile al consenso nell'ambito della gestione e modello di autorizzazione.

  • Supporta anche le funzionalità dei token per il supporto SMART su FHIR.

Quando effettui una richiesta di recupero dei dati dall'API Cloud Healthcare tramite SMARTProxy, si verifica quanto segue:

  1. SMARTProxy accetta una richiesta da un client contenente un token per il consenso.

  2. SMARTProxy convalida il token di consenso tramite un'autorizzazione JWT server di tua proprietà.

  3. SMARTProxy legge gli ambiti dal token per il consenso e li passa a l'API Cloud Healthcare tramite l'intestazione HTTP.

  4. L'API Cloud Healthcare riceve le intestazioni e le convalida applicare le istruzioni relative al consenso alla richiesta. L'API Cloud Healthcare restituisce una risposta al client tramite SMARTProxy.

Configurare un account di servizio Google Cloud

Un proxy può avere un solo account di servizio Google Cloud. Se più client utilizzano lo stesso proxy, utilizzeranno lo stesso account di servizio. Utilizza le funzionalità di fai attenzione quando condividi un account di servizio con più client per le seguenti attività: motivi:

Ad esempio, se chiami direttamente l'API Cloud Healthcare utilizzando il tuo Account per l'autenticazione, Cloud Audit Logs registra il tuo indirizzo email come l'indirizzo email dell'entità. Quando utilizzi un proxy per chiamare l'API Cloud Healthcare, il proxy utilizza il proprio account di servizio e l'indirizzo email dell'entità viene l'indirizzo email dell'account di servizio e l'account originale non sono definiti.

Audit log

Gli audit log vengono generati quando viene presentata una richiesta di accesso o quando cambia l'applicazione dell'accesso alle risorse.

Accedere ai log di controllo

Se gli audit log attivata sul datastore FHIR, nell'audit verrà incluso un campo di metadati consentMode disponibili in Cloud Logging. consentMode potrebbe avere uno dei seguenti elementi valori:

  • off: la configurazione del datastore FHIR ha consentConfig.accessEnforced impostato a false e non consente richieste sensibili al consenso.

  • emptyScope: il datastore FHIR ha consentConfig.accessEnforced impostato su true, ma non è stata inclusa un'intestazione dell'ambito del consenso. Di conseguenza, i consensi non sono stati applicati.

  • enforced: l'archivio FHIR ha consentConfig.accessEnforced impostato su true e l'intestazione dell'ambito del consenso era presente. Di conseguenza, i consensi sono stati valutate e applicate alla richiesta.

  • btg: per la richiesta FHIR è stato fornito btg nell'intestazione dell'ambito del consenso. Di conseguenza, i controlli del consenso sono stati ignorati. Questa richiesta è pensata per essere utilizzata per le emergenze ed è soggetta solo a revisione post-audit.

  • bypass: per la richiesta FHIR è stato fornito solo bypass nell'ambito del consenso intestazione. Di conseguenza, i controlli del consenso sono stati ignorati. Questa richiesta è destinata di essere utilizzato da un flusso di lavoro attendibile (ad esempio, un amministratore o dell'applicazione anziché per gli utenti finali) in modo che questo audit log sia diverso btg, utilizzato per i controlli di governance dei dati.

Se vuoi, puoi impostare access_determination_log_config su VERBOSE per registrare ulteriori informazioni sul motivo per cui una richiesta viene concessa o rifiutata.

Audit log delle modifiche dell'applicazione forzata degli accessi

Quando la risorsa di base del vano cambia (ad esempio, la rimozione Tag employee): il controllo dell'accesso alla risorsa modificata e al relativo compartimento. potrebbe cambiare a causa del criterio di Cascading per gli amministratori. La reindicizzazione verrà attivata su tutti i le risorse del suo compartimento. Avanzamento della reindicizzazione per ogni base dello scomparto l'aggiornamento delle risorse può essere monitorato in Cloud Logging con il filtro jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry".

Esempio di log di avanzamento della reindicizzazione a cascata

{
  "insertId": "tz2gtza8",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry",
    "state": "STATE_FINISHED",
    "affectedResources": "2",
    "lastUpdated": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ",
    "compartmentBaseResourceName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_RESOURCE_ID/_history/PATIENT_RESOURCE_VERSION"
  },
  "resource": {
    "type": "healthcare_fhir_store",
    "labels": {
      "location": "LOCATION",
      "dataset_id": "DATASET_ID",
      "fhir_store_id": "FHIR_STORE_ID",
      "project_id": "PROJECT_ID"
    }
  },
  "timestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ",
  "severity": "INFO",
  "logName": "projects/PROJECT_ID/logs/healthcare.googleapis.com%2Fconsent_cascading_fhir",
  "receiveTimestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
}

jsonPayload.state è lo stato dell'operazione di reindicizzazione, jsonPayload.affectedResources è il numero di risorse del compartimento reindicizzato e jsonPayload.lastUpdated è il timestamp dell'aggiornamento delle risorse dei pazienti. Se l'operazione è appena stata avviata, jsonPayload.state="STATE_STARTED" e jsonPayload.affectedResources non saranno presenti.

Vincoli e limiti

Questa sezione mostra i vincoli e i limiti per FHIR R4, ma gli stessi vincoli e limiti si applicano a FHIR STU3.

Tipo Vincoli e limiti
Risorsa Single Consent
  • È supportato un solo elemento Consent.provision. Non sono supportati più provisioning o provisioning nidificato.
  • Almeno 1 Consent.provision.actor, ma massimo 25:
    • Consent.provision.actor.role deve essere http://terminology.hl7.org/CodeSystem/v3-RoleCode.
    • Consent.provision.actor.code deve essere GRANTEE o HPOWATT.
  • Al massimo 1 Consent.provision.purpose:
    • Consent.provision.purpose.system deve essere http://terminology.hl7.org/CodeSystem/v3-ActReason.
    • Consent.provision.purpose.code non è vuoto e può contenere al massimo 13 caratteri.
  • Al massimo 1 environment:
    • Consent.provision.extension.url deve essere https://g.co/fhir/medicalrecords/Environment.
    • La lunghezza del sistema e del codice combinati deve essere inferiore a 15 caratteri.
  • Se filtri per tipo di risorsa, il valore di Consent.provision.class.system deve essere http://hl7.org/fhir/resource-types.
  • Se filtri in base all'origine dati, il valore di Consent.provision.extension.url deve essere https://g.co/fhir/medicalrecords/DataSource.
  • Se filtri per tag dati, il valore di Consent.provision.extension.url deve essere https://g.co/fhir/medicalrecords/DataTag.
    • Il tag dati può essere un'estensione complessa, nidificata fino a un livello, per descrivere un criterio che abbina le risorse con tutti i tag specificati (interpretati in modo congiuntivo).
    • Sono supportati al massimo cinque tag nidificati.
  • Al massimo 100 valori per tutti gli attributi ripetuti, a meno che non sia descritto diversamente in questa riga.
Modello di applicazione
  • Per ogni paziente possono essere applicate fino a 200 risorse per il consenso di active alla volta.
  • In ogni negozio possono essere applicate contemporaneamente fino a 200 norme di amministrazione active.
  • uno speciale formato compatto per l'insieme di tutte le direttive relative al consenso di tutti i consensi attivi per un determinato paziente non deve superare una soglia prestabilita di dimensioni; in genere c'è una capacità sufficiente per codificare migliaia di direttive di consenso, a meno che le stringhe delle risorse molto lunghe non siano particolarmente abbondanti. Ad esempio:
    • Centinaia di consensi su origini dati e tag dati univoci, ognuno dei quali è molto lungo, occupano molto spazio.
    • Un singolo paziente con 3000 voci univoche di identificatore di risorsa Consent.provision.data.reference in molti consensi attivi, ognuno dei quali specifica un Consent.provision.actor univoco utilizza lo spazio in modo più aggressivo rispetto alle disposizioni che non specificano alcun vincolo di riferimento ai dati o che comunque contengono molte delle stesse stringhe di riferimento degli attori.
  • Ogni risorsa può avere fino a 1000 direttive relative al consenso di tutti i consensi applicabili.
X-Consent-Scope
  • Da un minimo di una a un massimo di tre voci actor.
  • Massimo una voce purp:
    • Ogni voce purp deve essere nel formato system/code (v3 è il sistema registrato per http://terminology.hl7.org/CodeSystem/v3-ActReason).
    • La lunghezza del codice deve essere inferiore a 13 caratteri.
  • Massimo una voce env:
    • Ogni voce env deve essere nel formato system/code.
    • La lunghezza combinata del sistema e del codice deve essere inferiore a 15.
  • btg richiede almeno una voce actor.
  • bypass richiede almeno una voce actor e una voce env.
Metodi supportati
Prestazioni
  • ApplyConsents e ApplyAdminConsents scalano in modo simile o migliore rispetto a ImportResources.
  • In merito alle richieste sensibili al consenso:
    • Il nostro modello di consenso è stato ottimizzato per garantire le prestazioni di applicazione delle operazioni CRUD, inclusa la ricerca su larga scala su molte risorse e molti pazienti.
    • La lettura di singole risorse può avere un impatto marginale sulla latenza delle richieste, tuttavia le prestazioni della ricerca variano in base alla query di base e al numero di ambiti di consenso, il che comporta l'attivazione di un maggior numero di criteri di accesso durante una ricerca.
    • Ti consigliamo di eseguire i tuoi test delle prestazioni su una serie di parametri rappresentativi di richieste FHIR per determinare le caratteristiche delle prestazioni per i tuoi casi d'uso in base alle caratteristiche dei tuoi dati, ad esempio quante risorse di un determinato tipo di risorsa di ricerca si trovano nel datastore FHIR.
    • La nostra soluzione è molto leggera e mantiene l'importazione e gli aggiornamenti di tutte le risorse, incluse le risorse per il consenso, in modo che la velocità effettiva durante l'importazione e altre forme di traffico di scrittura possano procedere con l'impatto minimo.

Best practice

Le seguenti sezioni descrivono le best practice quando si utilizza il controllo dell'accesso FHIR.

Best practice generali

  • Non importare le risorse FHIR e chiamare ApplyConsents o ApplyAdminConsents in parallelo. Ti consigliamo di importare prima le risorse FHIR e di chiamare ApplyConsents o ApplyAdminConsents. Tuttavia, se le risorse da utilizzare importati non includono risorse per il paziente o il consenso, modello di applicazione non sarà interessato consensi in elaborazione o criteri amministrativi non è necessaria.

  • Non creare ricerche personalizzate e chiamare ApplyConsents in parallelo. Ti consigliamo di farlo una volta l'altra.

  • Se i tuoi flussi di lavoro richiedono di chiamare più ApplyConsents in modalità disgiunte PatientScope, possono essere chiamate in parallelo.

  • ApplyAdminConsents può essere eseguito in parallelo con un numero qualsiasi di ApplyConsents, ma non con un altro ApplyAdminConsents.

  • Quando configuri il proxy, limita l'account di servizio IAM con autorizzazioni di sola lettura per evitare di scrivere i dati di un paziente nei record di un altro paziente.

  • Non utilizzare il proxy per il consenso durante la creazione o l'aggiornamento dei record.

  • Convalida tutte le richieste di scrittura per impedire modifiche impreviste dati tra pazienti.

  • Quando vengono applicati i consensi a cascata, le risorse di base del compartimento devono essere importato seguito dalle rimanenti risorse del compartimento. In alternativa, tutti le risorse del compartimento possono essere aggregate in un singolo bundle e importate utilizzando fhir.executeBundle.

Elimina risorsa Patient

Quando elimini una risorsa Paziente, se vuoi rimuovere anche il consenso per il paziente (soprattutto quando FhirStore.disableReferentialIntegrity è vera), ti consigliamo di seguire in questo ordine di operazioni:

  1. Elimina tutte le risorse per il consenso appartenenti alla risorsa Paziente.

  2. Chiama ApplyConsents con il filtro PatientScope.

Per configurare uno store esistente per l'accesso al consenso, completa questi passaggi:

  1. Utilizza UpdateFhirStore per impostare ConsentConfig con l'applicazione del consenso version su V1 e imposta accessEnforced su true.

    curl -X PATCH \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
          'consentConfig': {
            'version': 'V1',
            'accessEnforced': true
          }
        }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
  2. Elabora i consensi dei pazienti o le norme per gli amministratori

    1. ApplyConsents per il consenso dei pazienti
    curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{'validateOnly': false}" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
    1. ApplyAdminConsents per i criteri amministrativi e i criteri amministrativi gerarchici.
    curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
          'newConsentsList': {
              'names': [
              'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_1/_history/VERSION_ID_1',
              ...
              'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_N/_history/VERSION_ID_N'
              ]
          },
          'validateOnly': false
        }" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

Frequenza di esecuzione di applyConsents o applyAdminConsents

  • Se il campo ConsentConfig non viene configurato: il campo ConsentConfig non è impostato sia alla prima creazione di un datastore FHIR sia quando il campo ConsentConfig è stata cancellata. Una volta annullata l'impostazione del campo ConsentConfig, devi ripetere la procedura configurare lo store per l'accesso al consenso prima di effettuare richieste sensibili al consenso per evitare di valutare il consenso non aggiornato criteri di applicazione delle norme.

  • Quando cambia il modello di applicazione: quando viene creata, aggiornata o eliminata una risorsa per il consenso, il modello di applicazione cambia. In questi casi, devi chiamare ApplyConsents o ApplyAdminConsents per rendere effettive queste modifiche.

    • Se puoi tenere traccia delle modifiche apportate ai pazienti con consenso, di utilizzare il filtro PatientScope per evitare la rielaborazione dell'intero store. Questo filtro è utile per aggiornare immediatamente l'applicazione forzata di un gruppo di pazienti.

    • Puoi anche eseguire ApplyConsents periodicamente utilizzando l'app TimeRange filtro. Questo filtro è utile quando l'aggiornamento immediato non è fondamentale. Ad esempio, la seguente richiesta aggiorna l'applicazione delle modifiche al consenso tra le ore 00:00 UTC del 20/09/2022 e le ore 00:00 UTC del 21/09/2022.

      curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
           'validateOnly': false,
           'timeRange': {
             'start': '2022-09-20T00:00:00Z',
             'end': '2022-09-21T00:00:00Z',
           }
          }" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

Passaggi successivi