Article
· Nov 13, 2023 6m de lecture

Utilisation du logiciel FHIR Adapter pour la fourniture de services FHIR sur des systèmes existants - Affichage d'une Ressource

Dans l'article précédent, nous avons vu comment récupérer une ressource stockée dans la base de données de notre HIS particulier, nous allons donc voir aujourd'hui comment ajouter de nouveaux dossiers dans notre HIS dont l'origine est une ressource FHIR reçue dans notre système.

Les opérations CRUD avec FHIR

Une des fonctionnalités principales de FHIR est son support pour les opérations CRUD à travers l'API Rest, ce qui implique que tout système qui fonctionne avec FHIR soit capable de supporter les appels HTTP de type GET, POST, PUT et DELETE. Pour notre article d'aujourd'hui, nous allons voir comment nous pouvons gérer un appel POST vers notre endpoint configuré automatiquement lors de l'installation de FHIR Adapter.

Si nous examinons les spécifications FHIR pour les appels de stockage de ressources, nous verrons qu'elles nous informent que l'URL avec laquelle nous ferons l'appel doit suivre le format suivant :

http(s)://server_url/{endpoint}/{Resource}

Dans notre exemple, nous n'utiliserons pas d'appels sécurisés, nous aurons donc une URL comme la suivante :

http://localhost:52774/Adapter/r4/Patient

Pour enregistrer un nouveau patient, nous devons effectuer un appel POST avec les données de notre patient dans le corps de l'appel. Dans notre cas, le format d'appel sera application/fhir+json bien que nous puissions utiliser sans problème le format XML avec application/fhir+xml.

La sauvegarde de notre ressource "Patient"

Nous avons déjà eu l'occasion de voir dans l'article précédent la définition des ressources " Patient ", nous n'allons donc pas la répéter ici, ce que nous allons voir c'est à quoi ressemblerait notre patient test formaté. Voici notre patient :

{
    "resourceType": "Patient",
    "address": [
        {
            "city": "SALAMANCA",
            "line": [
                "CALLE LAMENTOS 2 1ºA"
            ],
            "postalCode": "45021"
        }
    ],
    "birthDate": "1988-01-23",
    "gender": "F",
    "identifier": [
        {
            "type": {
                "text": "NHC"
            },
            "value": "803987"
        },
        {
            "type": {
                "text": "DNI"
            },
            "value": "87654321F"
        }
    ],
    "name": [
        {
            "family": "SANZ LÓPEZ",
            "given": [
                "REBECA"
            ]
        }
    ],
    "telecom": [
        {
            "system": "phone",
            "value": "699850017"
        },
        {
            "system": "email",
            "value": "rebek1988@hotmail.com"
        }
    ]
}

Comme vous pouvez le voir, c'est une Ressource de type "Patient" que nous enverrons depuis notre Postman vers le point de terminaison de notre serveur :

Bien, nous avons reçu 200 et notre patient a été enregistré dans notre HIS, voyons à quoi ressemble notre tableau "Patient" :

Voici Rebeca qui parfaitement enregistrée dans notre HIS avec l'identifiant que nous avons reçu dans la réponse à notre requête POST. Passons maintenant à notre production pour voir le chemin parcouru par notre message FHIR dans IRIS.

Utilisation de la ressource " Patient " dans IRIS

Jusqu'à présent nous avons vu comment envoyer une ressource FHIR au point de terminaison de notre serveur, voyons comment traduire la ressource FHIR reçue et la transformer pour l'insérer dans notre SIH particulier.

Souvenons-nous de la façon dont nous avons configuré notre production :

Notre message parvient via InteropService et est transmis à ProcessFHIRBP, où FromAdapterToHIS est invoqué pour effectuer l'opération correspondante. Voyons maintenant la trace du message reçu.

Ici nous voyons les détails du message reçu, nous avons reçu la requête HTTP POST vers le point de terminaison Patient, nous voyons aussi que QuickStreamId a une valeur, ce qui indique que notre message est contenu dans un Stream.

Que fera notre BO avec ce message ?

elseif (requestData.Request.RequestPath [ "Patient")
  {
    if (requestData.Request.RequestMethod = "POST")
    {
      If requestData.QuickStreamId '= "" {
        Set quickStreamIn = ##class(HS.SDA3.QuickStream).%OpenId(requestData.QuickStreamId,, .tSC)
        
        set dynamicPatient = ##class(%DynamicAbstractObject).%FromJSON(quickStreamIn)

        set sc = ..InsertPatient(dynamicPatient, .response)
      }      
    }
    elseif (requestData.Request.RequestMethod = "GET")
    {
      set patientId = $Piece(requestData.Request.RequestPath,"/",2)
      set sc = ..GetPatient(patientId, .response)
    }

  }

