שליטה בגישה למשאבי FHIR ב-Cloud Healthcare API

בדף הזה מוסבר איך להשתמש במשאבי הסכמה של FHIR כדי לקבוע את הגישה לנתונים במאגרי FHIR ב-Cloud Healthcare API.

כדי להגדיר מאגר FHIR עם אכיפת הסכמה, מבצעים את השלבים הבאים:

  1. אם עדיין אין לכם מאגר FHIR, אתם צריכים ליצור אותו.

  2. מגדירים את הפרמטרים הבאים של חנות FHIR‏ ConsentConfig כדי להפעיל את אכיפת ההסכמה:

    • version: מציין באיזו גרסה של אכיפת הסכמה נעשה שימוש במאגר FHIR. אפשר להגדיר את הערך הזה רק פעם אחת באמצעות CreateFhirStore או UpdateFhirStore. אחרי ההגדרה, צריך לקרוא ל-ApplyConsents או ל-ApplyAdminConsents כדי לשנות את הגרסה.

    • access_enforced: אם ההגדרה היא true, כשניגשים למשאבי FHIR, הכותרות של ההסכמה שסופקו יאומתו מול הנחיות ההסכמה שניתנו על ידי הצרכנים.

    • consent_header_handling: אם הערך הוא PERMIT_EMPTY_SCOPE (ברירת מחדל), השרת מאפשר בקשות ללא כותרת X-Consent-Scope (או עם כותרת ריקה). אם הערך הוא REQUIRED_ON_READ ו-access_enforced = true, השרת דוחה את כל הבקשות ללא כותרת X-Consent-Scope (או עם כותרת ריקה).

הגדרת מאגר FHIR חדש באמצעות 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores?fhirStoreId=FHIR_STORE_ID"

אתם אמורים לקבל תגובת JSON שדומה לזו:

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

אם כבר יש לכם חנות, משתמשים ב-UpdateFhirStore כדי להגדיר את ConsentConfig עם האכיפה של ההסכמה version כ-V1, ומגדירים את accessEnforced כ-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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"

כללי המדיניות מיוצגים באמצעות משאב ההסכמה. המטרה והשימוש של שדות המשאבים מתוארים במסמכי מודל הנתונים.

הנה דוגמה לכל המשאבים שאפשר ליצור עבור הדוגמה הזו.

יצירת משאבי FHIR

בדוגמה הבאה אפשר לראות איך להריץ [FHIR bundle](/healthcare-api/docs/how-tos/fhir-bundles) כדי לאכלס את המשאבים הבאים:

  • משאב של איש מקצוע בשם Jeffrey Brown
  • משאב Patient עם השם Darcy Smith
  • משאב Observation שמציג מדידה של המוגלובין של Darcy (LOINC718-7) שנאסף על ידי Happy Hospital
  • משאב Observation שמציג מדידת גלוקוז של Darcy (LOINC15074-8).
  • הסכמה מדארסי לאפשר לג'פרי בראון להשתמש באפליקציה App/123 כדי לגשת לנתונים שלה שנאספו על ידי Happy Hospital
  • הסכמה מ-Darcy לאפשר ל-Jeffrey Brown לגשת לכל הנתונים שלה לצורך טיפול חירום (ETREAT)
  • הסכמה מבית החולים Happy Hospital שמאפשרת לג'פרי בראון לגשת לכל הנתונים במסגרת מחקר ביו-רפואי (BIORCH) באמצעות האפליקציה 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "entry": [
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1/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/v1/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/v1/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/v1/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/v1/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/v1/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/v1/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"
}

הדוגמאות הבאות של משאב הסכמה בתקן R4 ממחישות איך אפשר לייצג מדיניות מורכבת.

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

