#InterSystems IRIS for Health

0 Abonnés · 382 Publications

InterSystems IRIS for Health™ est la première et la seule plateforme de données au monde conçue spécifiquement pour le développement rapide d'applications de santé afin de gérer les données les plus critiques du monde. Elle comprend de puissantes fonctionnalités prêtes à l'emploi : traitement et analyse des transactions, modèle de données de santé extensible, développement de solutions basé sur FHIR, prise en charge des normes d'interopérabilité de santé, etc. Toutes ces fonctionnalités permettent aux développeurs de créer rapidement de la valeur et des applications révolutionnaires. En savoir plus.

Article Guillaume Rongier · Oct 17, 2022 8m read

Bonjour, chers développeurs !

Dans cet article, je vais vous montrer comment configurer le référentiel FHIR + le serveur d'autorisation OAuth2/serveur de ressources sur IRIS for Health en suivant l'article précédent.

Dans la partie 1, nous vous présentons les préparatifs préliminaires, la configuration du serveur d'autorisation OAuth2 et l'obtention du jeton d'accès.
La partie 2 vous explique comment construire un référentiel FHIR et configurer un client/serveur de ressources OAuth2.

La configuration du référentiel FHIR et le serveur client/ressource OAuth2 que nous allons configurer aujourd'hui peuvent être utilisés séparément de l'instance IRIS du serveur d'autorisation OAuth2 que nous avons configuré dans la partie 1 précédente, ou ils peuvent être co-localisés dans la même instance. Dans cet article, nous allons le configurer dans la même instance que le précédent.

Construction du référentiel FHIR et spécification du nom du client OAuth

La construction d'un référentiel FHIR est décrite dans le document “Installer et configurer un serveur FHIR”.

Dans l'écran suivant, après l'avoir construit, cliquez sur l'URL du point de terminaison /csp/healthshare/fhirserver/fhir/r4 pour ouvrir l'écran de configuration.

Sur l'écran de configuration, saisissez le nom de configuration client OAuth2 que vous allez créer dans le champ Nom du client OAuth. Si vous avez déjà configuré un client OAuth2, veuillez faire correspondre son nom.

Dans cet exemple, nous allons utiliser la chaîne "FHIRResource". Pour la modifier, cliquez sur le bouton "Modifier" dans l'écran ci-dessus, puis sur le bouton "Mettre à jour" pour enregistrer les modifications.

Configuration client OAuth2

Dans ce qui suit, nous allons créer la configuration client OAuth2.

Accédez à Administration du système → Sécurité → OAuth2.0 dans le portail de gestion et sélectionnez "Client " au lieu de "Serveur ", contrairement à la partie précédente 1.

Sur l'écran suivant, cliquez sur "Creation de la Description du Serveur" pour créer la configuration de la connexion au serveur d'autorisation OAuth2. image

Pour le point de terminaison de l'émetteur, la page Description du serveur indique le point de terminaison du serveur d'autorisation configuré dans la partie 1.

Voici l'écran de configuration du serveur d'autorisation OAuth2 configuré dans la partie 1.

image

Pour la configuration SSL/TLS, entrez la configuration SSL/TLS "SSL4CLIENT" que vous avez créée lors de la préparation de la Partie 1.

Après avoir saisi les éléments, exécutez " Découvrir et sauvegarder " pour obtenir les informations du serveur d'autorisation OAuth2 !

image

Si l'accès est réussi, les informations obtenues s'afficheront, comme indiqué ci-dessous. Veuillez noter qu'une erreur peut se produire au cours de ce processus si le certificat SSL spécifiant le nom d'hôte que vous avez préparé précédemment dans la préparation de la partie 1 n'est pas créé correctement et reconnu.

Attention: Même si vous utilisez le fichier docker-container DL dans la partie 1 de cette série, vous pouvez avoir des difficultés à accéder au conteneur IRIS -> conteneur Apache en spécifiant le nom d'hôte. Dans ce cas, vous pouvez résoudre le problème en entrant le nom d'hôte et l'adresse IP de votre machine dans le fichier docker-compose.yml en tant que extra_hosts, comme indiqué ci-dessous.

  extra_hosts:
    - <yourhostname>:<your ip address>

image

image

Une fois que vous avez enregistré la configuration, cliquez sur " Sauvegarder " pour revenir à la page suivante, puis sélectionnez " Configuration client " pour créer la configuration du référentiel FHIR.

Ajout d'une configuration client au client OAuth2

C'est un titre compliqué, mais l'étape suivante consiste à ajouter la configuration client (informations sur le référentiel FHIR spécifique, l'application CSP, etc. que vous souhaitez connecter au serveur d'autorisation OAuth2 en tant que client OAuth2) à la configuration client OAuth2 que vous venez de créer ( avec des informations sur le serveur d'autorisation OAuth2 auquel se connecter).

image

Sur l'écran suivant, cliquez sur " Créer une configuration client " pour afficher l'écran suivant et régler les éléments nécessaires.

Si vous sélectionnez d'abord le type de client = Serveur de ressources, l'écran de saisie sera le même que ci-dessous.

Nom d'applicationFHIRResource: Saisissez la valeur que vous avez entrée pour " Nom du client OAuth " dans la configuration du référentiel FHIR.
Nom du clientIl s'agit du nom du client qui sera enregistré auprès du serveur d'autorisation OAuth2. Il peut être identique au nom de l'application ; cependant, nous avons choisi un nom différent ici.
DescriptionSaisissez une description pour cette configuration.
Type du clientSélectionnez " Serveur de ressources ".
Configuration SSL/TLSSpécifiez la configuration SSL/TLS que vous avez préparée précédemment lors de la préparation de la partie 1.

image

Après avoir rempli le formulaire, cliquez sur le bouton " Enregistrement dynamique et sauvegarde " pour sauvegarder et enregistrer le fichier sur le serveur. C'est un peu confus, mais lorsque le bouton passe de " Enregistrement dynamique et sauvegarde " à " Obtenir les métadonnées de mise à jour et sauvegarder ", l'enregistrement a réussi.

Examinons les informations de configuration de l'autorisation OAuth2 côté serveur et vérifions si elle est enregistrée.

Sur la page Portail de gestion→Administration du système→Gestion de la sécurité→OAuth2.0→Serveur, cliquez sur "Description du client", et vous verrez qu'il est enregistré comme indiqué ci-dessous. image

Confirmez que le nom est celui que vous avez spécifié dans le nom du client.

Dans la première partie, lorsque nous avons testé l'accès à partir de Postman, nous avons copié manuellement l'ID client et la clé privée qui s'affichent plus bas dans l'écran du descripteur client. Cependant, cette fois-ci, ces informations sont transmises au côté client pendant le processus d'enregistrement dynamique.

Accès au référentiel FHIR à partir de Postman en utilisant un jeton d'accès OAuth2

Et enfin, il est temps d'y accéder depuis Postman !

Tout d'abord, nous devons obtenir un jeton d'accès. La méthode de base est la même que celle utilisée à la fin de la partie 1, mais nous devons ajouter un paramètre audience pour indiquer où le jeton d'accès sera émis.

aud=https://[hostname]/csp/healthshare/fhirserver/fhir/r4

Pour l'ajouter spécifiquement dans Postman, ajoutez-le comme paramètre à l'URL du point de terminaison du code d'autorisation comme suit : ( A cause des limitations de l'écran de Postman, vous ne pouvez pas voir tous les paramètres, mais veuillez inclure tous les éléments ci-dessus aud=https://[hostname]/csp/healthshare/fhirserver/fhir/r4 )

Attention : Vous n'avez pas besoin de changer l'ID client et le Secret client que vous entrez dans Postman pour ceux émis dans l'enregistrement dynamique du serveur de ressources plus tôt. Utilisez l'ID et la clé secrète du client émis pour Postman que vous avez ajouté dans la partie 1.

Après avoir obtenu le jeton d'accès, veuillez copier son contenu.

Dans Postman, si vous laissez le TYPE d'autorisation comme OAuth2, vous disposez d'une fonction pour envoyer le jeton d'accès. Toutefois, dans le référentiel FHIR d'IRIS for Health, il est également nécessaire d'envoyer les informations relatives à l'utilisateur et au mot de passe de l'autorisation de base.

À cette fin, lors d'un accès à partir de Postman, le TYPE d'Autorisation (qui est un peu difficile) doit être Basic Auth, le nom d'utilisateur et le mot de passe doivent être saisis, et le jeton d'accès doit être envoyé comme paramètre dans la demande REST au référentiel FHIR.

En détail : tout d'abord, saisissez le nom d'utilisateur et le mot de passe comme indiqué dans l'écran suivant. Ces informations d'utilisateur seront vérifiées pour voir si elles correspondent aux informations d'utilisateur dans le sous jeton d'accès ; il doit donc s'agir du même utilisateur que celui que vous avez saisi lorsque vous avez obtenu le jeton d'accès.

Dans l'onglet Params, pour access_token, entrez la valeur du jeton d'accès que vous venez de saisir pour le paramètre.

Si vous venez de construire le référentiel FHIR, il n'y a pas de données dans le référentiel, mais vous pouvez demander les données du patient !

Pour l'URL de la demande, entrez https://[hostname]/csp/healthshare/fhirserver/fhir/r4/Patient, et sélectionnez GET comme méthode HTTP (comme indiqué dans la figure ci-dessus).

Appuyez sur le bouton "Envoyer" pour soumettre la demande ! Si vous obtenez le Paquet FHIR comme indiqué ci-dessous, vous avez réussi à accéder au référentiel FHIR en utilisant le jeton d'accès !

Pour plus d'informations sur la manière d'enregistrer et de rechercher des données dans le référentiel FHIR, veuillez consulter la documentation et les articles de la communauté IRIS for Health.

Documentation d'IRIS pour la santé 2020.3 Dépôt de ressources

Comment avez-vous réussi à accéder au référentiel FHIR ?

La configuration décrite dans cette série est la plus simple. Dans un projet FHIR réel, le contenu des données à renvoyer dépendra du contenu approuvé par l'utilisateur, ce qui devra être pris en compte et mis en œuvre.

Nous continuerons à tenir la communauté des développeurs informée de FHIR.

0
0 99
Article Lorenzo Scalese · Oct 10, 2022 3m read

L'interopérabilité des soins de santé permet d'améliorer les soins aux patients, de réduire les coûts des prestataires de soins et de fournir une image plus précise aux prestataires. Cependant, avec un si grand nombre de systèmes différents, les données sont formatées de nombreuses manières différentes. De nombreuses normes ont été créées pour tenter de résoudre ce problème, notamment HL7v2, HL7v3 et CDA, mais toutes présentent des inconvénients.

FHIR (Fast Healthcare Interoperability Resources), ou Ressources rapides d'interopérabilité des soins de santé, est un nouveau format pour les échanges des informations médicales qui vise à résoudre ces problèmes. Il est développé par Health Level Seven International (HL7), une organisation qui a également développé HL7v2, HL7v3 et CDA.

Aujourd'hui nous allons explorer comment créer et valider une ressource FHIR en utilisant le schéma FHIR à l'aide d'IntelliSense et de la fonctionnalité de complétion automatique dans VS Code.

Etape 1 : Téléchargement du fichier de schéma JSON pour la validation des ressources sur le site officiel de FHIR https://www.hl7.org/fhir/.

Étape 2: Création d'un dossier (dans cet exemple, j'utilise le dossier Patient et la ressource Patient) et copiage du fichier fhir.schema.json extrait dans le même dossier, puis ouverture du dossier à partir du code VS. 

 

Étape 3: Configurez le code VS pour reconnaître le schéma FHIR en modifiant le fichier setting.json.
Appuyez sur CTRL+SHIFT+P et tapez les paramètres de l'espace de travail JSON
 

Étape 4: Création d'un nouveau fichier patient.fhir.json dans le même dossier.
Appuyez sur Ctrl+Espace et vous obtiendrez tous les attributs des ressources FHIR à travers IntelliSense

#

Ajoutez le type de ressource Patient et tous les attributs liés à la ressource Patient vont apparaître dans l'IntelliSense.

VS Code validera automatiquement la structure et la syntaxe de la ressource.


 

Avec l'aide d'IntelliSense et de la fonction de complétion automatique, nous avons créé et validé notre ressource patient.

Step 5: Affichez la ressource créée dans le serveur FHIR d'InterSystems en utilisant l'API Rest à partir de postman

Récupérer la ressource patient créée en utilisant la méthode "Get"

Félicitations, nous avons créé, validé notre ressource patient et réussi à l'envoyer et la récupérer sur le serveur FHIR d'InterSystems en utilisant postman.
De cette façon, nous pouvons facilement créer et valider n'importe quelle ressource FHIR.

0
0 456
InterSystems officiel Robert Bira · Oct 6, 2022

Il s'agit de la 8ème d'une série de versions qui font partie du programme de prévisualisation pour les développeurs pour la version 2022.2. Les futures versions de prévisualisation devraient être mises à jour toutes les deux semaines et nous ajouterons des fonctionnalités dès qu'elles seront prêtes. De nombreuses mises à jour, correctifs et améliorations ont été ajoutés en 2022.2, dans la gestion SQL, l'intégration cloud, les adaptateurs Kafka et JMS, le chargeur SQL et d'autres domaines. Veuillez partager vos commentaires via la communauté des développeurs afin que nous puissions créer

0
0 60
Article Lorenzo Scalese · Oct 5, 2022 14m read

Bonjour, chers développeurs !

Cet article est le deuxième d'une série sur la façon d'utiliser SUSHI, un outil de création de profils FHIR, en tant que technologie associée à FHIR. Six mois se sont écoulés avant cette deuxième partie.

Dans la précédente partie 1, nous avons abordé les questions suivantes : qu'est-ce que FHIR, qu'est-ce que le profil FHIR, qu'est-ce que FHIR Shorthand ? Et quel genre d'outil est SUSHI ? Que peut-il produire ? Avec des captures d'écran pour des exemples de résultats.

Cet article présente un exemple d'utilisation réelle d'un profil créé avec SUSHI, dans lequel une Extension est ajoutée à une ressource Patient à l'aide de SUSHI, et un nouveau SearchParameter est défini pour l'élément de cette Extension, jusqu'à ce que le nouveau SearchParameter puisse être utilisé dans l'IRIS for Health's FHIR Repositoy jusqu'à ce que le nouveau SearchParameter puisse être utilisé.

Mise à jour de SUSHI

