# 1. Fhir-client-net Ceci est un client fhir simple en c# pour s'exercer avec les ressources fhir et les requêtes CRUD vers un serveur fhir.
Notez que pour la majeure partie, l'autocomplétion est activée. [GitHub](https://github.com/LucasEnard/fhir-client-net) - [1. Fhir-client-net](#1-fhir-client-net) - [2. Préalables](#2-préalables) - [3. Installation](#3-installation) - [3.1. Installation pour le développement](#31-installation-pour-le-développement) - [3.2. Portail de gestion et VSCode](#32-portail-de-gestion-et-VSCode) - [3.3. Avoir le dossier ouvert à l'intérieur du conteneur](#33-avoir-le-dossier-ouvert-à-l'intérieur-du-conteneur) - [4. Serveur FHIR](#4-serveur-FHIR) - [5. Présentation pas à pas](#5-présentation) - [5.1. Partie 1](#51-part-1) - [5.2. Partie 2](#52-part-2) - [5.3. Partie 3](#53-part-3) - [5.4. Partie 4](#54-part-4) - [5.5. Conclusion de la présentation](#55-conclusion-de-la-présentation) - [7. Comment commencer le codage](#7-comment-commencer-le-codage) - [8. Ce qu'il y a dans le référentiel](#8-ce-qu'il-y-a-dans-le-référentiel) - [8.1. Dockerfile](#81-dockerfile) - [8.2. .vscode/settings.json](#82-vscodesettingsjson) - [8.3. .vscode/launch.json](#83-vscodelaunchjson) # 2. Préalables Assurez-vous que [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) et [Docker desktop](https://www.docker.com/products/docker-desktop) sont installé. Si vous travaillez à l'intérieur du conteneur, ces modules sont déjà installés.
Si ce n'est pas le cas, utilisez nugget pour installer `Hl7.Fhir.R4`, nous allons utiliser Model et Rest à partir de celui-ci :
[Hl7.Fhir.Model](https://docs.fire.ly/projects/Firely-NET-SDK/model.html) [Hl7.Fhir.Rest](https://docs.fire.ly/projects/Firely-NET-SDK/client.html) # 3. Installation ## 3.1. Installation pour le développement Clone/git tire le repo dans n'importe quel répertoire local, par exemple comme indiqué ci-dessous : ``` git clone https://github.com/LucasEnard/fhir-client-net.git ``` Ouvrez le terminal dans ce répertoire et lancez : ``` docker build . ``` ## 3.2. Portail de gestion et VSCode Ce référentiel est prêt pour [VS Code](https://code.visualstudio.com/). Ouvrez le dossier `fhir-client-net` cloné localement dans VS Code. Si vous y êtes invité (coin inférieur droit), installez les extensions recommandées. ## 3.3. Avoir le dossier ouvert à l'intérieur du conteneur Vous pouvez être *à l'intérieur* du conteneur avant de coder si vous le souhaitez.
Pour cela, il faut que docker soit activé avant d'ouvrir VSCode.
Ensuite, dans VSCode, lorsque vous y êtes invité ( coin inférieur droit ), rouvrez le dossier à l'intérieur du conteneur afin de pouvoir utiliser les composants python qu'il contient.
La première fois que vous effectuez cette opération, cela peut prendre plusieurs minutes, le temps que le conteneur soit préparé. Si vous n'avez pas cette option, vous pouvez cliquer dans le coin inférieur gauche et cliquer sur `press reopen in container` puis sélectionner `From Dockerfile` [Plus d'informations ici](https://code.visualstudio.com/docs/remote/containers) ![Architecture](https://code.visualstudio.com/assets/docs/remote/containers/architecture-containers.png)
En ouvrant le dossier à distance, vous permettez à VS Code et à tous les terminaux que vous ouvrez dans ce dossier d'utiliser les composants c# dans le conteneur. Si vous y êtes invité (coin inférieur droit), installez les extensions recommandées. # 4. Serveur FHIR Pour réaliser cette présentation, vous aurez besoin d'un serveur FHIR.
Vous pouvez soit utiliser le vôtre, soit vous rendre sur le site [InterSystems free FHIR trial](https://portal.live.isccloud.io) et suivre les étapes suivantes pour le configurer. En utilisant notre essai gratuit, il suffit de créer un compte et de commencer un déploiement, puis dans l'onglet `Overview` vous aurez accès à un endpoint comme `https://fhir.000000000.static-test-account.isccloud.io` que nous utiliserons plus tard.
Ensuite, en allant dans l'onglet d'informations d'identification `Credentials`, créez une clé api et enregistrez-la quelque part. C'est maintenant terminé, vous avez votre propre serveur fhir pouvant contenir jusqu'à 20 Go de données avec une mémoire de 8 Go. # 5. Présentation pas à pas La présentation pas à pas du client se trouve à `/Client.cs`.
Le code est divisé en plusieurs parties, et nous allons couvrir chacune d'entre elles ci-dessous. ## 5.1. Partie 1 Dans cette partie, nous connectons notre client à notre serveur en utilisant Fhir.Rest. ``` // Partie 1 // Creation of an htpclient holding the api key of the server as an header var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Add("x-api-key", "api-key"); var settings = new FhirClientSettings { Timeout = 0, PreferredFormat = ResourceFormat.Json, VerifyFhirVersion = true, // PreferredReturn can take Prefer.ReturnRepresentation or Prefer.ReturnMinimal to return the full resource or an empty payload PreferredReturn = Prefer.ReturnRepresentation }; // Création de notre client en utilisant une correcte url var client = new FhirClient("url",httpClient,settings); ``` Afin de vous connecter à votre serveur, vous devez modifier la ligne : ``` httpClient.DefaultRequestHeaders.Add("x-api-key", "api-key"); ``` Et cette ligne aussi : ``` var client = new FhirClient("url",httpClient,settings); ``` L`'url'` est un point de terminaison tandis que l'`"api-key"` est la clé d'api pour accéder à votre serveur. Notez que si **vous n'utilisez pas** un serveur InterSystems, vous pouvez vérifier comment autoriser vos accès si nécessaire.
Comme ça, nous avons un client FHIR capable d'échanger directement avec notre serveur. ## 5.2. Partie 2 Dans cette partie, nous créons un Patient en utilisant Fhir.Model et nous le complétons avec un HumanName, en suivant la convention FHIR, `use` et `family` sont des chaînes et `given` est une liste de chaînes. De la même manière, un patient peut avoir plusieurs HumanNames, donc nous devons mettre notre HumanName dans une liste avant de le mettre dans notre patient nouvellement créé. ``` // Partie 2 // Building a new patient and setting the names var patient0 = new Patient(); patient0.Name.Add(new HumanName().WithGiven("GivenName").AndFamily("FamilyName")); // Creation of our client in the server // It is to be noted that using SearchParams you can check if an equivalent resource already exists in the server // For more information https://docs.fire.ly/projects/Firely-NET-SDK/client/crud.html var created_pat = client.Create(patient0); Console.Write("Partie 2 : Identifiant du patient nouvellement créé : "); Console.WriteLine(created_pat.Id); ``` Après cela, nous devons sauvegarder notre nouveau Patient sur notre serveur en utilisant notre client. Notez que si vous lancez `Client.cs` plusieurs fois, plusieurs Patients ayant le nom que nous avons choisi seront créés.
C'est parce que, suivant la convention FHIR, vous pouvez avoir plusieurs Patients avec le même nom, seul l' `id` est unique sur le serveur.
Vérifier [la documentation](https://docs.fire.ly/projects/Firely-NET-SDK/client/search.html#searching) pour avoir plus d'information.
Il est à noter qu'en utilisant SearchParams vous pouvez vérifier si une ressource équivalente existe déjà sur le serveur avant de la créer.
Pour plus d'information https://docs.fire.ly/projects/Firely-NET-SDK/client/crud.html Nous conseillons donc de commenter la ligne après le premier lancement. ## 5.3. Partie 3 Dans cette partie, nous avons un client qui recherche un patient nommé d'après celui que nous avons créé précédemment. ``` // Part 3 // This gets all the Patient having the exact name "FamilyName" and we take the first one // Note that if you have multiple patients with the same name, you will get only the first one // We advise to use the id, the names, and any other informations for the SearchParams to be sure to get the right patient var q = new SearchParams().Where("name:exact=FamilyName"); Bundle bund = client.Search(q); patient0 = bund.Entry[0].Resource as Patient; Console.Write("Part 3 : Name of the patient we found by searching : "); Console.WriteLine(patient0.Name[0]); // Creation of our patient telecom, here a phone number patient0.Telecom.Add(new ContactPoint(new ContactPoint.ContactPointSystem(),new ContactPoint.ContactPointUse(),"1234567890")); // Change the given name of our patient patient0.Name[0].Given = new List() { "AnotherGivenName" }; Console.Write("Part 3 : Name of the changed patient : "); Console.WriteLine(patient0.Name[0]); Console.Write("Part 3 : Phone of the changed patient : "); Console.WriteLine(patient0.Telecom[0].Value); // Update the patient var update_pat = client.Update(patient0); ``` Une fois que nous l'avons trouvé, nous ajoutons un numéro de téléphone à son profil et nous changeons son prénom en un autre. Maintenant nous pouvons utiliser la fonction de mise à jour de notre client pour mettre à jour notre patient sur le serveur. ## 5.4. Partie 4 Dans cette section, nous voulons créer une observation pour notre patient. Pour ce faire, nous avons besoin de son identifiant, qui est son identifiant unique.
A partir de là, nous remplissons notre observation et ajoutons comme sujet, l'identifiant de notre Patient. ``` // Part 4 // Building of our new observation Observation obsv = new Observation { Value = new Quantity(70, "kg"), Code = new CodeableConcept { Coding = new List { new Coding { System = "http://loinc.org", Code = "29463-7", Display = "Body weight" } }}, Category = new List { new CodeableConcept { Coding = new List { new Coding { System = "http://snomed.info/sct", Code = "276327007", Display = "Body weight" } } }}, Status = new ObservationStatus {}, Subject = new ResourceReference { Reference = "Patient/" + update_pat.Id} }; // Creation of our observation in the server var new_obsv = client.Create(obsv); Console.Write("Part 4 : Id of the observation : "); Console.WriteLine(new_obsv.Id); ``` Ensuite, nous enregistrons notre observation à l'aide de la fonction create. ## 5.5. Conclusion de la présentation Si vous avez suivi ce parcours, vous savez maintenant exactement ce que fait Client.cs, vous pouvez le lancer et vérifier votre Patient et votre Observation nouvellement créés sur votre serveur. Pour le lancer, ouvrez un terminal VSCode et entrez : ``` dotnet run ``` Vous devriez voir des informations sur le Patient créé et son observation. Si vous utilisez un serveur Intersystems, allez à `API Deployement`, autorisez-vous avec la clé api et d'ici vous pouvez OBTENIR par id le patient et l'observation que nous venons de créer. # 7. Comment commencer le codage Ce référentiel est prêt à être codé dans VSCode avec les plugins InterSystems. Ouvrez `Client.cs` pour commencer à coder ou utiliser l'autocomplétion. # 8. Ce qu'il y a dans le référentiel ## 8.1. Dockerfile Un dockerfile pour créer un dot net env pour que vous puissiez travailler.
Utilisez `docker build .` pour construire et rouvrir votre fichier dans le conteneur pour travailler à l'intérieur de celui-ci. ## 8.2. .vscode/settings.json Fichier de paramètres ## 8.3. .vscode/launch.json Fichier de configuration si vous voulez déboguer