בדוגמה הקודמת מוצג משאב הסכמה של מטופל, שבו המטופל f001 נותן הרשאה לרופא f002 למטרה של מתן טיפול קבוע, שמיוצגת על ידי TREAT. בעל המקצוע מגיע מהמיקום הגיאוגרפי iso3166-1/CA. משאב ההסכמה הזה מאפשר לרופא לגשת לנתוני המטופל אם הנתונים עומדים בכל התנאים הבאים.

  • זהו סוג Encounter עם המזהה Encounter/e001.
  • מקור הנתונים: http://somesystem.example.org/foo
  • התג עומד לפחות באחד מהתנאים הבאים (אפשר לתייג משאבים על ידי הגדרת השדות system ו-code של Meta.tags):
    • יש תג (system = http://terminology.hl7.org/CodeSystem/common-tags ו-code = actionable)
    • יש את שני התגים (‎system = http://example.com/custom-tags ו-‎code = archived) and (‎system = http://example.com/custom-tags ו-‎code = insensitive)
  • יש לו לפחות אחת מתוויות האבטחה הבאות
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality וגם code הוא אחד מהערכים R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode ו-code = PSY.

דוגמה להנחיה במדיניות האדמין

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

בדוגמה הקודמת, משאב ההסכמה של מדיניות האדמין מעניק הרשאה לרופא f002 במטרה לספק טיפול קבוע שמיוצג על ידי TREAT. בעל המקצוע נמצא במיקום הגיאוגרפי iso3166-1/CA. משאב ההסכמה הזה מאפשר לרופא או לרופאה לגשת לנתוני המטופל או המטופלת אם הנתונים עומדים בכל התנאים הבאים:

  • זהו סוג Encounter עם המזהה Encounter/e001.
  • מקור הנתונים: http://somesystem.example.org/foo
  • התג עומד לפחות באחד מהתנאים הבאים:
    • יש תג (system = http://terminology.hl7.org/CodeSystem/common-tags ו-code = actionable)
    • יש את שני התגים (‎system = http://example.com/custom-tags ו-‎code = archived) and (‎system = http://example.com/custom-tags ו-‎code = insensitive)
  • יש לו לפחות אחת מתוויות האבטחה הבאות
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality וגם code הוא אחד מהערכים R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode ו-code = PSY.

דוגמה להנחיה של מדיניות אדמין מדורגת

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

בדוגמה הקודמת מוצג משאב הסכמה של מדיניות אדמין מדורגת שמעניק הרשאה לרופא f002 במטרה לספק טיפול קבוע שמיוצג על ידי TREAT. בעל המקצוע נמצא במיקום הגיאוגרפי iso3166-1/CA. משאב ההסכמה הזה מאפשר לרופא לגשת לנתונים של מטופלים עם התג employee. כל הקריטריונים של המשאבים חלים רק על משאבי הבסיס של התא, כלומר על משאב המטופל, כי הוא קובע אילו משאבים יועברו ממנו.

אכיפת הסכמות של מטופלים או מדיניות אדמין

אכיפת ההסכמות של המטופל על ידי 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

אתם אמורים לקבל תגובת JSON שדומה לזו:

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

התשובה מכילה שם פעולה. כדי לעקוב אחרי סטטוס הפעולה, אפשר להשתמש ב[שיטת `get` של Operation](/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

כשהפעולה מסתיימת, השרת מחזיר תגובה עם סטטוס הפעולה בפורמט JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.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.v1.fhir.ApplyConsentsResponse",
    "consentApplySuccess": "2",
    "affectedResources": "5"
  }
}

התגובה הזו מציינת שהשרת עיבד בהצלחה 2 הסכמות ועדכן את הגישה בהסכמה ל-5 משאבים (1 מטופל, 2 הסכמות, 2 תצפיות).

אכיפת מדיניות האדמין עד 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

אתם אמורים לקבל תגובת JSON שדומה לזו:

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

התשובה מכילה שם פעולה. כדי לעקוב אחרי סטטוס הפעולה, אפשר להשתמש ב[שיטת `get` של Operation](/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

כשהפעולה מסתיימת, השרת מחזיר תגובה עם סטטוס הפעולה בפורמט JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.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.v1.fhir.ApplyAdminConsentsResponse",
    "consentApplySuccess": "1",
    "affectedResources": "7"
  }
}

התשובה הזו מציינת שהשרת עיבד בהצלחה מדיניות אדמין אחת ועדכן את הגישה בהסכמה ל-7 משאבים (1 רופא, 1 מטופל, 2 תצפיות, 2 הסכמות של מטופלים ומדיניות אדמין אחת).

האכיפה של הסכמות שמאוחסנות במאגר FHIR תיכנס לתוקף רק אחרי שהפונקציה ApplyConsents (להסכמות של מטופלים) או ApplyAdminConsents (למדיניות אדמין ולמדיניות אדמין מדורגת) תופעל ותושלם בהצלחה. אם תוסיפו, תשנו או תסירו הסכמות אחרי שתפעילו את הפונקציה ApplyConsents או ApplyAdminConsents, תצטרכו להפעיל אותה שוב כדי שההסכמות האלה ייכללו במודל האכיפה.

משאבי FHIR עוברים אינדוקס באופן אסינכרוני, ולכן יכול להיות עיכוב קל בין השלמת הפעולה של ApplyConsents או ApplyAdminConsents לבין השתקפות מודל האכיפה בתוצאות החיפוש. העיכוב הזה צפוי רק לבקשות חיפוש.

אם זו הפעם הראשונה שאתם מגדירים אכיפת הסכמה במאגר FHIR, צריך להמתין עד שהפעולה ארוכת הטווח ApplyConsents או ApplyAdminConsents תסתיים לפני ששולחים בקשות עם תמיכה מובנית בסטטוס הסכמה.

כדי להתקשר באמצעות ApplyConsents לחלק מהמטופלים, אפשר להשתמש במסננים הבאים:

  • PatientScope: כדי להריץ את ApplyConsents על רשימה של מזהי מטופלים עם עד 10,000 מטופלים

  • TimeRange: כדי להריץ את ApplyConsent על רשימה של מזהי משאבי Patient שמשאבי Consent שלהם מתעדכנים במהלך טווח זמן מסוים

כדי להתקשר אל ApplyAdminConsents: צריך לספק את הרשימה המלאה של כל כללי המדיניות שרוצים להחיל (לא רשימה מצטברת). כתוצאה מכך, רשימה ריקה תבטל את האכיפה של כל מדיניות האדמין בחנות. כל כלל מדיניות צריך להיות שם של גרסת משאב אם מאגר FHIR הוא בעל גרסאות, ושם של משאב אחרת.

אפשר להשתמש בשיטה operations.get כדי לאחזר את ProgressCounter של הפעולה. בסיום התהליך, מוחזר ApplyConsentsResponse שכלול ב-Operation.response. הדלפקים ב-ProgressCounter וב-ApplyConsentsResponse או ב-ApplyAdminConsentsResponse מתוארים בטבלה הבאה.

ProgressCounter ApplyConsentsResponse או ApplyAdminConsentsResponse תיאור
success consentApplySuccess מספר משאבי ההסכמה שהפעולה עיבדה בהצלחה.
failure consentApplyFailure מספר משאבי ההסכמה שלא נתמכים או לא תקינים. אפשר לצפות ביומני השגיאות ב-Cloud Logging או, אם הערך של validateOnly הוא false, לבדוק את סטטוס האכיפה של ההסכמה באמצעות CheckConsentEnforcementStatus או CheckPatientConsentEnforcementStatus כדי לאחזר את פרטי השגיאה.
secondarySuccess affectedResources אם הערך של validateOnly הוא false, הוא מייצג את מספר משאבי ה-FHIR שעברו אינדוקס מחדש בהצלחה בגלל ההשפעה של שינוי ההסכמה.
secondaryFailure failedResources כאשר validateOnly הוא false, הוא מייצג את מספר משאבי ה-FHIR שאולי חל בהם שינוי בהסכמה, אבל לא הצליחו לבצע אינדוקס מחדש. יכול להיות שההגדרה הזו תשפיע על חיפוש עם הקשר הסכמה, אבל לא על שיטות אחרות. כדי לראות את פרטי השגיאה, אפשר לצפות ביומני השגיאות ב-Cloud Logging.

כשמעבדים משאבי הסכמה של FHIR, אפשר להשתמש בממשקי ה-API הבאים כדי לבדוק את סטטוס האכיפה של הסכמה יחידה או של כל ההסכמות של מטופל:

  • CheckConsentEnforcementStatus: מחזירה משאב Parameters (STU3, R4) שמפרט את הפרמטרים הבאים:

    • id: מייצג את מזהה המשאב של משאב ההסכמה

    • lastUpdated: מייצג את הזמן שבו ההסכמה נאכפה לאחרונה

    • versionId: מייצג את מזהה הגרסה שמשמש לאכיפת הסכמה

    • consent-enforcement-status: מייצג את הסטטוס של אכיפת ההסכמה

  • CheckPatientConsentEnforcementStatus: מחזירה Bundle (STU3, R4) של Parameters (STU3, R4) resource שכולל את סטטוס האכיפה של כל ההסכמות של מטופל יחיד

במקרה של מדיניות אדמין, אפשר להשתמש ב-CheckConsentEnforcementStatus רק כדי לבדוק את סטטוס האכיפה של מדיניות אדמין אחת בנושא הסכמה. לחלופין, אפשר להשתמש ב-fhirStores.get כדי לראות את כל מדיניות האדמין הפעילה שחלה על החנות.

הערך של consent-enforcement-status יכול להיות כל אחד מהערכים הבאים:

  • OFF: מייצג את סטטוס האכיפה שמוגדר כברירת מחדל של משאב הסכמה חדש שמעולם לא עבר עיבוד.

  • ENFORCEABLE: המצב שבו משאב ההסכמה עבר עיבוד בהצלחה.

  • INACTIVE: מצב לא פעיל שבו המערכת מתעלמת ממשאב ההסכמה.

  • UNSUPPORTED: המצב של משאב Consent (הסכמה) שעשוי להיות תואם למפרטים של FHIR, אבל לא ניתן לאכיפה. הסיבה לכך היא יישום מוגבל של אכיפת ההסכמה ב-FHIR עם רמת התמיכה הנוכחית בתכונות.

  • ENFORCEMENT_LIMIT_EXCEEDED: המצב שבו פורמט משאב ההסכמה של FHIR ורמת התמיכה במשאב הם ללא שגיאות, אבל אחד או יותר מהתנאים הבאים מתקיימים:

    • למטופל יש קבוצה גדולה של משאבי הסכמה.

    • הגודל של הוראות ההסכמה בכל ההסכמות הפעילות גדול מהגודל המקסימלי המותר של הוראות ההסכמה בשרת FHIR כדי לאכוף אותן.

‫Cloud Healthcare API תומך בחיפושים של משאבי FHIR בחנות FHIR נתונה עם actor,‏ purpose ו-environment כפרמטרים של שאילתות. התשובה מכילה רק את המשאבים שהמשתמש הסכים לשתף.

  1. הרופא המטפל ג'פרי בראון (מזוהה על ידי Practitioner/12942879-f89f-41ae-aa80-0b911b649833) משתמש באפליקציה מהימנה App/123 ומחפש את כל התצפיות עם 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"

    אתם אמורים לקבל תגובת JSON שדומה לזו:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    
  3. הרופא המטפל ג'פרי בראון (מזוהה על ידי Practitioner/12942879-f89f-41ae-aa80-0b911b649833) משתמש באפליקציה App/123 כדי לחפש את כל התצפיות של המטופל דארסי.
  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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"

    אתם אמורים לקבל תגובת JSON שדומה לזו:

    {
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1/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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        }
      ],
      "resourceType": "Bundle",
      "total": 0,
      "type": "searchset"
    }
    

    השאילתה הקודמת היא חיפוש משורשר. מכיוון שהגישה לתרחיש ההסכמה actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 נדחתה עבור משאב המטופל Darcy (שמזוהה על ידי Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2), שרת FHIR לא מחזיר נתוני תצפית מהמטופל, כאילו המטופל לא קיים.

  5. הרופא המטפל ג'פרי בראון (מזוהה באמצעות Practitioner/12942879-f89f-41ae-aa80-0b911b649833) משתמש באפליקציה App/123 כדי לחפש את כל התצפיות של המטופלת דרסי למטרות טיפול חירום.
  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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"

    אתם אמורים לקבל תגובת JSON שדומה לזו:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1/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/v1/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/v1/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/v1/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/v1/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. הרופא המטפל ג'פרי בראון (מזוהה באמצעות Practitioner/12942879-f89f-41ae-aa80-0b911b649833) מחפש את התצפיות עם status=final לשתי מטרות, טיפול ומחקר
  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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"

    אתם אמורים לקבל תגובת JSON שדומה לזו:

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

    במקרה הזה, המטפל ג'פרי בראון צריך להסיר מהבקשה את המטרה המיותרת מהשדה `X-Consent-Scope`.

  9. אדמין IT בבית חולים משתמש ב-bypass כדי לחפש את כל הרופאים בבית החולים.
  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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner?"

    הבדיקות של ההסכמה דולגו כי bypass סופק. אתם אמורים לקבל תגובת JSON שדומה לזו:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    