Je suis désolé de m'écarter du sujet principal, mais si vous êtes comme moi et que vous n'avez pas touché à SUSHI depuis un moment, vous devriez mettre à jour SUSHI. Au cours des six derniers mois, SUSHI a fait l'objet d'une importante mise à jour, et la version 2.0.0 est sortie en août. La dernière version au moment de la rédaction de cet article était SUSHI 2.1.1.

Comme décrit dans ce lien, la mise à jour est la commande suivante de même que l'installation.

$ npm install -g fsh-sushi

Vous pouvez vérifier la version en exécutant sushi -version. De même, l'outil IG Publisher, qui crée un ensemble de fichiers HTML pour le Guide de mise en œuvre sur la base des Profils générés par SUSHI, peut être mis à jour en exécutant la commande _updatePublisher.

Création de fichiers FISH

Tout d'abord, créez un projet en utilisant la commande sushi --init comme précédemment. Dans cet article, nous allons modifier le fichier patient.fsh généré par le modèle.

Cette fois, nous ajouterons une extension de type lieu de naissance, qui est une chaîne de caractères String représentant le lieu de naissance du patient, et nous définirons également un SearchParameter pour ce lieu de naissance, afin de pouvoir effectuer une recherche par lieu de naissance du patient !

Ajout d'Extension

Tout d'abord, ajoutez la définition suivante pour ajouter Extension.

Comme dans US Core et JP Core, le type Adresse est habituellement utilisé, mais ici il s'agit simplement du type String

Extension: BirthPlace
Id: birthPlace
Title: "出身地"
Description: "生まれた場所をstring型で表現する"
* ^url = "http://isc-demo/fhir/StructureDefinition/patient-birthPlace" 
* value[x] only string 

Chaque élément correspond à la StructureDefinition d'Extension comme suit. Certains éléments sont placés à plusieurs endroits. Certaines informations, comme la version du fhir de base et la version de cette Extension elle-même, proviennent du fichier sushi-config.yml.

Entrée SUSHIEntrée StructureDefinition correspondante
Extensionsnom
Idid
Titretitle/differencial.element[id=Extension].short
Desctiptiondescription/differencial.element[id=Extension].definition
^urlurl//differencial.element[id=Extension.url].fixedUri
valeur[x]differencial.element[id=Extension.value[x]].type.code

La StructureDefinition réelle d'Extension générée. Il est difficile de créer cela à partir de rien et à la main, mais avec SUSHI, c'est relativement facile.

{
  "resourceType": "StructureDefinition",
  "id": "birthPlace",
  "url": "http://isc-demo/fhir/StructureDefinition/patient-birthPlace",
  "version": "0.1.0",
  "name": "BirthPlace",
  "title": "出身地",
  "status": "active",
  "description": "生まれた場所をstring型で表現する",
  "fhirVersion": "4.0.1",
  "mapping": [
    {
      "identity": "rim",
      "uri": "http://hl7.org/v3",
      "name": "RIM Mapping"
    }
  ],
  "kind": "complex-type",
  "abstract": false,
  "context": [
    {
      "type": "element",
      "expression": "Element"
    }
  ],
  "type": "Extension",
  "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Extension",
  "derivation": "constraint",
  "differential": {
    "element": [
      {
        "id": "Extension",
        "path": "Extension",
        "short": "出身地",
        "definition": "生まれた場所をstring型で表現する"
      },
      {
        "id": "Extension.extension",
        "path": "Extension.extension",
        "max": "0"
      },
      {
        "id": "Extension.url",
        "path": "Extension.url",
        "fixedUri": "http://isc-demo/fhir/StructureDefinition/patient-birthPlace"
      },
      {
        "id": "Extension.value[x]",
        "path": "Extension.value[x]",
        "type": [
          {
            "code": "string"
          }
        ]
      }
    ]
  }
}

Les données d'Extension aux ressources Patient ajoutées avec cette Extension ressembleront à ceci.


  "extension": [
    {
      "url": "http://isc-demo/fhir/StructureDefinition/patient-birthPlace",
      "valueString": "鹿児島"
    }
  ],

Ajout de SearchParamter

Ensuite, ajoutez un SearchParamter afin de pouvoir rechercher des ressources en utilisant l'entrée Extension que vous venez d'ajouter comme clé, mais seules les entrées (≒elements) définies dans le SearchParamter peuvent être recherchées. Ceci est un peu différent des tables SQL.

Le nom de SearchParamter est défini séparément du nom de l'élément, et certains éléments correspondent au nom de l'élément = nom de SearchParameter, comme le sexe dans la ressource Patient, alors que d'autres ne correspondent pas, comme le nom de l'élément = adresse. country -> nom de SearchParamter = Certains ne correspondent pas aux éléments structurés, comme address-country.

Naturellement, les éléments ajoutés à l'extension ne sont pas des SearchParameters par défaut (car vous ne savez pas ce qui sera inclus), mais les extensions qui osent définir l'extension et définir une politique pour les stocker sont souvent des éléments importants.

Ajoutez ce qui suit au fichier patient.fsh pour créer la définition de SearchParameter

Instance: BirthPlaceSearchParameter
InstanceOf: SearchParameter
Usage: #definition
* url = "http://isc-demo/fhir/SearchParameter/patient-birthPlace"
* version = "0.0.1"
* name = "birthPlace"
* status = #active
* description = "出身地検索のパラメータ"
* code = #birthPlace
* base = #Patient
* type = #string
* expression = "Patient.extension.where(url='http://isc-demo/fhir/StructureDefinition/patient-birthPlace').value"
* comparator = #eq

Voici la StructureDefinition générée par SearchParameter. Comme il s'agit d'une définition relativement simple, le mappage avec l'information SUSHI ci-dessus devrait être facile à comprendre.

{
  "resourceType": "SearchParameter",
  "id": "BirthPlaceSearchParameter",
  "url": "http://isc-demo/fhir/SearchParameter/patient-birthPlace",
  "version": "0.0.1",
  "name": "birthPlace",
  "status": "active",
  "description": "出身地検索のパラメータ",
  "code": "birthPlace",
  "base": [
    "Patient"
  ],
  "type": "string",
  "expression": "Patient.extension.where(url='http://isc-demo/fhir/StructureDefinition/patient-birthPlace').value",
  "comparator": [
    "eq"
  ]
}

Les principales composantes de la définition de SearchParameter sont l' expression et le comparateur. L'élément expression décrit l'expression FHIRPath pour le SearchParameter cible. Si vous êtes intéressé par FHIRPath, veuillez vous référer à [cette page officielle](. html).

Définition utilisée cette fois-ci

Patient.extension.where(url='http://isc-demo/fhir/StructureDefinition/patient-birthPlace').value"

Cette expression spécifie Patient.extension dans un ordre hiérarchique selon la structure Json de la ressource Patient, et réduit l'extension avec url=(omitted) par rapport aux multiples extensions qui peuvent exister, et spécifie la valeur de l'extension.

comparator spécifie le type d'expressions de comparaison qui peuvent être utilisées. Pour plus d'informations, voir ici.

Ajout de la définition d'Extension créée dans Patient

Il y a un autre changement important : l'ajout de l'Extension BirthPlace créée dans la ressource Patient. Modifiez la définition de profil MyProfile dans la ressource Patient générée automatiquement à l'origine comme suit : les modifications apportées au paramètre Cardinality de l'élément Name ont été commentées.

Profile: MyPatient
Parent: Patient
Description: "An example profile of the Patient resource."
//* name 1..* MS
* extension contains BirthPlace named birthPlace 0..1

L'Extension nommée "BirthPlace" qui a été ajoutée précédemment est ajoutée dans la ressource Patient avec le nom birthPlace dans le paramètre Cardinality 0..1.

Création de ressources pour des tests en plus de ce qui précède

SUSHI vous permet également de créer des Instances de ressources qui peuvent être utilisées à des fins d'illustration ou autres. Vous pouvez également les utiliser à des fins de test. Vous pouvez également y inclure l'extension que vous venez de définir.

Instance: KamiExample
InstanceOf: MyPatient
Description: "Exemples de ressources Patient "
* nom.family = "Yamada"
* extension[BirthPlace].valueString = "Kagoshima"

Vous verrez quel type de données a été produit dans le test final.

Essayons SUSHI !

Le fichier FSH est prêt ! Maintenant, utilisons la commande SUSHI pour générer chaque fichier de définition à partir du fichier fsh ! Exécutez la commande sushi et elle est réussie si deux Profils (Patient et Extension étendus) et deux Instances (SearchParameter et ressource de modèle) sont générés comme suit.

C:\Users\kaminaka\Documents\Work\FHIR\SUSHI\TestProject\MyProfileProject>sushi .
info  Running SUSHI v2.1.1 (implements FHIR Shorthand specification v1.2.0)
info  Arguments:
info    C:\Users\kaminaka\Documents\Work\FHIR\SUSHI\TestProject\MyProfileProject
info  No output path specified. Output to .
info  Using configuration file: C:\Users\kaminaka\Documents\Work\FHIR\SUSHI\TestProject\MyProfileProject\sushi-config.yaml
info  Importing FSH text...
info  Preprocessed 1 documents with 0 aliases.
info  Imported 2 definitions and 2 instances.
info  Checking local cache for hl7.fhir.r4.core#4.0.1...
info  Found hl7.fhir.r4.core#4.0.1 in local cache.
info  Loaded package hl7.fhir.r4.core#4.0.1
(node:27132) Warning: Accessing non-existent property 'INVALID_ALT_NUMBER' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:27132) Warning: Accessing non-existent property 'INVALID_ALT_NUMBER' of module exports inside circular dependency
info  Converting FSH to FHIR resources...
info  Converted 2 FHIR StructureDefinitions.
info  Converted 2 FHIR instances.
info  Exporting FHIR resources as JSON...
info  Exported 4 FHIR resources as JSON.
info  Assembling Implementation Guide sources...
info  Generated ImplementationGuide-myprofileproject.json
info  Assembled Implementation Guide sources; ready for IG Publisher.

╔════════════════════════ SUSHI RESULTS ══════════════════════════╗
║ ╭───────────────┬──────────────┬──────────────┬───────────────╮ ║
║ │    Profiles   │  Extensions  │   Logicals   │   Resources   │ ║
║ ├───────────────┼──────────────┼──────────────┼───────────────┤ ║
║ │       1       │      1       │      0       │       0       │ ║
║ ╰───────────────┴──────────────┴──────────────┴───────────────╯ ║
║ ╭────────────────────┬───────────────────┬────────────────────╮ ║
║ │      ValueSets     │    CodeSystems    │     Instances      │ ║
║ ├────────────────────┼───────────────────┼────────────────────┤ ║
║ │         0          │         0         │         2          │ ║
║ ╰────────────────────┴───────────────────┴────────────────────╯ ║
║                                                                 ║
╠═════════════════════════════════════════════════════════════════╣
║ FSHing for compliments? Super job!     0 Errors      0 Warnings ║
╚═════════════════════════════════════════════════════════════════╝

C:\Users\kaminaka\Documents\Work\FHIR\SUSHI\TestProject\MyProfileProject>

Les artefacts suivants ont été créés dans le dossier fsh-generated\resource.

nom de fichiercontenu
ImplementationGuide-myprofileproject.jsonImplemamtionGuide, qui résume l'ensemble des contenus présentés ici.
StructureDefinition-MyPatient.jsonStructureDefinition avec Extension ajoutée au Patient
StructureDefinition-birthPlace.jsonStructureDefinition contenant la définition d'Extension birthPlace
SearchParameter-BirthPlaceSearchParameter.jsonFichier de définition de SearchParameter pour le lieu de naissance (birthPlace)
Patient-KamiExample.jsonExemples d'instances de Patient

Importation et test du profil FHIR dans IRIS for Health

Application d'IRIS for Health au référentiel FHIR

Dans l'article précédent, nous avons exécuté _updatePublisher pour générer un groupe de fichiers IG. Dans cet article, nous allons voir comment le fichier StructureDefinitino/SearchParameter peut être importé dans le référentiel FHIR d'IRIS for Health et faire l'objet d'une recherche avec le nouveau SearchParameter.

Pour plus d'informations sur l'importation des profils FHIR, etc., veuillez vous référer à l'article de la communauté des développeurs sur les profils FHIR. Vous pouvez également vous référer à cet article pour plus d'informations sur la façon de construire un référentiel FHIR.

L'importation est ciblée sur les cinq fichiers qui viennent d'être générés.

  • StructureDefinition-MyPatient.json
  • StructureDefinition-birthPlace.json
  • SearchParameter-BirthPlaceSearchParameter.json Il y a trois fichiers. Copiez-les dans un autre dossier, et préparez également un fichier package.json pour gérer l'ensemble des informations du paquet.

package.json

{
  "name": "SUSHI Demo",
  "title": "SUSHI Demo",
  "version": "0.0.1",
  "author": {
    "name": "ISC"
  },
  "fhirVersions": [
    "4.0.1"
  ],
  "bundleDependencies": false,
  "date": "20201208205547",
  "dependencies": {
    "hl7.fhir.r4.core": "4.0.1"
  },
  "deprecated": false
}