C'est très simple, nous pouvons rediriger le message vers la méthode appropriée avec les informations disponibles sur la requête reçue, nous vérifions qu'il s'agit d'une requête spécifique de la ressource "Patient" et que la méthode a été POST, nous allons donc récupérer le Stream qui stocke le message et nous allons le transformer en un %DynamicObject, ci-après nous allons le traiter à partir de la méthode InsertPatient, voyons le code de cette méthode :

Method InsertPatient(dynamicPatient As %DynamicAbstractObject, Output patient As Adapter.Message.FHIRResponse) As %Status
{
  Set tSC = $$$OK
  kill pResp
  set pResp=$$$NULLOREF
  set sqlInsert="INSERT INTO his.patient (name, lastname, phone, address, city, email, nhc, postal_code, birth_date, dni, gender) values (?,?,?,?,?,?,?,?,?,?,?)"
  //perform the Insert
  set tSC = ..Adapter.ExecuteUpdate(.nrows, sqlInsert, dynamicPatient.%Get("name").%Get(0).%Get("given").%Get(0), dynamicPatient.%Get("name").%Get(0).%Get("family"), dynamicPatient.%Get("telecom").%Get(0).value, 
    dynamicPatient.%Get("address").%Get(0).%Get("line").%Get(0), dynamicPatient.%Get("address").%Get(0).%Get("city"), dynamicPatient.%Get("telecom").%Get(1).value, dynamicPatient.%Get("identifier").%Get(1).value, 
    dynamicPatient.%Get("address").%Get(0).%Get("postalCode"), dynamicPatient.%Get("birthDate"), dynamicPatient.%Get("identifier").%Get(2).value, dynamicPatient.%Get("gender"))

  set sql="SELECT id, name, lastname, phone, address, city, email, nhc, postal_code, birth_date, dni, gender FROM his.patient WHERE nhc = ?"
  //perform the Select
  set tSC = ..Adapter.ExecuteQuery(.resultSet, sql, dynamicPatient.%Get("identifier").%Get(1).value)
  
  If resultSet.Next() {
    set personResult = {"id":(resultSet.GetData(1)), "name": (resultSet.GetData(2)), 
        "lastname": (resultSet.GetData(3)), "phone": (resultSet.GetData(4)), 
        "address": (resultSet.GetData(5)), "city": (resultSet.GetData(6)),
        "email": (resultSet.GetData(7)), "nhc": (resultSet.GetData(8)),
        "postalCode": (resultSet.GetData(9)), "birthDate": (resultSet.GetData(10)),
        "dni": (resultSet.GetData(11)), "gender": (resultSet.GetData(12)), "type": ("Patient")}
  } else {
    set personResult = {}
  }
  
  //create the response message
  do patient.Resource.Insert(personResult.%ToJSON())
    
    Return tSC
}

Comme vous pouvez le voir, la première chose que nous faisons est l'insertion dans le tableau "Patient" de notre HIS (nous supposons que quelqu'un s'est assuré au préalable que ce patient n'existe pas). Une fois l'insertion terminée, nous exécutons une commande SELECT sur le même tableau pour obtenir l'identifiant généré pour ce patient et pouvoir le renvoyer à l'application cliente ayant envoyé la requête. Pour compléter le message de réponse, nous pouvons récupérer les champs que nous considérons les plus pertinents.

Une fois les données du patient récupérées, nous retournerons à notre BP qui effectuera les transformations nécessaires pour générer une ressource de type Patient que nous pourrons renvoyer au client.

Vous pouvez consulter la transformation dans l'article précédent.

Une fois la Ressource générée, nous allons la transformer en un Stream à inclure dans notre réponse et à renvoyer à l'application cliente :

Comme vous pouvez le voir, c'est vraiment simple, il nous suffit de récupérer les données de la ressource "Patient" et de les insérer dans le tableau correspondant. Enfin, nous retournerons l'objet enregistré de la même manière que nous l'avons fait avec la requête GET.

Dans le prochain article, nous verrons comment traiter un paquet (Bundle) ou un ensemble de ressources. Nous vous remercions de votre attention !

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer