canvas-medical / canvas-plugins

1 stars 0 forks source link

Adds GraphQL data client #81

Closed jrwils closed 1 month ago

jrwils commented 1 month ago

https://canvasmedical.atlassian.net/browse/KOALA-1776

This PR adds a GraphQL client to be used to fetch data from home-app.

Example of how it can be used in a plugin:

from canvas_sdk.events import EventType
from canvas_sdk.protocols import BaseProtocol
from logger import log

from data_access_layer.client import GQL_CLIENT

class Protocol(BaseProtocol):
    RESPONDS_TO = [EventType.Name(EventType.PATIENT_UPDATED)]

    PATIENT_QUERY = """
        query PatientGet($patientKey: String!) {
          patient(patientKey: $patientKey) {
            firstName
            lastName
            birthDate
          }
        }
      """

    PATIENT_CONDITIONS_QUERY = """
        query GetPatientConditions($patientKey: String!) {
          conditions(patientKey: $patientKey) {
            edges {
              node {
                externallyExposableId
                onsetDate
                coding {
                  edges {
                    node {
             display
                      code
                      system
                    }
                  }
                }
              }
            }
          }
        }
    """

    def compute(self):
        log.info(f"Received Patient Created Event for patient key {self.target}")
        log.info(f"Retrieving data about the patient")
        # Get Patient Data
        patient_data = GQL_CLIENT.query(self.PATIENT_QUERY, params={"patientKey": self.target})
        log.info(patient_data)

        # Get Patient's Conditions
        log.info("Getting patient conditions")
        patient_conditions = GQL_CLIENT.query(self.PATIENT_CONDITIONS_QUERY, params={"patientKey": self.target})
        log.info(patient_conditions)

        # Print condition info
        for condition in patient_conditions["conditions"]["edges"]:
            for condition_coding in condition["node"]["coding"]["edges"]:
                log.info(condition_coding["node"]["code"])
                log.info(condition_coding["node"]["system"])
                log.info(condition_coding["node"]["display"])
                log.info("")
        return []