Vous pouvez modifier le nom, le titre, l'auteur, la date et d'autres éléments comme vous le souhaitez. (Remarque : lorsque chaque profil est modifié et réimporté dans IRIS, la version doit être modifiée (augmentée) en conséquence. (La version actuelle 2021.1 du référentiel FHIR n'a pas de fonction de suppression des profils, il faut donc veiller à ce que le nombre de profils n'augmente pas trop dans l'environnement de production, etc., en vérifiant le bon fonctionnement dans l'environnement de test et en ne les appliquant ensuite qu'un nombre minimum de fois dans l'environnement de production.)

À partir du portail de gestion IRIS, allez Health -> FHIR Configuration -> Package Configuration et sélectionnez le dossier contenant les quatre fichiers ci-dessus dans Import Package, et vous verrez l'écran suivant.

image

Cliquez sur Import pour terminer l'importation dans IRIS.

Ensuite, créez un nouveau référentiel FHIR sur l'écran de configuration du serveur Server Configuration. (Vous pouvez également ajouter à un référentiel FHIR existant).

image

Test de POSTMAN

POSTEZ la ressource de test qui vient d'être générée par SUSHI. À des fins de vérification, il peut être préférable de générer des données qui incluent d'autres valeurs de birthPlace, ou une ressource Patient qui n'inclut pas de birthPlace en premier lieu.

image

Si birthPlace a été correctement ajouté au SearchParameter dans le référentiel FHIR, la requête GET suivante devrait permettre de récupérer ces informations sur le patient !

GET http://localhost:52785/csp/healthshare/sushi/fhir/r4/Patient?birthPlace=Kagoshima

Obtenez-vous maintenant les bons résultats ? Si le nouveau SearchParameter, birthPlace, n'a pas été ajouté correctement, la première réponse à la requête GET contiendra la ressource OperationOutcome suivante qui contient les informations d'erreur suivantes : "Le paramètre birthPlace n'a pas été reconnu. Vérifiez le message de réponse pour ce message.

              {
            "resource": {
                "resourceType": "OperationOutcome",
                "issue": [
                    {
                        "severity": "error",
                        "code": "invalid",
                        "diagnostics": "<HSFHIRErr>ParameterNotSupported",
                        "details": {
                            "text": "Unrecognized parameter 'birthPlace'. 鹿児島"
                        }
                    }
                ]
            },
            "search": {
                "mode": "outcome"
            }
        },

Résumé

Vous avez vu le processus de création d'un profil (StructureDefinition/SearchParameter) pour FHIR à l'aide de SUSHI et son importation dans le référentiel FHIR d'IRIS for Health pour étendre ses fonctionnalités. Dans ce cas, les éléments ajoutés à Extension ont été ajoutés à SearchParameter, mais il est également possible d'ajouter SearchParameter à des éléments qui existent dans la spécification standard FHIR mais qui ne sont pas encore des SearchParameters.

Bien que le développement très flexible de FHIR permette d'étendre les fonctionnalités de cette manière, il est également important de partager des informations sur le type d'extensions réalisées pour assurer l'interopérabilité, c'est-à-dire de créer des guides de mise en œuvre, etc. Comme nous l'avons vu dans les parties 1 et 2 de cette série, SUSHI est un outil open source très unique et puissant qui couvre les deux côtés de la question.

On espère que ces outils seront combinés avec IRIS for Health pour créer une nouvelle solution FHIR.

Le fichier fsh SUSHI utilisé dans cet article et les fichiers modèles StructureDefinition/SearchParameter générés sont disponibles ici.

0
0 194
Article Lorenzo Scalese · Oct 3, 2022 18m read

Bonjour, chers développeurs !

Dans cette série, je ne vous montrerai pas comment utiliser IRIS for Health, mais plutôt comment utiliser SUSHI, un outil de création de profils FHIR, en tant que technologie associée.

Quand on a les outils adéquats, les informations du profil (spécifications, limitations, extensions, etc.) d'un projet FHIR peuvent être bien organisées et publiées.

Avant de commencer, qu'est-ce que le SUSHI ? Je vais l'expliquer brièvement.

Qu'est-ce que le SUSHI ?

FHIR est un acronyme pour Fast Healthcare Interoperability Resources et est défini comme une norme pour l'l'échange de dossiers médicaux électroniques qui peut être mise en œuvre dans un court délai. REST est une technologie standard de communication web permettant d'échanger un ensemble de données (ressources) au format JSON/XML, très lisible et facile à manipuler.

En simplifiant, l'idée est d'utiliser un format commun pour représenter les données médicales afin de faciliter le transfert et l'échange d'informations entre les systèmes et les établissements.

Il existe plusieurs ressources définies dans FHIR. Par exemple, les informations sur les patients ont une définition appelée Ressource Patient, qui représente les informations sur les patients.

Il existe de nombreux modèles sur le site officiel de FHIR, j'ai donc pensé que je pourrais en extraire quelques-uns.

Par exemple, les données sont exprimées au format JSON de la manière suivante. Le numéro du patient (identifiant), son nom, son sexe, etc. sont représenté.

{
  "resourceType": "Patient",
  "id": "pat1",
  "texte": {
    "statut": "généré",
    "div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n      \n      <p>Patient Donald DUCK @ Acme Healthcare, Inc. MR = 654321</p>\n    \n    </div>"
  },
  "identifiant": [
    {
      "utilisation": "commune",
      "type": {
        "codage": [
          {
            "système": "http://terminology.hl7.org/CodeSystem/v2-0203",
            "code": "MR"
          }
        ]
      },
      "système": "urn:oid:0.1.2.3.4.5.6.7",
      "valeur": "654321"
    }
  ],
  "active": true,
  "nom": [
    {
      "utilisation": "officiel",
      "nom de famille": "Donald",
      "prénom": [
        "Duck"
      ]
    }
  ],
  "sex": "masculin",
  "* snip *"
}

Qu'est-ce que le profil FHIR ?

Dans FHIR, il existe des formats de représentation JSON et XML et des règles concernant les informations à répertorier avec le nom de clé JSON, le type de code à utiliser et le type de structure à utiliser. C'est ce qu'on appelle le Profile FHIR.

Le profil est un terme utilisé de différentes manières.

Au sens le plus large :
Un ensemble de définitions pour les contraintes sur les ressources FHIR et les serveurs FHIR. Un artefact qui le représente.
Au sens plus restreint :
Au sens plus restreint, une ressource de conformité est une ressource à laquelle des contraintes spécifiques ont été appliquées.

Dans ce cas, un profil existe pour chaque ressource (par exemple, Profil de Patient, Profil d'observation)..

Pour plus de détails, veuillez regarder la vidéo du [Sommet virtuel japonais 2021] (https://youtu.be/B-B6ge_0nHg) sur les profils FHIR ici. (environ 20 minutes).

Bien que le site officiel FHIR fournisse des spécifications par défaut pour chaque ressource, le degré de liberté dans l'utilisation de chaque ressource est considérable. Malheureusement, le degré de liberté dans l'utilisation de chaque ressource est très important. Il est difficile de réaliser des échanges de données interopérables avec les ressources telles qu'elles sont. Il est donc important de définir de nouvelles règles pour la description des ressources sur la base de l'"accord" préalable. Cet "accord" et ces "règles" sont équivalents au Guide de mise en œuvre et au Profil.

Les directives de mise en œuvre sont pour la plupart rédigées en texte à l'aide de Word, Excel, HTML, etc. L'une des caractéristiques de FHIR est que le profil FHIR lui-même peut également être exprimé à l'aide de ressources FHIR. Par exemple, il est possible d'exprimer les spécifications au format JSON afin que des produits tels que IRIS for Health puissent intégrer les définitions et étendre les fonctions. D'autre part, le profil est écrit au format JSON, qui peut être traité à l'aide de la ressource StructureDefinition de FHIR.

L'Association HL7 des États-Unis a publié IG Publisher, qui génère automatiquement des directives de mise en œuvre à partir de profils. Grâce à cet outil, vous pouvez générer des fichiers HTML de directives de mise en œuvre au format publié par l'Association HL7. La seconde partie de cet article vous montrera comment procéder.

À titre d'exemple, il s'agit d'une ressource appelée "StructureDefinition" qui représente les conventions de notation pour les Ressources Patient suggérées pour une utilisation standard aux États-Unis, appelée US Core. (Référence)

{
  "resourceType" : "StructureDefinition",
  "id" : "us-core-patient",
  "texte" : {
    "statut" : "extensions",
    "div" : "(snip)"
  },
  "url" : "http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient",
  "version" : "3.1.1",
  "nom" : "USCorePatientProfile",
  "titre" : "Profil du patient de base aux États-Unis",
  "statut" : "active",
  "expérimental" : false,
  "date" : "2020-06-27",
  "éditeur" : "Comité de pilotage HL7 US Realm",
  "contact" : [
    {
      "telecom" : [
        {
          "systéme" : "url",
          "valeur" : "http://www.healthit.gov"
        }
      ]
    }
  ],
  "(snip)"

Il existe également de nombreuses autres ressources qui décrivent le profil FHIR, comme l' [ImplementationGuide] (http://hl7.org/fhir/implementationguide.html) et le [CapabilityStatement] (http://hl7.org/fhir/capabilitystatement.html) qui résume la série de fonctions du serveur FHIR

Qu'est-ce que FHIR Shorthand?

Pour créer un profil FHIR, il suffit de compléter la structure JSON présentée ci-dessus ! Cependant, il serait difficile et fastidieux de le faire manuellement. Je ferais probablement une erreur.

Il existe des applications et des outils pour faciliter ce processus, notamment plusieurs produits commerciaux et des options à code source ouvert. Voir [cette] (https://confluence.hl7.org/pages/viewpage.action?pageId=35718864#ProfileTooling-Editing&AuthoringProfiles) page.

Un exemple est célèbre Forge de Firely aux Pays-Bas, bien que, plus récemment, une ** langue spécifique au domaine pour définir les artefacts FHIR** appelée FHIR Shorthand (lien) soit également devenue largement utilisée.

FHIR Shorthand est une langue qui vous permet de créer un profil FHIR tout en créant un fichier de définition = fichier FSH(fish) (exemple)

Un exemple de fichier FSH est présenté ci-dessous. Le paramètre quote contient le nom de ce profil (Profil : Cance.

Alias: LNC = http://loinc.org
Alias: SCT = http://snomed.info/sct

Profil:  CancerDiseaseStatus
Parent:   Observation
Id:       mcode-cancer-disease-status
Titre:    "Statut de la maladie cancéreuse"
Description: ""Le jugement qualitatif d'un clinicien sur la tendance actuelle du cancer, par exemple, s'il est stable, s'il s'aggrave (progression) ou s'il s'améliore (répond)."
* ^statut = #ébauche
* l'extension contient un EvidenceType nommé evidenceType 0..*
* extension[evidenceType].valueCodeableConcept de CancerDiseaseStatusEvidenceTypeVS (requis)
* statut et code et sujet et effectif[x] et valeurCodeableConcept MS
* bodySite 0..0
* modèle 0..0
* device 0..0
* referenceRange 0..0
* hasMember 0..0
* composant 0..0
* interprétation 0..1
* sujet 1..1
* basé sur la seule référence (ServiceRequest ou MedicationRequest)
 (snip)

Qu'est-ce que SUSHI?

Après avoir expliqué le profil FHIR/FHIR/FHIR Shorthand, il est temps d'expliquer SUSHI.

SUSHI (acronyme de "SUSHI Unshortens SHorthand Inputs") (4) est une implémentation de référence d'un compilateur FSH qui traduit FSH en artefacts FHIR tels que des profils, des extensions et des ensembles de valeurs. SUSHI est installé sur votre propre ordinateur et s'exécute localement à partir de la ligne de commande (Reference)

En bref, lorsque SUSHI traite le fichier FSH(fish) décrivant le FHIR Shorthand mentionné précédemment, des fichiers tels que StructureDefinition seront générés

Voici une illustration, à la fois évidente et quelque peu obscure, montrant comment cela fonctionne ! (Citation) image (Dans cette image, il est décrit le processus (c'est-à-dire la compilation) de traitement du poisson pour faire du sushi, mais le compilateur SUSHI fait la compilation, et le produit fini est constitué d'artefacts FHIR tels que des profils, ce qui est un peu différent.)

J'espère qu'après cette introduction, vous comprenez mieux en quoi consiste le SUSHI.

Allons à l'école FSH

Au lieu d'expliquer ici comment installer et utiliser fondamentalement SUSHI, je vous recommande de visiter le site officiel où vous trouverez une introduction très précise. Le site s'appelle [École FSH] (https://fshschool.org/).

Les ressources (fichiers JSON) telles que StructureDefinition sont générées en utilisant SUSHI, et en utilisant l'outil "IG Publisher" également présenté sur ce site, vous pouvez générer la source HTML qui les combine. Vous pouvez également utiliser l'outil "IG Publisher", également présenté sur ce site, pour générer la source HTML pour l'ensemble d'entre eux.

image

Tout d'abord, nous vous recommandons de suivre le contenu de ce [Tutoriel SUSHI] (https://fshschool.org/docs/tutorials/basic/) pour vérifier les fonctions de base.

Si vous avez des problèmes, vous pouvez vous référer au répertoire FishExampleComplete, qui est la version complète du FSH Tank( !) inclus dans le dossier téléchargeable.

Je l'ai testé dans un environnement Windows, et comme je n'avais pas installé Node.js, j'ai utilisé les informations du site pour m'aider ! De plus, comme le stipule le tutoriel ci-dessous, vous aurez besoin d'un outil appelé Jekyll pour produire des fichiers HTML à l'aide d'IG Publisher.

Avertissement

Avant de passer à la commande suivante : Si vous n'avez jamais exécuté l'IG Publisher, il vous faudra peut-être d'abord installer Jekyll. Consultez la section Installation d'IG Publisher pour plus de détails.

Vous pouvez vous procurer le kit Jekyll sur le site.

Exemple d'exécution de SUSHI

Voici les résultats de l'exécution de la commande SUSHI en utilisant la version complète du tutoriel dans mon environnement. Pour plus d'informations sur la commande, etc., veuillez consulter ce site (Running SUSHI).

>sushi .
info  Running SUSHI v1.2.0 (implémentation de la spécification FHIR Shorthand v1.1.0)
info  Arguments:
info    C:\Users\kaminaka\Documents\Work\FHIR\SUSHI\fsh-tutorial-master\FishExampleComplete
info  Aucune route de sortie spécifiée. Sortie vers .
info  Utilisation du fichier de configuration : C:\Users\kaminaka\Documents\Work\FHIR\SUSHI\fsh-tutorial-master\FishExampleComplete\sushi-config.yaml
info  Importation du texte FSH...
info  Prétraitement de 2 documents avec 3 alias.
info  Importation de 4 définitions et 1 instance.
info  Vérification du cache local pour hl7.fhir.r4.core#4.0.1...
info  Trouver hl7.fhir.r4.core#4.0.1 dans le cache local
info  Paquet téléchargé hl7.fhir.r4.core#4.0.1
(node:26584) Avertissement : Accès à une propriété inexistante 'INVALID_ALT_NUMBER' des exportations du module à l'intérieur d'une dépendance circulaire
(Utilisez `node --trace-warnings ...` pour montrer où l'avertissement a été créé)
(node:26584) Avertissement : Accès à une propriété inexistante 'INVALID_ALT_NUMBER' des exportations du module à l'intérieur d'une dépendance circulaire
info  Conversion des ressources FSH en ressources FHIR...
info  Conversion de 3 StructureDefinitions FHIR.
info  Conversion de 1 ValueSets FHIR.
info  Conversion de 1 instance FHIR
info  Exportation des ressources FHIR en JSON...
info  Exportation de 5 ressources FHIR en JSON.
info  Assemblage des sources du Guide de mise en œuvre...
info  Génération d' ImplementationGuide-fish.json
info  Sources du guide de mise en œuvre assemblées ; prêtes pour l'IG Editeur.

╔════════════════════════ RÉSULTATS DE SUSHI ══════════════════════════╗
║ ╭──────────┬────────────┬───────────┬─────────────┬───────────╮ ║
║ │ Profils │ Extensions │ ValueSets │ CodeSystems │ Instances │ ║
║ ├──────────┼────────────┼───────────┼─────────────┼───────────┤ ║
║ │    2     │     1      │     1     │      0      │     1     │ ║
║ ╰──────────┴────────────┴───────────┴─────────────┴───────────╯ ║
║                                                                 ║
╠═════════════════════════════════════════════════════════════════╣
║ Il n'y a pas mieux que ça !    0 Erreurs      0 Avertissements ║
╚═════════════════════════════════════════════════════════════════╝

Une fois exécuté, il compilera le fichier FSH et affichera le nombre de profils et d'extensions générés au cours du processus. Si tout va bien, seul "info" sera imprimé, sinon " Avertissement et erreur " sera affiché. Les messages d'erreur sont relativement simples et permettent de déterminer facilement l'origine du problème.

Après son exécution, vous pouvez confirmer que le fichier JSON de StructureDefinition a été généré avec succès dans le dossier fsh-generated du dossier du projet.

Ensuite, essayons d'obtenir l'outil IG Publisher à l'aide de la commande "_updatePublisher", de lancer IG Publisher à l'aide de la commande "_genonce", et aussi de générer un groupe de fichiers HTML. Comme le journal d'exécution est long, je vais le sauter.

Après l'exécution, vérifiez le dossier de sortie dans le même dossier de projet, et vous verrez que de nombreux fichiers ont été générés. Et si vous ouvrez le fichier index.html, vous verrez que la page suivante a été développée.

image

Les pages de description des ressources que vous avez l'habitude de voir sur le site officiel de FHIR sont également générées automatiquement. image

Rédigeons un guide de mise en œuvre

Bien que je ne travaille avec cet ensemble d'outils que depuis peu, je voudrais vous montrer comment rédiger un guide de mise en œuvre pour commencer.

Pour plus de détails sur la façon de les utiliser, veuillez vous reporter aux informations figurant sur le site Web de l'école FSH. Les [images FHIR DevDays et autres informations] (https://fshschool.org/downloads/) peuvent également vous être très utiles.

Pour commencer, utilisez la commande sushi --init pour créer un modèle pour la structure de votre projet.

C:\Users\kaminaka\Documents\Work\FHIR\SUSHI\TestProject>sushi --init

╭───────────────────────────────────────────────────────────╮
│ Cet outil interactif utilisera vos réponses pour créer    │
│ un projet SUSHI fonctionnel configuré avec les            │
│ informations de base de votre projet.                     │
╰───────────────────────────────────────────────────────────╯

Nom (par défaut : ExampleIG) : MonPremierProjetSUSHIP
Id (Par default: fhir.example): myfirstsushi
Canoniquel (Par default: http://example.org): http://example.org/myfirstsushi
Statut (Par default: ébauche):
Version (Par default: 0.1.0):
Initialiser le projet SUSHI en C :\Users\kaminaka\Documents\Work\FHIR\SUSHI\TestProject\MyFirstSUSHIProject? [y/n]: y
Téléchargement des scripts de l'éditeur à partir de https://github.com/HL7/ig-publisher-scripts
(node:13972) Avertissement : Accès à une propriété inexistante 'INVALID_ALT_NUMBER' des exportations du module à l'intérieur d'une dépendance circulaire.
(Utilisez `node --trace-warnings ...` pour montrer où l'avertissement a été créé)
(node:13972) Avertissement : Accès à une propriété inexistante 'INVALID_ALT_NUMBER' des exportations du module à l'intérieur d'une dépendance circulaire.

╭───────────────────────────────────────────────────────────╮
│ Le projet a été initialisé à : ./MyFirstSUSHIProject      │
├───────────────────────────────────────────────────────────┤
│ Maintenant, essayez ceci :                                │
│                                                           │
│ > cd MyFirstSUSHIProject                                  │
│ > sushi .                                                 │
│                                                           │
│ Pour des conseils sur la structure et la configuration    │
│ du projet, passez à la documentation SUSHI :              │
│ https://fshschool.org/docs/sushi                          │
╰───────────────────────────────────────────────────────────╯

Après l'avoir exécuté, il générera le minimum de fichiers de configuration et de FSH requis. Maintenant, apportons quelques modifications.

Ensuite, apportons quelques modifications.

Avant cela, je voudrais présenter l'éditeur ; je recommande d'utiliser Visual Studio Code, car il y a une [extension] (https://marketplace.visualstudio.com/items?itemName=kmahalingam.vscode-language-fsh) disponible pour modifier les fichiers fsh.

Puisque c'est ce que je vais faire, j'aimerais entrer quelques informations japonaises et voir comment elles sont reflétées.

Tout d'abord, modifiez sushi-config.yaml.

Le titre du guide d'implémentation est ajouté, l'écran de menu est changé en japonais, et la page de la liste des contenus (tuc.html) et la page personnalisée (mycustompage.html) sont ajoutées.

sushi-config.yaml

# ╭──────────────────────────────────────Guide d'implémentation────────────────────────────────────╮
# │  Les propriétés ci-dessous sont utilisées pour créer la ressource ImplementationGuide. Pour une│
# │  liste des propriétés prises en charge, consultez : https://fshschool.org/sushi/configuration/ │
# ╰────────────────────────────────────────────────────────────────────────────────────────────────╯
id: myfirstsushi
canonique: http://example.org/myfirstsushi
nom: MyFirstSUSHIProject
# Ajoutez un titre qui sera affiché en haut de la page.
Titre: ○○FHIR Guide d'implémentation du projet
statut: ébauche
publisher: InterSystems Japan/S.Kaminaka
description: Il s'agit d'un exemple de guide d'implémentation pour le projet FHIR utilisant SUSHI.
version: 0.1.0
fhirVersion: 4.0.1
copyrightYear: 2021+
releaseLabel: ci-build

# ╭────────────────────────────────────────────menu.xml────────────────────────────────────────────────╮
# │  Pour utiliser un fichier input/includes/menu.xml fourni, supprimez la propriété "menu" ci-dessous.│
# ╰────────────────────────────────────────────────────────────────────────────────────────────────────╯
# Configurez le menu pour qu'il s'affiche en japonais.
menu:
  Guide d'implémentation Accueil: index.html
  Liste de contenu: toc.html
  Résumé des artefacts FHIR: artifacts.html
  Page personnalisée: mycustompage.html

Les pages d'index et les pages personnalisées peuvent être écrites en markdown :

index.md

# MyFirstSUSHIProject

N'hésitez pas à modifier cette page d'index avec votre propre contenu !

### Historique du projet

pagecontent/index.md
Vous pouvez modifier le fichier pour changer la description dans le fichier html.

Pour décrire une page, vous pouvez utiliser la notation markdown.

### Liens vers des informations de référence
 (omission)

mycustompage.md

## C'est une page personnalisée.

Si vous fournissez un fichier markdown, un fichier html sera généré.

Des pages spécifiques au projet peuvent être produites et incluses dans le guide d'implémentation.

Enfin, nous allons modifier le fichier FSH le plus essentiel. Ce modèle contient le fichier FSH pour le profil Patient, nous l'avons donc modifié légèrement.

patient.fsh

// Voici un exemple simple d'un fichier FSH.
// Ce fichier peut être renommé, et des fichiers FSH supplémentaires peuvent être ajoutés.
// SUSHI recherchera les définitions dans tout fichier utilisant la terminaison .fsh.
Profil: MyPatient
Parent: Patient
Titre: "Profil du patient pour le projet ○○"
* nom 1..* MS
// La partie descriptive de la liste peut être modifiée en changeant le ^short.
* name ^short = "Contient le nom du patient.。"
* name ^definition = "Élément permettant de stocker le nom du patient. Kanji et Katakana basés sur NeXEHRS JP CORE"

Exécutez maintenant la commande suivante pour voir la page du guide d'implémentation générée.

sushi.

_updatePublisher

_genonce

Vous pouvez facilement générer une page qui contient les informations suivantes.

Il génère également des fichiers JSON tels que StructureDefinition et ImplementationGuide. image

image

Résumé

Les résultats vous ont-ils satisfait ?

Cet outil génère des fichiers JSON de profils FHIR et peut créer des fichiers HTML. Ainsi, si cet outil est bien utilisé, il sera facile de créer un contenu capable de communiquer les spécifications FHIR d'une manière facile à comprendre.

Bien que cet outil ne soit pas directement lié à InterSystems, nous avons pensé qu'il serait utile de le présenter à la communauté des développeurs pour échanger des informations sur le projet FHIR.

Pour ceux d'entre vous qui l'ont essayé après avoir lu cet article, ou qui le connaissent déjà, je serais heureux d'entendre vos réflexions sur la façon de l'utiliser, ainsi que toute fonctionnalité ou syntaxe utile que vous souhaiteriez partager.

Dans l'article suivant de cette série, je voudrais étendre les paramètres de recherche en lisant le fichier de définition du paramètre de recherche généré par SUSHI dans IRIS for Health.

(2021/4/20 Nous avons corrigé la partie ambiguë de l'explication, notamment en ce qui concerne le profil. Merci de nous l'avoir signalé.)

0
0 452
Article Lucas Enard · Sept 30, 2022 9m read

Dans ce GitHub nous recueillons des informations à partir d'un csv, nous utilisons une DataTransformation pour les transformer en un objet FHIR, puis nous sauvegardons ces informations sur un serveur FHIR, et tout cela en utilisant uniquement Python.

The objective is to show how easy it is to manipulate data into the output we want, here a FHIR Bundle, in the IRIS full Python framework.

1. Fhir-orga-dt

2. Préalables

Assurez-vous que git et Docker desktop sont installé.

Si vous travaillez à l'intérieur du conteneur, comme il est montré dans 3.3., vous n'avez pas besoin d'installer fhirpy et fhir.resources.

Si vous n'êtes pas dans le conteneur, vous pouvez utiliser pip pour installer fhirpy et fhir.resources.
Vérifiez fhirpy et fhir.resources pour plus d'information.

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-python.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.

Ouvrez le dossier fhir-client-python 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 Ouvrir à nouveau dans le conteneur puis sélectionner De Dockerfile

Plus d'informations ici

Architecture


En ouvrant le dossier à distance, vous permettez à VS Code et à tous les terminaux que vous ouvrez dans ce dossier d'utiliser les composants python dans le conteneur.

4. Serveur FHIR

Pour compléter cette présentation, nous allons utiliser un serveur fhir.
Ce serveur fhir était déjà intégré lorsque vous avez cloné et construit le conteneur.

L'url est localhost:52773/fhir/r4

5. Présentation pas à pas

Présentation complète de la réalisation d'IRIS en Python.

5.1. Messages and objects

Les objets et les messages contiennent les informations entre nos services, nos processus et nos opérations.

Dans le fichier obj.py nous devons créer une classe de données qui correspond au csv, ceci sera utilisé pour garder l'information avant de faire la DataTransformation.
Dans notre exemple, le csv organisation.csv ressemble à ceci,

active;name;city;country;system;value
true;Name1;city1;country1;phone;050678504
false;Name2;city2;country2;phone;123456789

Par conséquent, l'objet ressemblera à ceci,

@dataclass
# > Cette classe représente une organisation simple
class BaseOrganization:
    active:bool = None
    name:str = None
    city:str = None
    country:str = None
    system:str = None
    value:str = None

Dans le fichier msg.py, nous aurons deux types de requêtes, la première contenant les informations d'une organisation avant la DataTransformation et la seconde contenant les informations de l'organisation après la DataTransformation.

5.2. Service aux entreprises

Dans le fichier bs.py, nous avons le code qui nous permet de lire le csv et pour chaque ligne du csv (donc pour chaque organisation), le mapper dans un objet que nous avons créé plus tôt. Ensuite, pour chacune de ces lignes (organisation), nous créons une requête et l'envoyons à notre processus pour effectuer la DataTransformation.

# Nous ouvrons le fichier
with open(self.path + self.filename,encoding="utf-8") as csv:
    # Nous le lisons et le mappons en utilisant l'objet BaseOrganization précédemment utilisé
    reader = DataclassReader(csv, self.fhir_type ,delimiter=";")
    # Pour chacune de ces organisations, nous pouvons créer une requête et l'envoyer au processus
    for row in reader:
        msg = OrgaRequest()
        msg.organization = row
        self.send_request_sync('Python.ProcessCSV',msg)

5.3. Service aux entreprises

Dans le fichier bp.py, nous avons la DataTransformation, qui convertit un simple objet python contenant peu d'informations en un objet FHIR R4

Voici les étapes pour effectuer une DataTransformation en utilisant du python embarqué sur notre organisation simple,

# Création de l'objet Organisation
organisation = Organisation()

# Mappage des informations de la demande à l'objet Organisation
organization.name = base_orga.name

organization.active = base_orga.active

## Création de l'objet Adresse et mappage des informations
## de la demande à l'objet Addresse
adresse = Addresse()
adress.country = base_orga.country
adress.city = base_orga.city

### Configuration de l'adresse de notre organisation à celle que nous avons créée
organization.address = [adress]

## Création de l'objet ContactPoint et mise en correspondance
## des informations de la demande avec l'objet ContactPoint
telecom = ContactPoint()
telecom.value = base_orga.value
telecom.system = base_orga.system

### Configuration de la télécommunication de notre organisation à celle que nous avons créée
organization.telecom = [telecom]

# Maintenant, notre DT est achevé, nous avons une organisation d'objets qui est
# un objet FHIR R4 et qui contient toutes nos informations csv.

Après cela, notre mappage est terminé et notre DT fonctionne.
Maintenant, nous pouvons envoyer cette ressource FHIR R4 nouvellement créée à notre FhirClient qui est notre opération.

5.4. Opération d'un entreprise

Dans le fichier bo.py nous avons le FhirClient, ce client crée une connexion à un serveur fhir qui contiendra les informations recueillies par le csv.

Dans cet exemple, nous utilisons un serveur fhir local qui n'a pas besoin d'une clé api pour se connecter.
Pour s'y connecter, nous devons utiliser la fonction on_init,

if not hasattr(self,'url'):
    self.url = 'localhost:52773/fhir/r4'

self.client = SyncFHIRClient(url=self.url)

Maintenant, lorsque nous recevons un message/demande, nous pouvons, en trouvant le type de ressource de la ressource que nous envoyons avec notre demande au client, créer un objet lisible par le client, puis le sauvegarder sur le serveur fhir.

# Obtenez le type de ressource de la demande ( ici "Organisation" )
resource_type = request.resource["resource_type"]

# Créer une ressource de ce type en utilisant les données de la demande
resource = construct_fhir_element(resource_type, request.resource)

# Sauvegarder la ressource sur le serveur FHIR en utilisant le client
self.client.resource(resource_type,**json.loads(resource.json())).save()

Il est à noter que le client fhir fonctionne avec n'importe quelle ressource de FHIR R4 et pour utiliser et modifier notre exemple, nous devons seulement changer la DataTransformation et l'objet qui contient les informations csv.

5.5. Conclusion de la présentation

Si vous avez suivi ce parcours, vous savez maintenant exactement comment lire un csv d'une représentation d'une ressource FHIR R4, utiliser une DataTransformation pour le transformer en un véritable objet FHIR R4 et le sauvegarder sur un serveur.

6. Création d'une nouvelle DataTransformation

Ce référentiel est prêt à être codé en VSCode avec les plugins InterSystems. Ouvrez /src/python pour commencer à coder ou utiliser l'autocomplétion.

Étapes pour créer une nouvelle transformation
Pour ajouter une nouvelle transformation et l'utiliser, la seule chose que vous devez faire est d'ajouter votre csv nommé Patient.csv (par exemple) dans le dossier src/python/csv.
Ensuite, créez un objet dans src/python/obj.py appelé BasePatient qui met en correspondance votre csv.
Maintenant, créez une requête dans src/python/msg.py appelée PatientRequest qui a une variable resource de type BasePatient.
L'étape finale est la DataTransformation, pour cela, allez dans src/python/bp.py et ajoutez votre DT. Ajoutez d'abord if isinstance(request, PatientRequest): puis mappez votre ressource de requête à une fhir.resource Patient.
Maintenant si vous allez dans le portail de gestion et changez le paramètre du ServiceCSV pour ajouter filename=Patient.csv vous pouvez juste démarrer la réalisation et voir votre transformation se dérouler et votre client envoyer les informations au serveur.

Étapes détaillées pour créer une nouvelle transformation
Si vous n'êtes pas sûr de ce qu'il faut faire ou de la manière de le faire, voici une création étape par étape d'une nouvelle transformation :

Créez le fichier Patient.csv and le dossier src/python/csv pour les remplir avec le suivant:

family;given;system;value
FamilyName1;GivenName1;phone;555789675
FamilyName2;GivenName2;phone;023020202

Notre CSV contient un nom de famille, un prénom et un numéro de téléphone pour deux patients.


Dans src/python/obj.py écrivez :

@dataclass
class BasePatient:
    family:str = None
    given:str = None
    system:str = None
    value:str = None


Dans src/python/msg.py écrivez :

from obj import BasePatient
@dataclass
class PatientRequest(Message):
    resource:BasePatient = None


Dans src/python/bp.py écrivez :

from msg import PatientRequest
from fhir.resources.patient import Patient
from fhir.resources.humanname import HumanName

Dans src/python/bp.py dans la fonction on_request écrivez :

if isinstance(request,PatientRequest):
    base_patient = request.resource

    patient = Patient()

    name = HumanName()
    name.family = base_patient.family
    name.given = [base_patient.given]
    patient.name = [name]

    telecom = ContactPoint()
    telecom.value = base_patient.value
    telecom.system = base_patient.system
    patient.telecom = [telecom]

    msg = FhirRequest()
    msg.resource = patient

    self.send_request_sync("Python.FhirClient", msg)


Maintenant si vous allez dans le portail de gestion et changez le paramètre du ServiceCSV pour ajouter filename=Patient.csv vous pouvez juste arrêter et redémarrer la production et voir votre transformation se dérouler et votre client envoyer les informations au serveur.

Settings

7. Ce qu'il y a dans le référentiel

7.1. Dockerfile

Le dockerfile le plus simple pour démarrer un conteneur Python.
Utilisez docker build . pour construire et rouvrir votre fichier dans le conteneur pour travailler à l'intérieur de celui-ci.

7.2. .vscode/settings.json

Fichier de paramètres.

7.3. .vscode/launch.json

Fichier de configuration si vous voulez déboguer.

0
0 126
Article Guillaume Rongier · Sept 28, 2022 23m read

Service Iris Healthtoolkit

Vidéo

Utilisation facile de HL7v2 vers FHIR, CDA vers FHIR, FHIR vers HL7v2 en tant que service.

L'objectif de ce projet est de fournir une API REST capable de convertir facilement divers formats de santé. Publiez le format souhaité dans le corps REST, obtenez la réponse dans le nouveau format.

Installation

Clonez ce référentiel

git clone https://github.com/grongierisc/iris-healthtoolkit-service.git

Docker

docker-compose up --build -d

Utilisation

Détails de l'Api

HL7 vers FHIR

POST http://localhost:32783/api/hl7/fhir

Exemple

Saisie

MSH|^~\&||^^NPI|||20211105165829+0000||ADT^A01|66053,61109.396628|P|2.5.1|||AL|AL|||||PH_SS-Ack^SS Sender^2.16.840.1.114222.4.10.3^ISO
EVN||202111051658|||||^^NPI
PID|1||060a6bd5-5146-4b08-a916-009858997bd3^^^https://github.com/synthetichealth/synthea^~060a6bd5-5146-4b08-a916-009858997bd3^^^http://hospital.smarthealthit.org^MR~999-97-4582^^^&^SS~S99986284^^^&^DL~X84330364X^^^&^PPN||Masson^Livia^^^Mrs.^^||19920820|F|Simon^Livia^^||615 Avenue Lemaire^^Lyon^Auvergne-Rhone-Alpes^63000||^PRN^PH^^^555^286|||||||||||||||||||||
PV1|1|O||424441002|||||||||||||||1^^^&&^VN|||||||||||||||||||||||||200812312325|20090101044004
PV2|||72892002^Grossesse normale^SCT
OBX|1||8302-2^Taille du corps^LN||20101014002504^^|cm^^UCUM|||||F|||20101014
OBX|2||72514-3^Gravite de la douleur - 0-10 evaluation numerique verbale [Score] - Signaleee^LN||20101014002504^^|{score}^^UCUM|||||F|||20101014
OBX|3||29463-7^Poids corporel^LN||20101014002504^^|kg^^UCUM|||||F|||20101014
OBX|4||39156-5^Indice de masse corporelle^LN||20101014002504^^|kg/m2^^UCUM|||||F|||20101014
OBX|5||72166-2^Statut du tabagisme^LN||20171026002504^Ancien fumeur^SCT^^^^^^Ancien fumeur||||||F|||20171026

Sortie

{
"typeDeRessource": "Paquet",
"type": "transaction",
"saisie": [
  {
    "demande": {
      "méthode": "POST",
      "url": "Organisation"
    },
    "UrlComplète": "urn:uuid:347a0c88-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Organisation",
      "identifiant": [
        {
          "valeur": "https://github.com/synthetichealth/synthea"
        }
      ]
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Organisation"
    },
    "UrlComplète": "urn:uuid:34d03d1a-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Organisation",
      "identifiant": [
        {
          "valeur": "http://hospital.smarthealthit.org"
        }
      ]
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Patient"
    },
    "UrlComplète": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Patient",
      "adresse": [
        {
          "ville": "Lyon",
          "ligne": [
            "615 Avenue Lemaire"
          ],
          "codePostal": "63000",
          "région": "Auvergne-Rhone-Alpes"
        }
      ],
      "dateDeNaissance": "1992-08-20",
      "sex": "femme",
      "identifiant": [
        {
          "assigner": {
            "référence": "urn:uuid:347a0c88-e7fa-11ec-9601-0242ac1a0002"
          },
          "système": "https://github.com/synthetichealth/synthea",
          "valeur": "060a6bd5-5146-4b08-a916-009858997bd3"
        },
        {
          "assigner": {
            "référence": "urn:uuid:34d03d1a-e7fa-11ec-9601-0242ac1a0002"
          },
          "système": "http://hospital.smarthealthit.org",
          "type": {
            "codage": [
              {
                "code": "MR",
                "système": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "texte": "MRN"
          },
          "valeur": "060a6bd5-5146-4b08-a916-009858997bd3"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valeurDeLigne": "&"
            }
          ],
          "type": {
            "codage": [
              {
                "code": "SS"
              }
            ],
            "texte": "SS"
          },
          "valeur": "999-97-4582"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valeurDeLigne": "&"
            }
          ],
          "type": {
            "codage": [
              {
                "code": "DL",
                "système": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "texte": "DL"
          },
          "valeur": "S99986284"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valeurDeLigne": "&"
            }
          ],
          "type": {
            "codage": [
              {
                "code": "PPN",
                "système": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "texte": "PPN"
          },
          "valeur": "X84330364X"
        }
      ],
      "nom": [
        {
          "famille": "Simon",
          "prénom": [
            "Livia"
          ],
          "texte": "Livia Simon"
        },
        {
          "famille": "Masson",
          "prénom": [
            "Livia"
          ],
          "préfixe": [
            "Mrs."
          ],
          "texte": "Mrs. Livia Masson",
          "utilisation": "officiel"
        }
      ],
      "telecom": [
        {
          "système": "téléphone",
          "utilisation": "domicile",
          "valeur": "(555) 286"
        }
      ]
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Visite"
    },
    "UrlComplète": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Visite",
      "class": {
        "code": "AMB",
        "système": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-encounter-type",
          "valeurDeLigne": "O"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-entered-on",
          "valeurDateHeur": "2008-12-31T23:25:00+00:00"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-to-time",
          "valeurDateHeur": "2009-01-01T04:40:04+00:00"
        }
      ],
      "identifiant": [
        {
          "type": {
            "texte": "NuméroDeVisite"
          },
          "utilisation": "officiel",
          "valeur": "1"
        }
      ],
      "période": {
        "lancement": "2008-12-31T23:25:00+00:00"
      },
      "reasonCode": [
        {
          "codage": [
            {
              "code": "72892002",
              "affichage": "Grossesse normale",
              "système": "http://snomed.info/sct"
            }
          ]
        }
      ],
      "état": "inconnu",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "type": [
        {
          "codage": [
            {
              "code": "424441002"
            }
          ]
        }
      ]
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3a13745e-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "code": {
        "codage": [
          {
            "code": "72166-2",
            "affichage": "Statut du tabagisme",
            "système": "http://loinc.org"
          }
        ]
      },
      "effectiveDateHeure": "2017-10-26T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-observation-coded-value",
          "valeurConceptCodifiable": {
            "codage": [
              {
                "code": "20171026002504",
                "affichage": "Ancien fumeur",
                "système": "http://snomed.info/sct"
              }
            ],
            "texte": "Ancien fumeur"
          }
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurDeLigne": "Ancien fumeur"
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3b6212fc-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "category": [
        {
          "codage": [
            {
              "code": "Signes-vitaux",
              "affichage": "Signes vitaux",
              "système": "http://terminology.hl7.org/CodeSystem/observation-category"
            }
          ],
          "texte": "Signes vitaux"
        }
      ],
      "code": {
        "codage": [
          {
            "code": "8302-2",
            "affichage": "Taille du corps",
            "système": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valeurConceptCodifiable": {
              "codage": [
                {
                  "code": "cm",
                  "système": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateHeure": "2010-10-14T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurConceptCodifiable": {
        "codage": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3c8aba30-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "code": {
        "codage": [
          {
            "code": "72514-3",
            "affichage": "Gravite de la douleur - 0-10 evaluation numerique verbale [Score] - Signaleee",
            "système": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valeurConceptCodifiable": {
              "codage": [
                {
                  "code": "{score}",
                  "système": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateHeure": "2010-10-14T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurConceptCodifiable": {
        "codage": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3de455d0-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "category": [
        {
          "codage": [
            {
              "code": "signes -vitaux",
              "affichage": "Signes vitaux",
              "système": "http://terminology.hl7.org/CodeSystem/observation-category"
            }
          ],
          "texte": "Signes vitaux"
        }
      ],
      "code": {
        "codage": [
          {
            "code": "29463-7",
            "affichage": "Poids corporel",
            "système": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valeurConceptCodifiable": {
              "codage": [
                {
                  "code": "kg",
                  "système": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateHeure": "2010-10-14T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurConceptCodifiable": {
        "codage": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3f501418-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "code": {
        "codage": [
          {
            "code": "39156-5",
            "affichage": "Indice de masse corporelle",
            "système": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valeurConceptCodifiable": {
              "codage": [
                {
                  "code": "kg/m2",
                  "système": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateHeure": "2010-10-14T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurConceptCodifiable": {
        "codage": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  }
]
}

FHIR vers HL7 ADT

POST http://localhost:32783/api/fhir/hl7/adt

Exemple

{
"typeDeRessource": "Paquet",
"type": "transaction",
"saisie": [
  {
    "demande": {
      "méthode": "POST",
      "url": "Organisation"
    },
    "UrlComplète": "urn:uuid:347a0c88-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Organisation",
      "identifiant": [
        {
          "valeur": "https://github.com/synthetichealth/synthea"
        }
      ]
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Organisation"
    },
    "UrlComplète": "urn:uuid:34d03d1a-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Organisation",
      "identifiant": [
        {
          "valeur": "http://hospital.smarthealthit.org"
        }
      ]
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Patient"
    },
    "UrlComplète": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Patient",
      "adresse": [
        {
          "ville": "Lyon",
          "ligne": [
            "615 Avenue Lemaire"
          ],
          "codePostal": "63000",
          "région": "Auvergne-Rhone-Alpes"
        }
      ],
      "dateDeNaissance": "1992-08-20",
      "sex": "femme",
      "identifiant": [
        {
          "assigner": {
            "référence": "urn:uuid:347a0c88-e7fa-11ec-9601-0242ac1a0002"
          },
          "système": "https://github.com/synthetichealth/synthea",
          "valeur": "060a6bd5-5146-4b08-a916-009858997bd3"
        },
        {
          "assigner": {
            "référence": "urn:uuid:34d03d1a-e7fa-11ec-9601-0242ac1a0002"
          },
          "système": "http://hospital.smarthealthit.org",
          "type": {
            "codage": [
              {
                "code": "MR",
                "système": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "texte": "MRN"
          },
          "valeur": "060a6bd5-5146-4b08-a916-009858997bd3"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valeurDeLigne": "&"
            }
          ],
          "type": {
            "codage": [
              {
                "code": "SS"
              }
            ],
            "texte": "SS"
          },
          "valeur": "999-97-4582"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valeurDeLigne": "&"
            }
          ],
          "type": {
            "codage": [
              {
                "code": "DL",
                "système": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "texte": "DL"
          },
          "valeur": "S99986284"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valeurDeLigne": "&"
            }
          ],
          "type": {
            "codage": [
              {
                "code": "PPN",
                "système": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "texte": "PPN"
          },
          "valeur": "X84330364X"
        }
      ],
      "nom": [
        {
          "famille": "Simon",
          "prénom": [
            "Livia"
          ],
          "texte": "Livia Simon"
        },
        {
          "famille": "Masson",
          "prénom": [
            "Livia"
          ],
          "préfixe": [
            "Mrs."
          ],
          "texte": "Mrs. Livia Masson",
          "utilisation": "officiel"
        }
      ],
      "telecom": [
        {
          "système": "téléphone",
          "utilisation": "domicile",
          "valeur": "(555) 286"
        }
      ]
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "visite"
    },
    "UrlComplète": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "visite",
      "class": {
        "code": "AMB",
        "système": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-encounter-type",
          "valeurDeLigne": "O"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-entered-on",
          "valeurDateHeur": "2008-12-31T23:25:00+00:00"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-to-time",
          "valeurDateHeur": "2009-01-01T04:40:04+00:00"
        }
      ],
      "identifiant": [
        {
          "type": {
            "texte": "EncounterNumber"
          },
          "utilisation": "officiel",
          "valeur": "1"
        }
      ],
      "période": {
        "lancement": "2008-12-31T23:25:00+00:00"
      },
      "reasonCode": [
        {
          "codage": [
            {
              "code": "72892002",
              "affichage": "Grossesse normale",
              "système": "http://snomed.info/sct"
            }
          ]
        }
      ],
      "état": "inconnu",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "type": [
        {
          "codage": [
            {
              "code": "424441002"
            }
          ]
        }
      ]
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3a13745e-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "code": {
        "codage": [
          {
            "code": "72166-2",
            "affichage": "Statut du tabagisme",
            "système": "http://loinc.org"
          }
        ]
      },
      "effectiveDateHeure": "2017-10-26T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-observation-coded-value",
          "valeurConceptCodifiable": {
            "codage": [
              {
                "code": "20171026002504",
                "affichage": "Ancien fumeur",
                "système": "http://snomed.info/sct"
              }
            ],
            "texte": "Ancien fumeur"
          }
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurDeLigne": "Ancien fumeur"
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3b6212fc-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "category": [
        {
          "codage": [
            {
              "code": "signes-vitaux",
              "affichage": "Signes vitaux",
              "système": "http://terminology.hl7.org/CodeSystem/observation-category"
            }
          ],
          "texte": "Signes vitaux"
        }
      ],
      "code": {
        "codage": [
          {
            "code": "8302-2",
            "affichage": "Taille du corps",
            "système": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valeurConceptCodifiable": {
              "codage": [
                {
                  "code": "cm",
                  "système": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateHeure": "2010-10-14T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurConceptCodifiable": {
        "codage": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3c8aba30-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "code": {
        "codage": [
          {
            "code": "72514-3",
            "affichage": "Gravite de la douleur - 0-10 evaluation numerique verbale [Score] - Signaleee",
            "système": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valeurConceptCodifiable": {
              "codage": [
                {
                  "code": "{score}",
                  "système": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateHeure": "2010-10-14T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurConceptCodifiable": {
        "codage": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3de455d0-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "category": [
        {
          "codage": [
            {
              "code": "signes-vitaux",
              "affichage": "Signes vitaux",
              "système": "http://terminology.hl7.org/CodeSystem/observation-category"
            }
          ],
          "texte": "Signes vitaux"
        }
      ],
      "code": {
        "codage": [
          {
            "code": "29463-7",
            "affichage": "Poids corporel",
            "système": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valeurConceptCodifiable": {
              "codage": [
                {
                  "code": "kg",
                  "système": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateHeure": "2010-10-14T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurConceptCodifiable": {
        "codage": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "demande": {
      "méthode": "POST",
      "url": "Observation"
    },
    "UrlComplète": "urn:uuid:3f501418-e7fa-11ec-9601-0242ac1a0002",
    "ressource": {
      "typeDeRessource": "Observation",
      "code": {
        "codage": [
          {
            "code": "39156-5",
            "affichage": "Indice de masse corporelle",
            "système": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valeurConceptCodifiable": {
              "codage": [
                {
                  "code": "kg/m2",
                  "système": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateHeure": "2010-10-14T00:00:00+00:00",
      "visite": {
        "référence": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valeurDeLigne": "1"
        }
      ],
      "état": "final",
      "sujet": {
        "référence": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valeurConceptCodifiable": {
        "codage": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  }
]
}
Sortie
MSH|^~\&||^^NPI|||20220609134903+0000||^|66269,49743.388133779|P|2.5.1|||AL|AL|||||PH_SS-Ack^SS Sender^2.16.840.1.114222.4.10.3^ISO
EVN||202206091349|||||^^NPI
PID|1||060a6bd5-5146-4b08-a916-009858997bd3^^^https://github.com/s&&ISO^~060a6bd5-5146-4b08-a916-009858997bd3^^^http://hospital.smar&&ISO^MR~999-97-4582^^^&^SS~S99986284^^^&^DL~X84330364X^^^&^PPN||Masson^Livia^^^Mrs.^^||19920820|F|Simon^Livia^^||615 Avenue Lemaire^^^^||^PRN^PH^^^555^286|||||||||||||||||||||
PV1|1|O||424441002|||||||||||||||1^^^&&^VN|||||||||||||||||||||||||200812312325|
PV2|||72892002^Grossesse normale^SCT
OBX|1||72166-2^Statut du tabagisme^LN||^^||||||F|||20171026
OBX|2||8302-2^Taille du corps^LN||^^||||||F|||20101014
OBX|3||72514-3^Gravite de la douleur - 0-10 evaluation numerique verbale [Score] - Signaleee^LN||^^||||||F|||20101014
OBX|4||29463-7^Poids corporel^LN||^^||||||F|||20101014
OBX|5||39156-5^Indice de masse corporelle^LN||^^||||||F|||20101014

FHIR vers HL7 ORU

POST http://localhost:32783/api/fhir/hl7/oru

FHIR vers HL7 vxu

POST http://localhost:32783/api/fhir/hl7/vxu

CDA vers FHIR

POST http://localhost:32783/api/cda/fhir

Exemple

Dépôt FHIR

GET http://localhost:32783/api/fhir/metadata

Format d'entrée HL7 pris en charge :

  • ADT_A01, ADT_A02, ADT_A03, ADT_A04, ADT_A05, ADT_A06, ADT_A07, ADT_A08, ADT_A09, ADT_A10, ADT_A11, ADT_A12, ADT_A13, ADT_A17, ADT_A18, ADT_A23, ADT_A25, ADT_A27, ADT_A28, ADT_A29, ADT_A30, ADT_A31, ADT_A34, ADT_A36, ADT_A39, ADT_A40, ADT_A41, ADT_A45, ADT_A47, ADT_A49, ADT_A50, ADT_A51, ADT_A60

  • BAR_P12

  • MDM_T02, MDM_T04, MDM_T08, MDM_T11

  • OMP_O09

  • ORM_O01

  • ORU_R01

  • PPR_PC1, PPR_PC2, PPR_PC3

  • RDE_O11

  • SIU_S12, SIU_S13, SIU_S14, SIU_S15, SIU_S16, SIU_S17, SIU_S26

  • VXU_V04

Comment ça marche

Ce projet fonctionne avec le diagramme pivot : SDA.

Le SDA (Summary Document Architecture, Architecture du document de synthèse) est le format de données cliniques d'InterSystems.

Les correspondances SDA <-> FHIR peuvent être consultées ici, et celles de la CDA -> SDA ici.

gif sda pivot

0
0 204
Article Robert Bira · Sept 26, 2022 5m read

L’interopérabilité dans le secteur de la santé a fait l’objet d’une attention particulière au cours de la dernière décennie, tant dans le cadre législatif que dans le secteur des technologies de la santé. Les API constituent un espace de développement crucial pour une meilleure interopérabilité, et de nombreux développeurs de systèmes d’information hospitalier (SIH) les déploient pour améliorer les offres de logiciels intégrés.

Comme ces plateformes traitent des informations sensibles, leurs API doivent être à la pointe du développement et de la sécurité.

0
0 155
Article Lorenzo Scalese · Sept 23, 2022 4m read

Bonjour la communauté,

Cet article montre comment créer des ressources pour le patient et l'observation du patient en utilisant l'application iris-fhir-client .
image

Je recommande de lire mon premier article sur cette application et de regarder le Video Youtube avant de continuer.

Donc commençons

1-Création d'une Ressource Patient

La fonction CreatePatient() de dc.FhirClient ci-dessous peut être utilisée pour créer une Ressource Patient

ClassMethod CreatePatient(givenName As %String, familyName As %String, birthDate As %String,gender As %String)

La fonction nécessite giveName, failyName, birthDate et sex pour créer la Resource Patient La commande ci-dessous créera le Patient

do ##class(dc.FhirClient).CreatePatient("PatientGN","PatientFN","2000-06-01","male")

image

Voici la fonction python dans le fichier irisfhirclient.py qui va créer le patient

import json
from fhirpy import SyncFHIRClient
from tabulate import tabulate
from fhirpy.base.searchset import Raw
import requests

def CreatePatient(givenName,familyName,birthDate,gender,url,api_key):
    headers = {"Content-Type":contentType,"x-api-key":api_key}
    client = SyncFHIRClient(url = url, extra_headers=headers)
    
    patient = client.resource("Patient")
    patient['name'] = [
        {
            'given': [givenName],
            'family': familyName,
            'use': 'official'
        }
    ]

    patient['birthDate'] = birthDate
    patient['gender'] = gender
    try:
        patient.save()
    except Exception as e:
        print("Error while creating Patient:" +str(e))       
        return
    print("Patient Created Successfully")    

 

2- Création d'une ressource pour l'observation des patients

Créons une Observation sur notre ressource patient nouvellement créée

La fonction CreateObservatoin() de dc.FhirClient ci-dessous peut être utilisée pour la Création des observations de patients
ClassMethod CreateObservation(patientId As %String, loincCode As %String, ObrCategory As %String, ObrValue As %Integer, ObrUOM As %String, effectiveDate As %String)

Paramètres

  • patientId est l'identifiant du patient
  • LioncCode est le Code Lionc, les détails sont présentés ici
  • ObrCategory est une catégorie d'observation, les détails sont disponibles ici
  • ObrValue est la valeur d'observation
  • ObrUOM est l'unité d'observation
  • EffectiveDate

La commande ci-dessous créera l'observation des Signes Vitaux du patient

do ##class(dc.FhirClient).CreateObservation("8111","8310-5","vital-signs",96.8,"degF","2022-01-22")

image

Énumérons les observations des patients

do ##class(dc.FhirClient).GetPatientResources("Observation","8111")

image

Voici la fonction python dans le fichier irisfhirclient.py qui va créer le patient

import json
from fhirpy import SyncFHIRClient
from tabulate import tabulate
from fhirpy.base.searchset import Raw
import requests

#Function to create Patient Observation
def CreateObservation(patientId,loincCode,ObrCategory,ObrValue,ObrUOM,effectiveDate,url,api_key):
    headers = {"Content-Type":contentType,"x-api-key":api_key}
    client = SyncFHIRClient(url = url, extra_headers=headers)
    observation = client.resource(
    'Observation',
    status='preliminary',
    category=[{
        'coding': [{
            'system': 'http://hl7.org/fhir/observation-category',
            'code': ObrCategory
        }]
    }],
    code={
        'coding': [{
            'system': 'http://loinc.org',
            'code': loincCode
        }]
    })
    observation['effectiveDateTime'] = effectiveDate
       
    observation['valueQuantity'] = {
    'system': 'http://unitsofmeasure.org',
    'value': ObrValue,
    'code': ObrUOM
    }
    
    #find the patient
    patient = client.resources('Patient').search(_id=patientId).first()
    observation['subject'] = patient.to_reference()
    
    try:
        observation.save()
    except Exception as e:
        print("Error while creating observation :"+ str(e))       
        return
    print("Patient Observation Created Successfully")

C'est comme ça

Si vous avez trouvé cette application utile, merci de voter pour mon application.

Merci!

0
0 88
Annonce Irène Mykhailova · Sept 22, 2022

Salut la communauté,

Nous apprécions grandement tous vos commentaires sur le concours d'interopérabilité !

Veuillez répondre à une courte enquête et répondre à quelques questions pour nous aider à améliorer nos concours.

👉 Sondage rapide : Enquête sur le concours d'interopérabilité 2022

11 Best Questions to Ask in a Restaurant Survey (and how to ask them)

N'hésitez pas à partager également vos pensées dans les commentaires de cet article !

0
0 55
InterSystems officiel Robert Bira · Sept 22, 2022

Il s'agit de la 7ème d'une série de versions qui font partie du programme de prévisualisation pour les développeurs pour la version 2022.2. Les futures versions de prévisualisation devraient être mises à jour toutes les deux semaines et nous ajouterons des fonctionnalités dès qu'elles seront prêtes. De nombreuses mises à jour, correctifs et améliorations ont été ajoutés en 2022.2, dans la gestion SQL, l'intégration cloud, les adaptateurs Kafka et JMS, le chargeur SQL et d'autres domaines. Veuillez partager vos commentaires via la communauté des développeurs afin que nous puissions créer

0
0 42
Annonce Irène Mykhailova · Sept 21, 2022

Salut la communauté !

Êtes-vous à Dubaï du 10 au 13 octobre ? Rejoignez-nous à la conférence Global DevSlam pour les développeurs avec 15 000 participants attendus en personne !
📍Lieau: Hall 9, Stand № H9-E30, Dubai World Trade Center

🗓  Date: 10 Octobre, 14h00 - 15h30 
🌟 Nous organiserons l'événement : "L'atelier pratique sur la plate-forme de données InterSystems IRIS"

 

0
0 62
Annonce Irène Mykhailova · Sept 21, 2022

Salut la communauté,

Rencontrons-nous lors de la rencontre en ligne avec les gagnants du concours d'interopérabilité InterSystems – une excellente occasion d'avoir une discussion avec l'équipe d'experts InterSystems ainsi qu'avec nos participants.

Démo des gagnants incluse !

Date et heure : jeudi 22 septembre, 09h00 HAE 

>> Inscrivez-vous ici <<

0
0 61
Article Lorenzo Scalese · Sept 9, 2022 3m read

Salut mes amis,

C'est le concours FHIR et cette fois, ils ont fourni quelque chose de vraiment cool : FHIRaaS

Et pour faire partie de cela, @José Pereira et moi faisons équipe (encore une fois) pour livrer quelque chose de facile à utiliser et facile à comprendre ce que nous avons fait.

Qu'avons-nous fait ?

IRIS sur FHIR : une application SMART pour montrer le potentiel de FHIRaaS en utilisant la bibliothèque client SMART JS

Description de l'application

IRIS on FHIR, c'est notre idée de la facilité et de la simplicité avec laquelle on peut travailler avec FHIR, en créant une grande interface utilisateur pour montrer la puissance de FHIRaaS.

Nous espérons que notre projet permettra à tout le monde de mieux comprendre ; nous voulons partager les connaissances et montrer que quelque chose de bien n'est pas nécessairement compliqué.

Et comme il est facile à comprendre et à utiliser, nous pensons que notre projet peut être utilisé comme base/exemple pour beaucoup d'autres, débloquant ainsi de plus en plus de fonctionnalités.

À quoi ressemble IRIS sur FHIR

Liste des patients

Cette page est une liste des patients utilisant la ressource Patient.

Le tableau de données reconnaît le tableau fourni pour la ressource Patient et montre quelques informations sur le patient.

Liste des patients

Vue du patient

En cliquant sur le lien Prénom du patient, vous serez redirigé vers la page Vue du patient. Cette page contient plus d'informations sur ce patient.

Vue du patient

En haut, nous avons la photo du patient, son ID FHIR, son SSN, sa date de naissance, son sexe, son contact, son adresse, sa ville, son pays.

La partie centrale fournit des cartes à deux sections :

  • Dernière admission
  • Dernières observations : Laboratoire

Les badge-pills des composants apportent le total des cartes respectives.

badge-pill

Pour la carte Observations:Laboratoire, les badge-pills ouvrent une nouvelle page présentant les résultats du laboratoire.

Résultats du laboratoire

Choisissez l'une des options dans la boîte de sélection Select box, cliquez sur le bouton de recherche Search, et vous obtiendrez le tableau avec les valeurs du test de laboratoire sélectionné.

Tests de laboratoire

Choisissez l'une des options dans la boîte de sélection Select box, cliquez sur le bouton de recherche Search, et vous obtiendrez le tableau avec les valeurs du test de laboratoire sélectionné.

Résultats des tableaux

Rendez-vous

Les rendez-vous sont affichés dans la vue du calendrier, et les informations sont chargées via la ressource FHIR : Rendez-vous. Calendrier des rendez-vous

Vous pouvez également créer de nouveaux rendez-vous, les mettre à jour et les supprimer.

CRUD des rendez-vous

Demo

https://iris-on-fhir.contest.community.intersystems.com/iris-on-fhir/index.html

  • utilisateur: irisonfhir
  • mot de passe: irisonfhirA1@

Si vous avez aimé l'application et pensez que nous méritons votre vote, veuillez voter pour iris-on-fhir !

https://openexchange.intersystems.com/contest/current

0
0 92
Article Lorenzo Scalese · Sept 7, 2022 7m read

Introduction

Dans ce premier article, un tutoriel simple vous a aidé à mettre en place votre déploiement FHIRaaS.

Maintenant, allons plus loin et présentons une bibliothèque JS pour accéder à la ressource FHIR.

À la fin, deux exemples d'utilisation de cette bibliothèque seront présentés, explorant le type de ressource FHIR Appointment pour les rendez-vous.

SMART sur la bibliothèque FHIR JavaScript

FHIR est une API REST, vous pouvez donc utiliser n'importe quel client HTTP pour l'utiliser. Mais c'est toujours une bonne idée d'avoir de l'aide.

En outre, il existe une initiative intéressante appelée SMART qui vise à fournir des normes pour un accès facile aux données de santé stockées dans des systèmes de santé. Cette API s'appuie sur FHIR comme couche de communication. C'est ce qu'on appelle les SMART sur les applications FHIR.

L'équipe SMART a développé une bibliothèque de client JS, qui nous aide à créer des applications compatibles avec les normes SMART. Par exemple, pour initier le flux de code d'autorisation OAuth2, vous avez juste besoin de ce code.

FHIR.oauth2.authorize({
"client_id": "<your-app-client-id>",
"clientSecret": "<your-app-client-secret>",
"scope": "openid profile user/*.*",
"redirect_uri": "http://localhost:64755/iris-on-fhir/index.html",
"iss": "https://fhirauth.lrwvcusn.static-test-account.isccloud.io/oauth2"
});

Remarque : ce code est fourni pour que vous le copiez et le copiez dans l'onglet OAuth 2.0 :

Afin de respecter la norme SMART, vous devez placer ce code dans une page appelée launch.html. Ainsi, un lanceur SMART sera capable de trouver le lanceur de votre application.

Notez que la méthode authorize() fait beaucoup de travail pour nous :

  • Initialise le flux OAuth, en amenant l'utilisateur à la page de connexion de l'IdP.
  • Si la connexion est réussie, stocke le jeton d'autorisation.
  • Appelle l'URI de rafraîchissement du jeton, lorsque le jeton expire.
  • Une fois qu'un jeton est récupéré, cette méthode l'utilise jusqu'à son expiration, mais vous pouvez ignorer toutes ces étapes

Une autre caractéristique intéressante de cette bibliothèque est qu'il suffit de fournir la ressource FHIR, et elle sélectionne automatiquement les chemins d'accès à l'API. Par exemple, pour obtenir des patients, il suffit d'utiliser la méthode request et de spécifier le type de ressource Patient :

FHIR.oauth2.ready()
  .then(client => client.request("Patient/1223"))
  .then(resource => console.log(resource))
  .catch(console.error);

Cette commande récupère une ressource de type Patient. Ainsi, si vous modifiez cette ressource, vous pouvez l'éditer ou même en créer une autre à partir de ce patient, par les méthodes de mise à jour et d'édition, respectivement :

// enregistre les changements dans la ressource patient
FHIR.oauth2.ready()
  .then(client => client.update(resource))
  .then(() => console.log('patient updated'))
  .catch(console.error);

// crée une nouvelle ressource patient
FHIR.oauth2.ready()
  .then(client => client.create(resource))
  .then(() => console.log('patient created'))
  .catch(console.error);

Notez que vous n'avez pas spécifié de chemin d'accès à l'API FHIR, car la bibliothèque résout le chemin d'accès correct à l'API en fonction du type de la ressource.

Enfin, pour supprimer une ressource :

FHIR.oauth2.ready()
  .then(client => client.delete(`Patient/1223`))
  .then(() => console.log('patient deleted'))
  .catch(console.error);

Ressource FHIR pour les rendez-vous

Afin de montrer l'utilisation d'une autre ressource, créons une simple application de rendez-vous en manipulant la ressource FHIR Appointment.

Veuillez noter qu'il s'agit d'un cas d'utilisation très simple de cette ressource, qui n'utilise que quelques-unes de ses propriétés. En outre, cette ressource est liée à d'autres, qui ne sont pas couvertes ici. Si vous souhaitez en savoir plus sur ces ressources et le flux de travail entre elles, vous devez vous reporter à la spécification HL7 FHIR.

Tout d'abord, un objet modèle est récupéré à partir de la ressource API Development for Appointment. Cet objet est utilisé pour fournir un prototype pour la création et l'édition de rendez-vous.

function getAppointmentTemplate() {
    return {
        "resourceType": "Appointment",
        "id": "examplereq",
...
    };
}

Ensuite, une fonction permettant de modifier le prototype est créée. Cette fonction reçoit le prototype de ressource Appointment de rendez-vous et une instance d'un événement de calendrier. Cet objet d'événement contient des propriétés remplies par l'utilisateur via un composant de calendrier, qui seront introduites dans le prototype de ressource.

function setEventDataToResoruce(resource, eventData) {
    if (eventData.id) {
        resource.id = eventData.id;
    }

    const patient = getSelectedPatientObject();
    resource.participant[0].actor.reference = `Patient/${patient.id}`;
    resource.participant[0].actor.display = patient.name[0].given[0];
    resource.description = eventData.title;
    resource.comment = eventData.extendedProps.description;
    if (!resource.comment) {
        delete resource.comment;
    }

    if (eventData.allDay) {
        eventData.start = eventData.start.split(" ")[0];
        eventData.end = eventData.end.split(" ")[0];
    }

    const hasTime = {
        start: eventData.start.indexOf(" ") > -1,
        end: eventData.end.indexOf(" ") > -1
    }
    if (hasTime.start || hasTime.end) {
        resource.requestedPeriod[0].start = new Date(eventData.start).toISOString();
        resource.requestedPeriod[0].end = new Date(eventData.end).toISOString();
    } else {
        resource.requestedPeriod[0].start = eventData.start;
        resource.requestedPeriod[0].end = eventData.end;
    }

    return resource;
}

Grâce à ces deux fonctions, nous pouvons créer et remplir correctement une ressource Rendez-vous. Maintenant, nous devons utiliser la bibliothèque SMART pour effectuer les opérations CRUD sur cette ressource, finalisant ainsi notre application simple de rendez-vous :

function getAppointments(client) {
    return client.request(`Appointment`);
}

function createAppointment(eventData) {
    const resource = setEventDataToResoruce(
        getAppointmentTemplate(), eventData
    );
    return getFHIRClient()
        .then(client => {
            return client.create(resource);
        });
}

function updateAppointment(eventData) {
    const resource = setEventDataToResoruce(
        getAppointmentTemplate(), eventData
    );
    return getFHIRClient()
        .then(client => {
            return client.update(resource);
        });
}

function deleteAppointment(id) {
    return getFHIRClient()
        .then(client => {
            return client.delete(`Appointment/${id}`);
        });
}

Voici un screencast de l'application en cours d'exécution :

N'oubliez pas que le code exposé ici est simplement l'essentiel pour comprendre l'application. Mais, si vous souhaitez plus de détails, veuillez consulter le code source.

Bot Telegram

Comme dernière démonstration de ce que vous pouvez faire de cool avec FHIRaaS, je voudrais montrer un bot Telegram très simple.

J'ai entièrement basé cette fonctionnalité sur les travaux de Nikolay Soloviev et Sergey Mikhailenko. Dans l'article de Nikolay, vous pouvez voir comment créer le robot dans Telegram. Consultez également l'application de Sergey Mikhailenko pour obtenir plus d'informations sur les bots Telegram.

Comme le plus gros du travail a déjà été fait par Nikolay et Serguey, j'ai juste ajouté une couche supplémentaire de code. Cette couche récupère l'identifiant du patient, ainsi que la date et l'heure du rendez-vous, auprès des utilisateurs de Telegram, dans le cadre d'une simple interaction de type chat, sans fonctionnalités NLP. Après avoir récupéré ces informations, un point de terminaison FHIRaaS est appelé pour afficher un nouveau rendez-vous.

Voici un screencast du bot en action :

Si vous souhaitez obtenir plus de détails sur la mise en œuvre, veuillez consulter le code de l'application.

Conclusion

Dans cet article, nous avons fait une présentation de la bibliothèque SMART on FHIR JavaScript Library et montré comment l'utiliser sur deux exemples basés sur le type de ressource FHIR Appointment.

Dans le prochain article, nous allons approfondir les autres fonctionnalités de l'application iris-on-fhir.

0
0 88
Article Lorenzo Scalese · Sept 5, 2022 9m read

Introduction

Cet article vise à donner un aperçu du service FHIR Accelerator Service (FHIRaaS) piloté par l'implémentation de l'application iris-on-fhir, disponible dans OEX développé pour le concours FHIRaaS.

Un tutoriel de base vous guidera dans la configuration d'un déploiement FHIRaaS fonctionnel, comprenant une clé API et un serveur OAuth 2.0.

Une bibliothèque permettant d'utiliser les ressources FHIR par le biais de FHIRaaS est également brièvement évoquée.

Enfin, certaines fonctionnalités de l'application iris-on-fhir sont présentées dans des articles séparés. Vous pouvez consulter le code complet sur le référentiel github de l'application.

Ce contenu sera présenté dans une série de 3 artciles.

Ce premier article semble un peu gros, mais ne vous inquiétez pas, c'est parce que j'ai mis beaucoup d'images pour vous aider dans vos étapes de configuration.

FHIRaaS

IRIS fournit déjà un environnement API FHIR intégré dans IRIS for Health et IRIS Health Connect.

Mais si vous souhaitez profiter de l'environnement fiable, sécurisé et à faible maintenance offert par les services en nuage, vous pouvez désormais compter sur InterSystems IRIS FHIR Accelerator Service (FHIRaaS).

FHIRaaS est une infrastructure FHIR prête à l'emploi basée sur des services en nuage. Il vous suffit de mettre en place un déploiement et de commencer à utiliser l'API FHIR dans vos applications, quelle que soit leur nature : client JS (SMART on FHIR), backend traditionnel ou applications sans serveur.

Pour demander votre essai gratuit de FHIRaaS, veuillez contacter InterSystems.

Configuration du déploiement

Après la connexion, cliquez sur le bouton "CREATE NEW DEPLOYMENT".

Vous devrez passer par quelques étapes. La première consiste à choisir la taille du déploiement. Au moment de la rédaction de cet article, FHIRaaS ne propose qu'une seule option. Il suffit donc d'appuyer sur le bouton "CONTINUE".

L'étape suivante consiste à choisir le fournisseur de services en nuage qui sera utilisé. Là encore, une seule option était disponible au moment de la rédaction de cet article : AWS.

La dernière configuration est juste le nom du déploiement. Il y a quelques règles pour ce nom, et l'interface FHIRaaS vous alerte lorsqu'un nom invalide est fourni. Notez également que vous ne pouvez pas changer ce nom après la configuration. Cliquez sur le bouton "CONTINUE" après avoir sélectionné le nom.

Enfin, révisez votre configuration et démarrez votre déploiement FHIRaaS en cliquant sur le bouton "CREATE".

Si tout se passe bien, vous recevrez un message sympa indiquant que votre déploiement FHIRaaS est en cours de développement. Attendez quelques minutes jusqu'à la fin de ce processus.

Après quelques minutes, votre déploiement FHIRaaS est prêt à être utilisé. Il suffit d'appuyer sur le bouton de déploiement et de commencer à l'utiliser.

Après avoir cliqué sur le bouton de déploiement, l'onglet "Aperçu" est présenté. Notez que vous disposez de plusieurs onglets. Dans cet article, seuls les onglets "OAuth 2.0", "Credentials" et "API Development" seront couverts. Mais il ne s'agit que d'un aperçu, les autres ne sont pas du tout compliqués et vous pouvez facilement les explorer.

Contrôle d'accès

FHIRaaS prend en charge deux méthodes de contrôle d'accès : Clé API et OAuth 2.0. Passons en revue chacune d'entre elles.

Clé d'API

Les clés API sont des jetons générés par FHIRaaS qui permettent à vos applications d'interagir avec l'API sans interaction avec l'utilisateur. Cette méthode est donc idéale pour la communication entre le serveur FHIRaaS et les applications tierces autorisées, comme une API de chatbot, par exemple.

Pour créer une clé API, accédez d'abord à l'onglet "Credentials", puis cliquez sur le bouton "CRÉER UNE CLÉ API".

Choisissez un nom pour votre clé API et cliquez sur le bouton "ADD".

Génial ! Votre clé API a été créée ! Copiez-la et enregistrez-la dans un endroit sûr - vous ne pourrez plus accéder à cette information.

Après la création, vous ne pouvez que supprimer une clé API.

Pour utiliser cette clé Api, il suffit d'ajouter un en-tête x-api-key à une requête HTTP. Par exemple :

curl -X GET "https://fhir.lrwvcusn.static-test-account.isccloud.io/Patient" -H  "accept: application/fhir+json" -H  "x-api-key: your-apy-key"

OAuth 2.0 - Création d'un serveur OAuth 2.0 et ajout d'utilisateurs à celui-ci

Comme nous l'avons dit précédemment, la clé API permet d'utiliser l'API sans interaction avec l'utilisateur. Mais, lorsque vous créez une application pour vos utilisateurs, OAuth 2.0 et OpenID Connect sont aujourd'hui la norme industrielle pour l'authentification et l'autorisation.

Une petite remarque : bien que vous puissiez utiliser OAuth 2.0 et OpenID Connect indépendamment, il est tout à fait normal de voir les deux fonctionner côte à côte. Ainsi, lorsque je parle d'OAuth 2.0, je veux dire OAuth 2.0 pour l'autorisation et OpenID Connect pour l'authentification.

Alors, configurons un serveur OAuth 2.0. Tout d'abord, sélectionnez l'onglet "OAuth 2.0", puis cliquez sur le bouton "CREATE AUTHENTICATION SERVER"

L'étape suivante consiste à choisir un nom pour votre serveur OAuth 2.0 et à sélectionner le fournisseur d'identité (IdP) à utiliser. Au moment où cet article a été écrit, FHIRaaS ne supportait que AWS Cognito comme IdP. Il suffit donc d'appuyer sur le bouton "CREATE".

Si votre demande a été réussie, un message vous sera envoyé, comme dans l'image ci-dessous. Maintenant vous pouvez ajouter des utilisateurs à votre IdP en cliquant sur le bouton "ADD USER".

Vous serez redirigé vers l'onglet "Credentials". Pour ajouter un utilisateur, cliquez sur le bouton "CREATE USER".

Saisissez le nom d'utilisateur et son mot de passe, puis cliquez sur le bouton "CREER".

Si tout se passe bien, vous pouvez maintenant voir un utilisateur créé dans votre IdP. Cet utilisateur peut maintenant se connecter à des applications autorisées par ce serveur OAuth 2.0.

OAuth 2.0 - Ajout d'applications au serveur OAuth 2.0

Après la création d'un serveur OAuth 2.0 et l'ajout d'utilisateurs à celui-ci, ces utilisateurs peuvent utiliser les applications autorisées par ce serveur. Maintenant, nous allons ajouter une application au serveur.

Tout d'abord, accédez à l'onglet "OAuth 2.0", sélectionnez "Application", puis cliquez sur le bouton "CREATE APPLICATION".

Ensuite, choisissez un nom pour votre application dans le serveur et le serveur OAuth 2.0 qui vient d'être créé. Les URLs doivent diriger vers votre application. L'"URL de redirection" est l'adresse de destination lorsque les utilisateurs se connectent avec succès. L'"URL de déconnexion" est la page vers laquelle les utilisateurs sont redirigés, lorsqu'ils utilisent l'IdP pour se déconnecter.

Vous pouvez rediriger vers localhost pendant le développement, mais, bien sûr, pour la production, vous devez fournir une URL accessible par l'Internet.

Les dernières étapes consistent à choisir les ressources FHIR (domaines d'application) que les utilisateurs doivent accepter de partager avec l'application. Pour ce test simple, toutes les ressources sont demandées, mais dans les applications réelles, vous pouvez contrôler chaque ressource FHIR, comme si l'application pouvait juste lire, juste écrire ou les deux. Si les utilisateurs ne sont pas d'accord avec cette demande d'autorisation, le serveur OAuth 2.0 refusera l'accès à ces ressources.

Après avoir correctement configuré les domaines, appuyez sur le bouton "CREER".

Si tout se passe bien, vous verrez apparaître un message vert. Maintenant, vous pouvez vérifier les paramètres de votre nouvelle application ou la supprimer en appuyant sur la case de l'application. Vous pouvez également créer plusieurs applications dont vous avez besoin.

Développement d'API

Parmi les fonctionnalités intéressantes de FHIRaaS, citons l'onglet Développement API. Il vous fournit un explorateur de spécification OpenAPI de l'API FHIR, vous permettant d'essayer facilement toutes les fonctionnalités FHIR.

Pour y accéder, cliquez sur l'onglet "API Development". Après son chargement, vous pouvez sélectionner la ressource FHIR que vous souhaitez explorer. Notez que FHIRaaS fournit la version R4 pour les ressources FHIR.

Maintenant, nous allons nous authentifier pour utiliser l'outil. Vous devez d'abord créer une clé API.

Bien, maintenant, nous allons avoir tous les patients dans cette instance de FHIRaaS :

Comme vous pouvez le voir dans l'animation ci-dessus, vous pouvez effectuer toutes les opérations CRUD sur la ressource Patient - de même pour toutes les autres ressources disponibles.

Ce qui est bien ici, c'est que vous n'avez pas besoin de connaître toute la structure des ressources pour essayer d'effectuer des opérations sur elles. Par exemple, si vous souhaitez créer un nouveau patient, l'outil vous fournit un modèle pour cette ressource :

Vous disposez de la même fonctionnalité pour les autres ressources FHIR.

À la fin de la page, l'outil vous offre une belle vue de toutes les ressources liées, sous forme de schémas :

Conclusion

Dans cet article, nous abordons certains aspects de FHIRaaS et mettons en place un déploiement fonctionnel

Dans le prochain article, nous examinerons quelques exemples simples de son utilisation dans des applications.

1
0 66
InterSystems officiel Robert Bira · Sept 4, 2022

Il s'agit de la 6ème d'une série de versions qui font partie du programme de prévisualisation pour les développeurs pour la version 2022.2. Les futures versions de prévisualisation devraient être mises à jour toutes les deux semaines et nous ajouterons des fonctionnalités dès qu'elles seront prêtes. De nombreuses mises à jour, correctifs et améliorations ont été ajoutés en 2022.2, dans la gestion SQL, l'intégration cloud, les adaptateurs Kafka et JMS, le chargeur SQL et d'autres domaines. Veuillez partager vos commentaires via la communauté des développeurs afin que nous puissions créer

0
0 34
InterSystems officiel Robert Bira · Août 25, 2022

Il s'agit de la 5ème d'une série de versions qui font partie du programme de prévisualisation pour les développeurs pour la version 2022.2. Les futures versions de prévisualisation devraient être mises à jour toutes les deux semaines et nous ajouterons des fonctionnalités dès qu'elles seront prêtes. De nombreuses mises à jour, correctifs et améliorations ont été ajoutés en 2022.2, dans la gestion SQL, l'intégration cloud, les adaptateurs Kafka et JMS, le chargeur SQL et d'autres domaines. Veuillez partager vos commentaires via la communauté des développeurs afin que nous puissions créer

0
0 51
Annonce Irène Mykhailova · Août 22, 2022

Salut la communauté,

Nous sommes heureux de vous inviter au prochain webinaire de lancement du concours d'interopérabilité : Créer des solutions durables ! Le sujet de ce webinaire est dédié au concours de programmation d'interopérabilité.

Pendant ce webinaire, nous vous montrerons des certains principes généraux et des problèmes de résolution des problèmes de développement durable, ainsi que quelques bonnes idées qui ont surgi lors des hackathons pour vous inspirer et les choses à faire et à ne pas faire.

De plus, nous discuterons et répondrons aux questions sur la façon de créer des solutions d'interopérabilité à l'aide d'InterSystems IRIS et IRIS for Health.

Date et heure: lundi 29 août – 09 h 00 HAE

Speakers:  
🗣 Tomas Studenik, PDG d'Insane Business Ideas et co-fondateur de Caelestinus
🗣 @Dean Andrews, responsable des relations avec les développeurs  
🗣 @Evgeny Shvarov, responsable de l'écosystème des développeurs InterSystems


0
0 51
Article Guillaume Rongier · Août 17, 2022 3m read

Avec les dernières améliorations concernant le support de Python dans IRIS, et la poursuite du travail sur le support de Python DB-API par InterSystems. J'ai implémenté le support IRIS dans le projet Django où Python DB-API est utilisé pour travailler avec d'autres bases de données.

Essayons une application simple sur Django, qui stocke ses données dans IRIS.

todo App

Cette application est disponible sur [GitHub](https://github.com/caretdev/django-iris-todo), clonons-la
git clone https://github.com/caretdev/django-iris-todo
cd django-iris-todo

Et nous pouvons le construire et le démarrer avec Docker-compose

docker-compose up -d --build

Cela prendra un certain temps, quand IRIS sera démarré, et l'application Django l'attrapera, migrez les modèles là et lancez l'application aussi, une fois qu'elle est démarrée, elle sera disponible par http://localhost:8000/ et vous devriez avoir l'image comme ci-dessus.

Mais, comment cela fonctionne-t-il ?

Pour le faire fonctionner, il faut que l'interface InterSystems Python DB-API soit installée, elle est livrée avec la dernière version de l'aperçu, vous devez donc avoir la version 2022.1.0.114.0 ou une version supérieure et elle se trouve dans le dossier de l'instance &lt;INSTALL_DIR>/dev/python/. Ce fichier peut également être téléchargé à partir de ce depôt GitHub 

pip3 install intersystems_irispython-3.2.0-py3-none-any.whl

Le back-end IRIS de Django est implémenté par un autre projet, et qui peut être installé avec pip, et pour sûr nous avons besoin de django lui-même, installons-les

pip3 install django django-iris

Une autre façon d'installer les paquets requis dans Python est d'utiliser le fichier requirements.txt

pip3 install -r requirements.txt

Alors que ce fichier contient, les lignes suivantes

https://raw.githubusercontent.com/intersystems-community/iris-driver-distribution/main/intersystems_irispython-3.2.0-py3-none-any.whl
Django~=4.0.2
django-iris~=0.1.5

Connectons notre application Django à l'IRIS, ouvrons le fichier todoApp/settings.py

DATABASES définit les paramètres de connexion à la base de données

ENGINE doit être django_IRIS

NAME doit pointer vers l'espace de nom Namespace dans IRIS.

Il suffit de le changer en quelque chose, où il peut se connecter. Par exemple

DATABASES = {
    'default': {
        'ENGINE': 'django_iris',
        'NAME': 'DJANGOTODO',
        'HOST': 'localhost',
        'PORT': 1972,
        'USER': '_SYSTEM',
        'PASSWORD': 'SYS',
    }
}

Et lançons la migration

python3 manage.py migrate

Aucune erreur, tous les tableaux du côté d'IRIS sont créés.

Et nous sommes prêts à démarrer notre application

python3 manage.py runserver

Django est livré avec un panneau d'administration

python3 manage.py createsuperuser

Et le panneau d'administration est disponible par le lien http://localhost:8000/admin/

Et comment il est stocké dans IRIS

  Le travail est toujours en cours pour le pilote Python DB-API d'InterSystems, et aussi pour ce projet django-iris.

Soyez conscient que cela ne fonctionnera pas aussi bien sur la version Community Edition, en raison de la façon dont Django se connecte à la base de données, il peut utiliser toutes les licences très rapidement.

Si vous aimez le projet, et son impact futur sur l'utilisation d'IRIS, veuillez voter sur Compétition OpenExchange

0
0 78
InterSystems officiel Robert Bira · Août 8, 2022

Il s'agit de la 4ème d'une série de versions qui font partie du programme de prévisualisation pour les développeurs pour la version 2022.2. Les futures versions de prévisualisation devraient être mises à jour toutes les deux semaines et nous ajouterons des fonctionnalités dès qu'elles seront prêtes. De nombreuses mises à jour, correctifs et améliorations ont été ajoutés en 2022.2, dans la gestion SQL, l'intégration cloud, les adaptateurs Kafka et JMS, le chargeur SQL et d'autres domaines. Veuillez partager vos commentaires via la communauté des développeurs afin que nous puissions créer

0
0 45
Annonce Evgeny Shvarov · Juil 28, 2022

Salut la communauté !

Une nouvelle ressource PDF a été publiée sur notre site officiel. Elle présente les principales caractéristiques et une comparaison des produits d'interopérabilité des soins de santé d'InterSystems : Health Connect et IRIS For Health

Je pense que cela pourrait être utile pour la Communauté.

Le PDF est également joint au message.

0
0 56
InterSystems officiel Robert Bira · Juil 26, 2022

Il s'agit de la troisième d'une série de versions qui font partie du programme de prévisualisation pour les développeurs pour la version 2022.2. Les futures versions de prévisualisation devraient être mises à jour toutes les deux semaines et nous ajouterons des fonctionnalités dès qu'elles seront prêtes. De nombreuses mises à jour, correctifs et améliorations ont été ajoutés en 2022.2, dans la gestion SQL, l'intégration cloud, les adaptateurs Kafka et JMS, le chargeur SQL et d'autres domaines. Veuillez partager vos commentaires via la communauté des développeurs afin que nous puissions créer

0
0 55