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

Questa pagina descrive come utilizzare le 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 la versione di applicazione del consenso utilizzata per il datastore FHIR. Questo valore può essere impostato una sola volta da CreateFhirStore o UpdateFhirStore. Dopo averlo impostato, devi chiamare ApplyConsents o ApplyAdminConsents per cambiare la versione.

    • access_enforced: se il criterio viene impostato su true, quando si accede alle risorse FHIR, le intestazioni del consenso fornite verranno verificate in base alle istruzioni relative al consenso fornite dai consumatori.

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

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 ConsentConfig con l'applicazione del consenso version come 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. Lo scopo e l'utilizzo dei campi delle risorse sono descritti nella documentazione sul modello di dati.

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

Crea risorse FHIR

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

  • Una risorsa Professionista dal 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'Happy Hospital
  • Una risorsa di osservazione che mostra la misurazione del glucosio di Darcy (LOINC15074-8).
  • Un consenso di Darcy a permettere a Jeffrey Brown di utilizzare l'applicazione App/123 per accedere ai suoi dati raccolti dall'Happy Hospital
  • Un consenso di Darcy a permettere a Jeffrey Brown di accedere a qualsiasi suo dato per scopi di trattamento di emergenza (ETREAT)
  • Un consenso dell'Happy Hospital per consentire a Jeffrey Brown di accedere a tutti i dati quando esegue ricerca biomedica (BIORCH) con la richiesta 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 mostra come possono essere rappresentati criteri complessi.