‫Cloud Healthcare API תומך באחזור משאב FHIR בחנות FHIR נתונה עם actor,‏ purpose ו-environment כפרמטרים של שאילתה. התשובה מכילה רק את המשאבים שהמשתמש הסכים לשתף.

  1. הרופא המטפל ג'פרי בראון (מזוהה על ידי Practitioner/12942879-f89f-41ae-aa80-0b911b649833) משתמש באפליקציה App/123 כדי לקרוא את מדידת ההמוגלובין של המטופל (בדוגמה הזו, 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    מכיוון שהמבקש קיבל הסכמה, התשובה היא התוכן של משאב ה-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. הרופא המטפל ג'פרי בראון (מזוהה על ידי Practitioner/12942879-f89f-41ae-aa80-0b911b649833) משתמש באפליקציה לא ידועה App/unknown כדי לקרוא את מדידת ההמוגלובין של המטופל (בדוגמה הזו, 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    הבקשה נדחית כי הגישה של מגיש הבקשה (`App/unknown`) לא מורשית על ידי ההסכמה של המטופל.

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "Consent access denied or the resource being accessed does not exist",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    
  5. הרופא ג'פרי בראון (מזוהה על ידי Practitioner/12942879-f89f-41ae-aa80-0b911b649833), שעורך מחקר ביו-רפואי באמצעות אפליקציית App/golden, קורא את תאריך הלידה של דרסי (בדוגמה הזו, 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"

    מכיוון שהמבקש קיבל הסכמה, התשובה היא התוכן של משאב המטופל.

    {
      "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. הרופא ג'פרי בראון (מזוהה על ידי Practitioner/12942879-f89f-41ae-aa80-0b911b649833) מבקש גישה לא מורשית לשעת חירום לרשומה של מטופל, באמצעות פרוטוקול 'שבירת הזכוכית'. (בדוגמה הזו, 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    מכיוון ששיטת ההרשאה של ההסכמה היא btg, השרת מדלג על בדיקות ההסכמה. התשובה היא התוכן של משאב התצפית.

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

בקטעים הבאים מוסבר על שיטות אכיפת ההסכמה שנתמכות ב-Cloud Healthcare API, ואיך נאכפת הגישה למשאבים כששולחים בקשה עם תמיכה מובנית בסטטוס הסכמה.

כשמגישים בקשה, שרת ההרשאות אחראי ליצירת טוקנים של גישה עם היקף ההסכמה הרלוונטי.

הגדרת כותרת HTTP

היקפי ההסכמה מועברים אל Cloud Healthcare API באמצעות כותרת ה-HTTP ‏X-Consent-Scope. ממשק Cloud Healthcare API משתמש בכותרת הזו כדי לאכוף בקרת גישה מבוססת-הסכמה לנתונים במאגרי FHIR.

בקשת FHIR יכולה לתמוך במספר מוגבל של היקפי רשומות הסכמה. אפשר לכלול בבקשת FHIR נתונה עד שלושה ערכים של actor, ערך אחד של purp וערך אחד של env.

במקרה של היקפי הרשאות מיוחדים, בקשת FHIR יכולה לתמוך באחת מהאפשרויות הבאות: btg או bypass.

הגדרת כותרות HTTP לאפליקציות מהימנות

הקטע הזה נדרש רק אם משתמשים בשרת הרשאות שנמצא בשליטת הלקוח. במקרה כזה, צריך להשתמש גם ב-SMARTproxy או ב-proxy דומה.

אפליקציות מהימנות מסוימות יכולות לבצע קריאות ישירות ל-Cloud Healthcare API עם היקפי ההסכמה שצוינו בכותרת ה-HTTP. ההגדרה הזו מאפשרת לאכוף את ההסכמה ישירות בלי שיהיה צורך ב-SMARTproxy או ב-proxy אחר כדי לבצע המרה בין שרתי הרשאה חיצוניים לבין Google Cloud.

לדוגמה, יכול להיות שהאפליקציה שלכם רשומה עבור קבוצת משנה של היקפי הרשאות, כמו היקף הרשאות של אפליקציה environment, או שהאפליקציה מציגה ווידג'ט בחירה כדי להגדיר כמה רשומות של היקפי הרשאות, כמו purpose של בעל הגישה.

משתמש מהימן או אפליקציה מהימנה יכולים גם להשתמש בערכי ההיקף btg או bypass, שחלים עליהם ביקורות לאחר ביצוע השינויים.

‫Cloud Healthcare API מספק תמיכה מובנית באכיפת הסכמה של FHIR על סמך היקפי ההסכמה של הקלט. אדמינים של מאגר FHIR אחראים ליצירה ולהגדרה של שרת הרשאות מחוץ ל-Cloud Healthcare API, שמעניק היקפי הרשאה.

דוגמה לטוקן גישה

בדוגמה הבאה מוצג אסימון גישה שמקודד ב-base64:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB

אחרי שמפענחים את אסימון הגישה, אפשר לראות שהוא מכיל את מטען הייעודי (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"
}

הגדרת SMARTProxy

‫SMARTProxy הוא פרוקסי בקוד פתוח מבית Google שמספק את התכונות הבאות:

  • מאפשרת לשרת FHIR של Cloud Healthcare API לקבל ולאמת אסימוני גישה עם תמיכה מובנית בסטטוס הסכמה.

  • מאפשר להטמעת FHIR ב-Cloud Healthcare API לכלול טוקנים של גישה עם תמיכה מובנית בסטטוס הסכמה כחלק ממודל הניהול והרשאות של Cloud Healthcare API.

  • הוא תומך גם בתכונות של טוקנים לתמיכה ב-SMART on FHIR.

כששולחים בקשה לאחזור נתונים מ-Cloud Healthcare API דרך SMARTProxy, מתרחש התהליך הבא:

  1. ‫SMARTProxy מקבל בקשה מלקוח שמכילה אסימון עם תמיכה מובנית בסטטוס הסכמה.

  2. SMARTProxy מאמת את האסימון עם תמיכה מובנית בסטטוס הסכמה באמצעות שרת הרשאות JWT שנמצא בבעלותכם.

  3. ‫SMARTProxy קורא את ההיקפים מהאסימון עם תמיכה מובנית בסטטוס הסכמה ומעביר אותם ל-Cloud Healthcare API דרך כותרת ה-HTTP.

  4. ‫Cloud Healthcare API מקבל את הכותרות ומאמת אותן כדי לאכוף את הנחיות ההסכמה בבקשה. לאחר מכן, Cloud Healthcare API מחזיר תגובה דרך SMARTProxy ללקוח.

הגדרת Google Cloud חשבון שירות

לשרת proxy יכול להיות רק חשבון שירות אחד. Google Cloud אם כמה לקוחות משתמשים באותו שרת proxy, הם ישתמשו באותו חשבון שירות. חשוב לנקוט משנה זהירות כשמשתפים חשבון שירות עם כמה לקוחות, מהסיבות הבאות:

לדוגמה, אם אתם קוראים ל-Cloud Healthcare API ישירות באמצעות חשבון Google שלכם לאימות, יומני הביקורת של Cloud ירשמו את כתובת האימייל שלכם ככתובת האימייל העיקרית. כשמשתמשים בשרת proxy כדי לקרוא ל-Cloud Healthcare API, ה-proxy משתמש בחשבון השירות שלו, וכתובת האימייל של הגורם המבצע היא כתובת האימייל של חשבון השירות. החשבון המקורי לא מוגדר.

יומני ביקורת

יומני ביקורת נוצרים כשמתקבלת בקשת גישה או כשמשתנה אכיפת הגישה למשאבים.

גישה ליומני ביקורת

אם הפעלתם יומני ביקורת במאגר FHIR, שדה המטא-נתונים consentMode ייכלל ביומני הביקורת שזמינים ב-Cloud Logging. הערך consentMode יכול להיות אחד מהערכים הבאים:

  • off: בהגדרות של מאגר FHIR, הערך של consentConfig.accessEnforced הוא false, ולכן לא ניתן לשלוח בקשות עם תמיכה מובנית בסטטוס ההסכמה.

  • emptyScope: הערך של consentConfig.accessEnforced במאגר FHIR הוא true, אבל לא נכלל שורת כותרות של היקף ההסכמה. כתוצאה מכך, לא נאכפו הסכמות.

  • enforced: הערך של consentConfig.accessEnforced במאגר FHIR הוא true, ושורת הכותרות של היקף ההסכמה הייתה קיימת. כתוצאה מכך, ההסכמות הוערכו ונאכפו בבקשה.

  • btg: הבקשה ל-FHIR כללה את btg בכותרת של היקף ההסכמה. כתוצאה מכך, בדיקות ההסכמה דולגו. הבקשה הזו מיועדת לשימוש במקרי חירום בלבד, והיא כפופה לבדיקה לאחר הביצוע.

  • bypass: בבקשת FHIR צוין רק bypass בכותרת של היקף ההסכמה. כתוצאה מכך, דילגנו על בדיקות ההסכמה. הבקשה הזו מיועדת לשימוש בתהליך עבודה מהימן (כמו אדמין או אפליקציה מהימנה, ולא משתמשי קצה), כך שיומן הביקורת הזה שונה מbtg, שמשמש לבדיקות של משילות מידע (data governance).

אפשר גם להגדיר את access_determination_log_config ל-VERBOSE כדי לתעד מידע נוסף על הסיבה לאישור או לדחייה של בקשה.

יומני ביקורת של שינויים באכיפת הגישה

כשמשאב הבסיס של התא משתנה (לדוגמה, אם מסירים תג employee של מטופל): יכול להיות שבקרת הגישה למשאב שהשתנה ולתא שלו תשתנה בגלל מדיניות אדמין מדורגת. הפעולה הזו תפעיל אינדוקס מחדש בכל המשאבים של התא. אפשר לעקוב אחרי התקדמות האינדוקס מחדש של כל עדכון של משאב בסיס בתא באמצעות המסנן jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry" ב-Cloud Logging.

יומן התקדמות לדוגמה של יצירת אינדקס מחדש של קסקדה

{
  "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 הוא הסטטוס של פעולת יצירת האינדקס מחדש, jsonPayload.affectedResources הוא מספר משאבי התאים שיצרו להם אינדקס מחדש, ו-jsonPayload.lastUpdated היא חותמת הזמן של עדכון משאב המטופל. אם הפעולה רק התחילה, האפשרויות jsonPayload.state="STATE_STARTED" ו-jsonPayload.affectedResources לא יופיעו.

מגבלות

בקטע הזה מוצגים האילוצים וההגבלות של FHIR R4, אבל אותם אילוצים והגבלות חלים גם על FHIR STU3.

סוג מגבלות
משאב הסכמה יחיד
  • יש תמיכה רק ב-Consent.provision אחד, ואין תמיכה בהקצאות מרובות או בהקצאות מקוננות.
  • לפחות 1 Consent.provision.actor, לכל היותר 25:
    • הערך של Consent.provision.actor.role חייב להיות http://terminology.hl7.org/CodeSystem/v3-RoleCode.
    • הערך של Consent.provision.actor.code צריך להיות GRANTEE או HPOWATT.
  • לכל היותר 1 Consent.provision.purpose:
    • הערך של Consent.provision.purpose.system חייב להיות http://terminology.hl7.org/CodeSystem/v3-ActReason.
    • הערך של Consent.provision.purpose.code לא ריק ומכיל עד 13 תווים.
  • ‫1 לכל היותר environment:
    • הערך של Consent.provision.extension.url חייב להיות https://g.co/fhir/medicalrecords/Environment.
    • האורך המשולב של המערכת והקוד צריך להיות פחות מ-15 תווים.
  • אם מסננים לפי סוג משאב, Consent.provision.class.system צריך להיות http://hl7.org/fhir/resource-types.
  • אם מסננים לפי מקור נתונים, הערך של Consent.provision.extension.url חייב להיות https://g.co/fhir/medicalrecords/DataSource.
  • אם מסננים לפי תג נתונים, Consent.provision.extension.url צריך להיות https://g.co/fhir/medicalrecords/DataTag.
    • תג נתונים יכול להיות תוסף מורכב, מוטמע ברמה אחת, כדי לתאר מדיניות שתואמת למשאבים עם כל התגים שצוינו (פירוש מצומצם).
    • יש תמיכה ב-5 תגים לכל היותר.
  • לכל היותר 100 ערכים לכל המאפיינים החוזרים, אלא אם צוין אחרת בשורה הזו.
מודל האכיפה
  • לכל מטופל יכולים להיות עד 200 משאבי הסכמה מסוג active שמופעלים בו-זמנית.
  • בכל חנות יכולות להיות עד 200 כללי מדיניות אדמין של active שנאכפים בו-זמנית.
  • פורמט מיוחד וקומפקטי של קבוצת כל הוראות ההסכמה בכל ההסכמות הפעילות של מטופל מסוים לא יכול לחרוג מסף גודל מסוים. בדרך כלל יש מספיק קיבולת לקידוד של אלפי הוראות הסכמה, אלא אם יש הרבה מחרוזות משאבים ארוכות במיוחד. לדוגמה:
    • מאות הסכמות במקור נתונים ייחודי ותגי נתונים, שכל אחד מהם ארוך מאוד, תופסים הרבה מקום.
    • מטופל יחיד עם 3,000 רשומות ייחודיות של מזהי משאבים Consent.provision.data.reference בהרבה הסכמות פעילות, שכל אחת מהן מציינת Consent.provision.actor ייחודי, משתמש במקום בצורה אגרסיבית יותר מאשר הקצאות שלא מציינות אילוצים של הפניה לנתונים או מכילות הרבה מחרוזות הפניה לאותו שחקן.
  • לכל משאב יכולות להיות עד 1,000 הוראות הסכמה מכל ההסכמות שרלוונטיות לו.
X-Consent-Scope
  • לפחות ערך אחד של actor ולכל היותר שלושה ערכים.
  • אפשר להזין רק ערך אחד של purp:
    • כל רשומה של purp צריכה להיות בפורמט system/code (v3 הוא המערכת הרשומה של http://terminology.hl7.org/CodeSystem/v3-ActReason).
    • אורך הקוד צריך להיות קטן מ-13.
  • אפשר להזין רק ערך אחד של env:
    • כל רשומה של env צריכה להיות בפורמט system/code.
    • האורך המשולב של המערכת והקוד צריך להיות פחות מ-15.
  • btg צריך לכלול לפחות רשומה אחת של actor.
  • bypass נדרש לפחות ערך אחד של actor וערך אחד של env.
אמצעי התשלום הנתמכים
ביצועים
  • הערכים ב-ApplyConsents וב-ApplyAdminConsents גדלים באופן דומה או טוב יותר מהערך ב-ImportResources.
    • אם אתם צריכים תפוקה גבוהה יותר, אתם יכולים לפנות אל נציג התמיכה.
  • לגבי בקשות עם תמיכה מובנית בסטטוס הסכמה:
    • מודל ההסכמה שלנו עבר אופטימיזציה כדי לשפר את הביצועים של אכיפת פעולות CRUD, כולל חיפוש בהיקף גדול בקרב משאבים רבים ומטופלים רבים.
    • קריאה של משאבים בודדים עשויה להשפיע באופן שולי על זמן האחזור של הבקשה, אבל ביצועי החיפוש משתנים בהתאם לשאילתת הבסיס ולמספר היקפי ההסכמה שמובילים להפעלה של יותר קריטריונים לגישה במהלך החיפוש.
    • מומלץ להריץ בדיקות ביצועים משלכם על מגוון פרמטרים מייצגים של בקשות FHIR, כדי לקבוע את מאפייני הביצועים של תרחישי השימוש שלכם על סמך מאפייני הנתונים, כמו מספר המשאבים מסוג משאב חיפוש נתון בחנות FHIR.
    • הפתרון שלנו מאפשר להמשיך את ההעברה ואת העדכונים של כל המשאבים, כולל משאבי הסכמה, עם השפעה מינימלית על קצב העברת הנתונים במהלך ההעברה ועל סוגים אחרים של תנועת כתיבה.

שיטות מומלצות

בקטעים הבאים מפורטות שיטות מומלצות לשימוש בבקרת גישה ל-FHIR.

המלצות כלליות

  • אל תייבאו משאבי FHIR ותתקשרו אל ApplyConsents או אל ApplyAdminConsents במקביל. מומלץ לייבא קודם משאבי FHIR ואז לקרוא ל-ApplyConsents או ל-ApplyAdminConsents. עם זאת, אם המשאבים שרוצים לייבא לא כוללים משאבי מטופל או משאבי הסכמה, לא תהיה השפעה על מודל האכיפה ולא יהיה צורך לעבד הסכמות או מדיניות אדמין.

  • אל תיצרו חיפושים בהתאמה אישית ותתקשרו אל ApplyConsents במקביל. מומלץ לבצע אותן אחת אחרי השנייה.

  • אם תהליכי העבודה שלכם מחייבים קריאה לכמה ApplyConsents ב-PatientScope לא רציפים, אפשר לקרוא להם במקביל.

  • אפשר להריץ את ApplyAdminConsents במקביל לכל מספר של ApplyConsents, אבל לא במקביל ל-ApplyAdminConsents אחר.

  • כשמגדירים את ה-proxy, צריך להגביל את חשבון השירות של IAM להרשאות קריאה בלבד, כדי למנוע כתיבה של נתונים של מטופל אחד לרשומות של מטופל אחר.

  • כשיוצרים או מעדכנים רשומות, לא משתמשים בשרת proxy להעברת הסכמה.

  • אימות של כל בקשות הכתיבה כדי למנוע שינוי לא צפוי של נתונים של מטופלים שונים.

  • כשמפעילים את האפשרות 'העברת הסכמה', צריך לייבא קודם את משאבי הבסיס של התאים, ואז את שאר משאבי התאים. אפשרות אחרת היא לארוז את כל משאבי התאים בחבילה אחת ולהעביר אותם באמצעות fhir.executeBundle.

מחיקת משאב של מטופל

כשמוחקים משאב Patient, אם רוצים להסיר גם את אכיפת ההסכמה עבור אותו מטופל (במיוחד אם הערך של FhirStore.disableReferentialIntegrity הוא true), מומלץ לבצע את הפעולות בסדר הבא:

  1. מחיקת כל משאבי ההסכמה ששייכים למשאב המטופל.

  2. מתקשרים אל ApplyConsents באמצעות המסנן PatientScope.

כדי להגדיר חנות קיימת לגישה להסכמה, מבצעים את השלבים הבאים:

  1. משתמשים ב-UpdateFhirStore כדי להגדיר את ConsentConfig עם האכיפה של ההסכמה version כ-V1, ומגדירים את accessEnforced כ-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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
  2. עיבוד הסכמות של מטופלים או מדיניות אדמין

    1. 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
    1. ApplyAdminConsents לגבי מדיניות אדמין ומדיניות אדמין מדורגת.
    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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

כל כמה זמן להריץ את הפונקציות ApplyConsents או ApplyAdminConsents

  • כשהשדה ConsentConfig לא מוגדר: השדה ConsentConfig לא מוגדר גם כשיוצרים מאגר FHIR חדש וגם כשמסירים את ההגדרה של השדה ConsentConfig. אחרי שמבטלים את ההגדרה של השדה ConsentConfig, צריך לחזור על השלבים של הגדרת הגישה לחנות לצורך קבלת הסכמה לפני ששולחים בקשות עם תמיכה מובנית בסטטוס הסכמה, כדי להימנע מהערכה של מדיניות אכיפה לא עדכנית בנושא הסכמה.

  • כשמודל האכיפה משתנה: כשיוצרים, מעדכנים או מוחקים משאב הסכמה, מודל האכיפה משתנה. במקרים כאלה, כדי שהשינויים ייכנסו לתוקף, צריך להתקשר אל ApplyConsents או אל ApplyAdminConsents.

    • אם אתם יכולים לעקוב אחרי השינויים בסטטוס ההסכמה של המטופלים, מומלץ להשתמש במסנן PatientScope כדי להימנע מעיבוד מחדש של כל החנות. המסנן הזה שימושי לרענון מיידי של האכיפה לגבי קבוצה קטנה של מטופלים.

    • אפשר גם להריץ את ApplyConsents מעת לעת באמצעות המסנן TimeRange. המסנן הזה שימושי כשאין צורך ברענון מיידי. לדוגמה, הבקשה הבאה מרעננת את האכיפה של שינויים בהסכמה בין השעות 00:00 UTC ב-20 בספטמבר 2022 לבין השעה 00:00 UTC ב-21 בספטמבר 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

ב-FHIR Consent Viewer מוצגת מדיניות בקרת גישה. הוא מספק טבלה שמכילה היקפי הסכמה שמייצגים כללי בקרת גישה של FHIR.

לפני שמשתמשים ב-FHIR Consent Viewer, צריך לוודא את הדברים הבאים:

כדי לראות את FHIR Consent Viewer, פועלים לפי השלבים הבאים:

המאמרים הבאים