{
  "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 concede l'autorizzazione a un professionista f002 allo scopo di fornire un trattamento regolare rappresentato da TREAT. Il professionista appartiene alla geolocalizzazione iso3166-1/CA. Questa risorsa per il consenso consente al professionista di accedere ai dati dei pazienti 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):
    • Ha 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 il criterio di amministrazione che concede l'autorizzazione a un professionista f002 allo scopo di fornire un trattamento regolare rappresentato da TREAT. Il professionista proviene dalla geolocalizzazione iso3166-1/CA. Questa risorsa per il consenso consente al professionista di accedere ai dati dei pazienti se 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:
    • Ha 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 il criterio a cascata che concede l'autorizzazione a un professionista f002 allo scopo di fornire il trattamento regolare rappresentato da TREAT. Il professionista proviene dalla geolocalizzazione iso3166-1/CA. Questa risorsa per il consenso consente al operatore di accedere ai dati del compartimento dei pazienti con tag employee. Tutti i criteri delle risorse si applicano solo alle risorse di base del compartimento, ovvero alla risorsa Paziente, in quanto controlla da quali risorse passare a cascata.

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 tenere traccia dello stato dell'operazione, puoi utilizzare il [metodo dell'operazione "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.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 indicava che il server ha elaborato correttamente 2 consensi e aggiornato l'accesso consensuale a 5 risorse (1 paziente, 2 consensi, 2 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 tenere traccia dello stato dell'operazione, puoi utilizzare il [metodo dell'operazione "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 ha indicato che il server ha elaborato correttamente 1 criterio di amministrazione e ha aggiornato l'accesso consensuale a 7 risorse (1 medico, 1 paziente, 2 osservazioni, 2 consensi dei pazienti e 1 criterio di amministrazione).

L'applicazione dei consensi archiviati all'interno di un datastore FHIR non entrerà in vigore fino a quando ApplyConsents (per i consensi dei pazienti) o ApplyAdminConsents (per i criteri di amministrazione e i criteri a cascata di amministrazione) non vengono chiamati e vengono completati correttamente. Se aggiungi, modifichi o rimuovi i consensi dopo aver eseguito ApplyConsents o ApplyAdminConsents, devi eseguirli di nuovo affinché questi consensi siano inclusi nel modello di applicazione.

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

Se è la prima volta che configuri l'applicazione del consenso nell'archivio FHIR, attendi il completamento dell'operazione a lunga esecuzione ApplyConsents o ApplyAdminConsents prima di effettuare richieste di consenso.

Per chiamare ApplyConsents su un sottoinsieme di pazienti, puoi utilizzare i seguenti 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, un elenco vuoto annullerà l'applicazione di tutti i criteri amministrativi del negozio. Ogni criterio deve essere un nome di versione della risorsa se l'archivio FHIR utilizza il controllo delle versioni, e un nome di risorsa negli altri casi.

Puoi utilizzare operations.get per recuperare il valore ProgressCounter dell'operazione. Al termine, c'è una richiesta ApplyConsentsResponse che è inclusa in 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 o, 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 non è riuscita a reindicizzarla. Ciò potrebbe influire sulla ricerca con contesto del consenso, ma non su altri metodi. Per vedere i dettagli dell'errore, puoi visualizzare i log degli errori in Cloud Logging.

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

Per i criteri di amministrazione, CheckConsentEnforcementStatus può essere utilizzato solo per controllare lo stato di applicazione di un singolo criterio di amministrazione del consenso. In alternativa, puoi utilizzare fhirStores.get per visualizzare tutti i criteri di amministrazione 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 Consenso in cui la risorsa Consenso non è mai stata elaborata.

  • ENFORCEABLE: lo stato in cui la risorsa Consenso è stata elaborata correttamente.

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

  • UNSUPPORTED: lo stato di una risorsa per il consenso che può essere conforme alle specifiche FHIR, ma non è applicabile. Ciò è dovuto all'implementazione limitata dell'applicazione del consenso FHIR con l'attuale livello di supporto delle funzionalità.

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

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

    • La dimensione delle istruzioni di consenso in tutti i consensi attivi è superiore a quella massima consentita delle istruzioni di consenso per un server FHIR 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 ricerca. La risposta contiene solo le risorse per le quali è stato dato il consenso.

  1. Il medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) che utilizza 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. Il medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) che utilizza l'applicazione App/123 cerca in tutte le osservazioni del paziente 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 concatenata. Poiché allo scenario di consenso actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 viene negato l'accesso per la risorsa Patient Darcy (identificata da Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2), il server FHIR non restituisce alcuna osservazione del paziente come se quest'ultimo non esistesse.

  5. Il medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) che utilizza l'applicazione App/123 cerca in tutte le osservazioni provenienti dal paziente Darcy ai fini di trattamenti 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. Il medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) cerca nelle osservazioni con status=final per due scopi: trattamento 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 professionista Jeffrey Brown dovrebbe rimuovere uno scopo non necessario da "X-Consent-Scope" nella richiesta.

  9. Un amministratore IT di un ospedale utilizza bypass per cercare tutti i medici dell'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. 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/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 in un determinato archivio FHIR con actor, purpose e environment come parametri di ricerca. La risposta contiene solo le risorse per le quali è stato dato il consenso.

  1. Il medico 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 dato il consenso, 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
      }
    }
    
  3. Il medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) che utilizza l'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 al confine del richiedente ("App/sconosciuto") 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. Il medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) che esegue ricerche biomediche utilizzando l'applicazione App/golden legge la data di nascita di Darcy (in questo 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é al richiedente è stato dato il consenso, la risposta corrisponde al contenuto della risorsa Paziente.

    {
      "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. Il medico Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) richiede l'accesso non autorizzato di emergenza alla registrazione di un paziente utilizzando il protocollo "infranto". (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 salta i controlli del consenso. 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 nell'API Cloud Healthcare e il modo in cui l'accesso alle risorse viene applicato quando si effettua una richiesta di consenso.

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

Imposta intestazione HTTP

Gli ambiti di consenso vengono passati all'API Cloud Healthcare utilizzando l'intestazione HTTP X-Consent-Scope. L'API Cloud Healthcare utilizza questa intestazione per applicare 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. In una determinata richiesta FHIR è possibile includere fino a tre voci di actor, una tra purp e una tra env.

Per ambiti speciali, una richiesta FHIR può supportare uno tra btg o bypass.

Imposta le intestazioni HTTP per le applicazioni attendibili

Questa sezione è necessaria solo se utilizzi un server di autorizzazione controllato dal cliente. In questo caso, devi utilizzare anche un SMARTproxy o un proxy simile.

Alcune applicazioni attendibili potrebbero effettuare chiamate direttamente all'API Cloud Healthcare con gli ambiti di consenso nell'intestazione HTTP specificata. Questo consente l'applicazione diretta del consenso senza che sia necessario un SMARTproxy o un altro proxy per effettuare la conversione tra server di autorizzazione esterni e Google Cloud.

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

Un utente attendibile o un'applicazione attendibile potrebbe utilizzare anche le voci dell'ambito btg o bypass, soggette a revisione successivi all'audit.

L'API Cloud Healthcare fornisce supporto integrato per l'applicazione del consenso FHIR in base agli ambiti del consenso di input. Gli amministratori degli archivi FHIR sono responsabili della creazione e della configurazione di un server di autorizzazione al di fuori dell'API Cloud Healthcare che concede ambiti di consenso.

Esempio di token di accesso

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 il seguente 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à:

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

  • Consente all'implementazione FHIR nell'API Cloud Healthcare di includere token di accesso sensibile al consenso come parte del modello di gestione e di autorizzazione dell'API Cloud Healthcare.

  • 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 attraverso un server di autorizzazione JWT di tua proprietà.

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

  4. L'API Cloud Healthcare riceve le intestazioni e le convalida per applicare le direttive di consenso alla richiesta. L'API Cloud Healthcare restituisce quindi 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. Presta cauzione quando condividi un account di servizio con più client per i seguenti motivi:

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

Audit log

Gli audit log vengono generati quando è presente una richiesta di accesso o quando l'applicazione forzata dell'accesso alle risorse cambia.

Accedi agli audit log

Se gli audit log sono abilitati nel datastore FHIR, negli audit log disponibili in Cloud Logging viene incluso un campo di metadati consentMode. consentMode può avere uno dei seguenti valori:

  • off: la configurazione del datastore FHIR ha il valore consentConfig.accessEnforced impostato su false e non consente richieste di 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: il datastore FHIR ha consentConfig.accessEnforced impostato su true ed era presente l'intestazione dell'ambito del consenso. Di conseguenza, i consensi sono stati valutati e applicati 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 è destinata a essere utilizzata solo per le emergenze ed è soggetta a revisione successiva all'audit.

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

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

Audit log delle modifiche dell'applicazione forzata degli accessi

Quando la risorsa di base del vano cambia (ad esempio, viene rimosso il tag employee di un paziente): il controllo dell'accesso alla risorsa modificata e al relativo compartimento potrebbe cambiare a causa del criterio di protezione a cascata dell'amministratore. La reindicizzazione verrà attivata in tutte le risorse del compartimento. L'avanzamento della reindicizzazione per ogni aggiornamento delle risorse di base del compartimento 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 singola per il consenso
  • È 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 combinata del sistema e del codice 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.
  • A ogni negozio possono essere applicati contemporaneamente fino a 200 criteri amministrativi di active.
  • Uno speciale formato compatto per l'insieme di tutte le direttive sul consenso di tutti i consensi attivi per un determinato paziente non deve superare una soglia di dimensioni prestabilita; in genere, è disponibile una capacità sufficiente per codificare migliaia di direttive di consenso, a meno che le stringhe di risorse molto lunghe non siano particolarmente abbondanti. Ad esempio:
    • Centinaia di consensi su origini dati e tag di dati univoci, ognuno dei quali è molto lungo e consuma 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
  • Minimo una e massimo 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 import 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 importare non includono risorse per pazienti o per il consenso, il modello di applicazione non sarà interessato e non sarà necessario elaborare i consensi o i criteri di amministrazione.

  • Non creare ricerche personalizzate e non chiamare ApplyConsents in parallelo. Ti consigliamo di eseguirle una dopo l'altra.

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

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

  • Quando si configura 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 evitare modifiche impreviste dei dati tra pazienti.

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

Elimina risorsa Patient

Quando elimini una risorsa Paziente, se vuoi rimuovere anche l'applicazione del consenso per quel paziente (in particolare quando FhirStore.disableReferentialIntegrity è vera), ti consigliamo di seguire 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 a cascata dell'amministratore.
    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 AppliedAdminConsents

  • Se il campo ConsentConfig non viene configurato: il campo ConsentConfig non viene impostato sia quando viene creato un datastore FHIR per la prima volta sia quando il campo ConsentConfig viene cancellato. Se il campo ConsentConfig non è impostato, devi ripetere la configurazione del datastore per l'accesso al consenso prima di effettuare richieste di consenso per evitare di valutare i criteri di applicazione del consenso non aggiornati.

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

    • Se puoi tenere traccia delle modifiche relative ai pazienti con consenso, ti consigliamo di utilizzare il filtro PatientScope per evitare che venga rielaborato l'intero store. Questo filtro è utile per aggiornare immediatamente l'applicazione forzata di un piccolo gruppo di pazienti.

    • Puoi anche eseguire ApplyConsents periodicamente utilizzando il filtro TimeRange. Questo filtro è utile quando l'aggiornamento immediato non è fondamentale. Ad esempio, la seguente richiesta aggiorna l'applicazione delle modifiche relative al consenso tra UTC 0AM 2022-09-20 e UTC 0AM 2022-09-21.

      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