ANS IG Example
0.1.0 - ci-build
FRANCE
ANS IG Example - version de développement local (intégration continue v0.1.0) construite par les outils de publication FHIR (HL7® FHIR® Standard). Voir le répertoire des versions publiées
Guide d'implémentation de démo, celui-ci n'a pas vocation à être utilisé
Version 1.5.2 Date : 21/07/2023
| Nom | Description |
|---|---|
| Volet mesures de santé v1.2 | Spécifications techniques d'alimentation et de consultation des mesures de santé |
| Spécifications d'interopérabilité au format Guide d'implémentation v3.0 | Spécifications techniques publiées sous forme d'Implementation Guide |
La documentation technique de Mon espace santé ne s'applique qu'aux services ayant ou visant à avoir des échanges de données avec MES.
Avant la lecture du présent document, il est conseillé de se référer au Document chapeau des APIs Mon espace santé, qui fonctionne comme un guide d'introduction à l'interopérabilité Mon espace santé et la documentation correspondante.
Ce document comprend :
Le Document chapeau des APIs Mon espace santé peut être trouvé sur le portail de référencement à l'adresse Référencement éditeurs (monespacesante.fr).
Les interactions entre les partenaires et Mon Espace Santé (MES) s'organisent en trois phases préliminaires aux échanges :
Cette documentation de référence définit comment interagir avec l'API Mesures de santé pour les partenaires.
L'objectif de cette API mesures est de permettre aux systèmes partenaires interfacés avec MES de consulter les mesures d'un utilisateur ou d'en écrire afin de proposer à l'utilisateur une vue à jour de ses mesures de santé.
Toutes les requêtes doivent répondre aux exigences d'authentification et d'identification décrites dans la spécification d'appariement.
Ainsi, les flux décrits ci-dessous permettent :
Ces profils ont comme dépendance les packages suivants :
| Id du package | Version | Lien |
|---|---|---|
| ans.cisis.fhir.r4 | 2.0.0 | https://simplifier.net/packages/ans.cisis.fhir.r4/2.0.0 |
| HL7.fhir.uv.phd | 1.0.0 | https://simplifier.net/packages/hl7.fhir.uv.phd/1.0.0/files/596424 |
Les profils MES des objets "Observation" détaillés dans le volet des constantes de santé ont les champs requis suivants par défaut :
meta
profilestatuscategory
coding
systemcodecode
coding
systemcodesubjecteffectiveDateTimeLa ressource Observation permet d'indiquer les résultats de deux manières :
value[x] s'il n'y a qu'un résultatcomponent si l'observation est composée de plusieurs résultats (ex : pression artérielle)Les profils FHIR des mesures de santé gérées par MES, sont définis avec l'ANS à travers le volet mesures de santé du CI-SIS.
####### Profils FHIR des mesures de santé
| Type de mesure | Nom du profil | Urls canoniques |
|---|---|---|
| Poids | MESObservationBodyWeight | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-bodyweight |
| Taille | MESObservationBodyHeight | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-bodyheight |
| IMC | MESObservationBMI | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-bmi |
| Pression artérielle | MESObservationBP | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-bp |
| Température | MESObservationBodyTemperature | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-bodytemperature |
| Glucose | MESObservationGlucose | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-glucose |
| Niveau de douleur | MESObservationPainSeverity | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-painseverity |
| Nombre de pas | MESObservationStepsByDay | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-stepsbyday |
| Tour de taille | MESObservationWaistCircumference | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-waistcircumference |
| Tour de tête | MESObservationHeadCircumference | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-headcircumference |
| Fréquence cardiaque | MESObservationHeartrate | https://fhir.monespacesante.fr/ref/mesure/StructureDefinition/mes-observation-heartrate |
####### Extensions
Les extensions sont publiées sur l'Implementation Guide ANS : https://interop.esante.gouv.fr/ig/fhir/mesures/ImplementationGuide/ans.fhir.fr.mesures
| Nom de l'extension | Url canonique | Rôle |
|---|---|---|
| MESReasonForMeasurement | https://interop.esante.gouv.fr/ig/fhir/mesures/StructureDefinition/mesures-reason-for-measurement | Motif de la mesure. Exprimé en texte libre. |
| MESMomentOfMeasurement | https://interop.esante.gouv.fr/ig/fhir/mesures/StructureDefinition/mesures-moment-of-measurement | Moment de la mesure. Exprimé par un texte libre ou un code. |
| MESNumberOfDays | https://interop.esante.gouv.fr/ig/fhir/mesures/StructureDefinition/mesures-number-of-days | Nombre de jours. Utilisé pour les mesures du taux de glucose interstitiel et l'index de gestion de glycémie. |
| MESDiabetisType | https://interop.esante.gouv.fr/ig/fhir/mesures/StructureDefinition/mesures-diabetis-type | Type de diabète. Utilisé pour déterminer le type de diabète de l'usager. |
Le profil "PhdDevice" s'utilise lorsque la mesure est faite par un objet connecté conforme aux normes "ISO / IEEE 11073-20601" pour les dispositifs de santé personnels (PHD – Personal Health) tels que les balances, les tensiomètres, les lecteurs de glycémie, etc.
Le profil "PhdDevice" est spécifié par IHE (package hl7.fhir.uv.phd, version 1.0.0) dans le document dont l'url correspond à : https://hl7.org/fhir/uv/phd/PhdDeviceProfile.html
Les détails des champs du profil sont disponibles en suivant l'adresse suivante : https://simplifier.net/packages/hl7.fhir.uv.phd/1.0.0/files/596424
####### Structure JSON d'un Device PHD (champs requis en gras)
{
"resourceType": "Device",
"meta": {
"profile": [
"http://hl7.org/fhir/uv/phd/StructureDefinition/PhdDevice"
]
},
"id": "3bc44de3-069d-442d-829b-f3ef68cae372",
"identifier": [
{
"type": {
"coding": [
{
"system": "http://hl7.org/fhir/uv/phd/CodeSystem/ContinuaDeviceIdentifiers",
"code": "SYSID"
}
]
},
"system": "urn:oid:1.2.840.10004.1.1.1.0.0.1.0.0.1.2680",
"value": "71-10-00-FE-FF-5F-49-B0"
}
],
"manufacturer": "ProDoc",
"serialNumber": "SuperTM",
"deviceName": [
{
"name": "SuperTM",
"type": "manufacturer-name"
}
],
"modelNumber": "STM-1000A",
"type": {
"coding": [
{
"system": "urn:iso:std:iso:11073:10101",
"code": "65573"
}
]
},
"specialization": [
{
"systemType": {
"coding": [
{
"system": "urn:iso:std:iso:11073:10101",
"code": "528457"
}
]
},
"version": "2.3"
}
]
}
####### Codes Device
À noter les deux codes indiqués ci-dessus :
Ci-dessous, une liste d'exemples de codes de specialization obtenus par la formule suivante :
(Code_de_Partition) x 2^16 + (Term_Code)
Le code de partition "8" correspondant à "INFRA".
Par exemple pour une balance "Weight Scale" :
8 x 2^16 + 4111 = 528399
####### Codes MDC des spécialisations
| Specialization | Code MDC (Code partition::Term code) | Code du champs JSON |
|---|---|---|
| Generic 20601 Device | 8::4169 | 528457 |
| Pulse Oximeter | 8::4100 | 528388 |
| Electro cardiograph | 8::4102 | 528390 |
| Blood Pressure Cuff | 8::4103 | 528391 |
| Thermometer | 8::4104 | 528392 |
| Respiration rate | 8::4109 | 528397 |
| Weight Scale | 8::4111 | 528399 |
| Glucose Monitor | 8::4113 | 528401 |
| Coagulation meter | 8::4114 | 528402 |
| Insulin Pump | 8::4115 | 528403 |
| Body Composition Analyzer | 8::4116 | 528404 |
| Peak Flow meter | 8::4117 | 528405 |
| Sleep Apnea Breathing Equipment | 8::4120 | 528408 |
| Continuous Glucose Monitor | 8::4121 | 528409 |
| Cardiovascular Device | 8::4137 | 528425 |
| Strength Equipment | 8::4138 | 528426 |
| Independent Activity/Living Hub | 8::4167 | 528455 |
| Medication Monitor | 8::4168 | 528456 |
Cette liste d'exemples est non-exhaustive et provient des spécifications FHIR. Obtenir d'autres codes MDC et donc d'autres codes de champs nécessite l'acquisition de la norme ISO/IEEE 11073-10101:2020.
Le flux d'alimentation unitaire d'une constante reprend la logique de la transaction "PCH 01" (Communicate FHIR PHD data) du profil "IHE POU" (Personal Health Device Observation Upload). Ce profil et cette transaction sont détaillés dans la documentation IHE.
Ce profil se base sur l'interaction "transaction" de l'API REST de FHIR. Il s'agit d'une requête http POST dont le corps est une ressource "Bundle" de type "transaction".
Le corps de cette requête contient un "Bundle" qui peut contenir jusqu'à deux ressources :
La ressource Device est optionnelle pour permettre l'alimentation d'une observation non issue d'un appareil de prise de mesure. Si un device est à l'origine de l'observation alors il doit être présent dans le bundle d'alimentation. La suite de cette documentation prend en compte l'hypothèse d'une alimentation d'observation avec Device.
Les deux ressources Observation et Device sont incorporées dans la liste ("array") de Bundle.entry. Chaque élément de cette liste est un objet contenant 2 sous-objets : une ressource et la requête http associée.
Ci-dessous, la structure d'un "bundle" au format JSON contenant des ressources "Observation" et "Device" dans l'attribut Bundle.entry.
{
"resourceType": "Bundle",
"type": "transaction",
"entry": [
{
"fullUrl": "11234563-069d-112d-829b-f01234567892",
"resource": {
"resourceType": "Observation",
"meta": {
"source": "<OID de la solution éditeur>",
"profile": [
"http://esante.gouv.fr/ci-sis/fhir/StructureDefinition/ENS_FrObservationBp"
]
},
...
"device": {
"reference": "Device/3bc44de3-069d-442d-829b-f3ef68cae372"
}
},
"request": {
"method": "POST",
"url": "Observation"
}
},
{
"resource": {
"resourceType": "Device",
"meta": {
"profile": [
"http://hl7.org/fhir/uv/phd/StructureDefinition/PhdDevice"
]
},
"id": "3bc44de3-069d-442d-829b-f3ef68cae372",
...
},
"request": {
"method": "POST",
"url": "Device",
"ifNoneExist": "identifier=urn:oid:<OID du PHD|Identifier PHD>"
}
}
]
}
Le champ "type" du "bundle" doit être fixé à "transaction", l'attribut "request" doit être présent avec la method POST et l'url avec le resourceType.
À noter que la validation FHIR requiert l'incorporation d'un champ "fullUrl" pour l'observation.
L'attribut ifNoneExist contenant l'oid du device (« sous oid » de la solution éditeur) et son identifier est obligatoire pour la ressource Device. Cet attribut permet d'exécuter la transaction « conditional create » pour les Devices :
La ressource Device doit être référencée dans l'attribut Observation.device.reference. Ainsi, il doit contenir le préfixe « Device/ » et le Device.id doit contenir uniquement l'uuid.
Le système source de la donnée est indiqué dans le champ meta de l'observation. Le champ source contient l'oid de la solution à l'origine de l'alimentation de l'observation.
Ce champ est facultatif :
L'Observation et le Device doivent renseigner l'url canonique du profil dans le champs meta.profile. Cette information est nécessaire, elle permet de valider la conformance des ressources Device avec le profil PhdDevice ainsi que celle des ressources Observation avec l'un des 11 profils des mesures de santé.
Le profil ENS_ObservationGlucose permet de gérer 4 types d'indicateurs de glycémie :
En fonction du type de glycémie, des contrôles métiers sur les extensions ENS_NumberOfDays (Nombre de jours) et ENS_MomentOfMeasurement (Contexte de la mesure) sont effectués par l'ENS :
| Glycémie | HbA1c | Taux de glucose interstitiel moyen | Indicateur de gestion de glycémie | |
|---|---|---|---|---|
| Unité | mg/dl | % | mg/dl | % |
| Contexte de la mesure (Liste : à jeun, après un repas, après l'effort, lors d'un malaise et autre) | ✅ | ❌ | ❌ | ❌ |
| Nombre de jours (Liste : 7j, 14 j, 30 j, 90 j et autre) | ❌ | ❌ | ✅ | ✅ |
| Commentaire | ✅ | ✅ | ✅ | ✅ |
Ci-dessous, un exemple de "Bundle" complet qui doit être envoyé dans le corps de la requête d'alimentation. Ce Bundle contient 2 ressources dans l'attribut "entry" :
urn:oid:1.2.840.10004.1.1.1.0.0.1.0.0.1.2680|FE-ED-AB-AA-DE-AD-77-C5{
"resourceType": "Bundle",
"type": "transaction",
"entry": [
{
"resource": {
"resourceType": "Device",
"id": "3bc44de3-069d-442d-829b-f3ef68cae371",
"meta": {
"profile": [
"http://hl7.org/fhir/uv/phd/StructureDefinition/PhdDevice"
]
},
"identifier": [
{
"type": {
"coding": [
{
"system": "http://hl7.org/fhir/uv/phd/CodeSystem/ContinuaDeviceIdentifiers",
"code": "SYSID"
}
]
},
"system": "urn:oid:1.2.840.10004.1.1.1.0.0.1.0.0.1.2680",
"value": "FE-ED-AB-AA-DE-AD-77-C5"
}
],
"manufacturer": "OMRONHEALTHCARE",
"modelNumber": "HEM-9200T",
"deviceName": [
{
"name": "Ma balance",
"type": "patient-reported-name"
}
],
"type": {
"coding": [
{
"system": "urn:iso:std:iso:11073:10101",
"code": "65573"
}
]
},
"specialization": [
{
"systemType": {
"coding": [
{
"system": "urn:iso:std:iso:11073:10101",
"code": "528457"
}
]
},
"version": "2.3"
}
]
},
"request": {
"method": "POST",
"url": "Device",
"ifNoneExist": "identifier=urn:oid:1.2.840.10004.1.1.1.0.0.1.0.0.1.2680|FE-ED-AB-AA-DE-AD-77-C5"
}
},
{
"fullUrl": "3bc44de3-069d-442d-829b-f3ef68cae372",
"resource": {
"resourceType": "Observation",
"meta": {
"profile": [
"http://esante.gouv.fr/ci-sis/fhir/StructureDefinition/ENS_FrObservationBodyWeight"
]
},
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Signes vitaux"
}
]
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "29463-7",
"display": "Poids corporel"
}
]
},
"subject": {
"identifier": {
"system": "urn:oid:1.2.840.10004.1.1.1.0.0.1.0.0.1.2560",
"value": ""
}
},
"device": {
"reference": "Device/3bc44de3-069d-442d-829b-f3ef68cae371"
},
"effectiveDateTime": "2022-08-22T01:56:16+01:00",
"valueQuantity": {
"value": 71,
"unit": "kg",
"system": "http://unitsofmeasure.org",
"code": "kg"
},
"extension": [
{
"url": "http://esante.gouv.fr/ci-sis/fhir/StructureDefinition/ENS_ReasonForMeasurement",
"valueString": "Mon nouveau poids !"
}
]
},
"request": {
"method": "POST",
"url": "Observation"
}
}
]
}
Dans le cas de la pression artérielle, il y a deux résultats : la pression artérielle systolique et diastolique.
Ainsi, dans le cas du profil MESFrObservationBp, l'usage de value[x] est interdit, il faut utiliser le champs component. Voici un exemple de pression artérielle à intégrer dans un bundle :
{
"resourceType": "Observation",
"meta": {
"profile": [
"http://esante.gouv.fr/ci-sis/fhir/StructureDefinition/ENS_FrObservationBp"
]
},
"component": [
{
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8480-6"
}
]
},
"valueQuantity": {
"value": 120,
"unit": "mm[Hg]",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
},
{
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8462-4"
}
]
},
"valueQuantity": {
"value": 60,
"unit": "mm[Hg]",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
}
]
}
En cas de succès, le code http 200 OK est retourné.
Le corps de la réponse contient une ressource Bundle de type « transaction-response » avec la liste des réponses pour chaque ressource envoyée. Chacune de ces réponses contient :
Voici un exemple de retour à la suite de la création d'une Observation et d'un nouveau Device :
{
"resourceType": "Bundle",
"type": "transaction-response",
"entry": [
{
"response": {
"status": "201 Created",
"location": "Observation/29680733-6158-4e22-ab7e-eb6825dcdb13"
}
},
{
"response": {
"status": "201 Created",
"location": "Device/3bc44de3-069d-442d-829b-f3ef68cae371"
}
}
]
}
####### Codes d'erreur
Dans le cas d'une erreur rencontrée, un code erreur HTTP est retourné :
| Statut | Error | Message | Précision |
|---|---|---|---|
| 400 | Bad Request | HTTP code 400 : Bad request -> The ID_TOKEN value is not valid (invalid JWT) | |
| 401 | Unauthorized | L'access_token est invalide | |
| 403 | Forbidden | idPe requested do not match authorized idPe. | idPe dans la request ne correspond pas à l'idPe de l'id_token |
| 403 | Forbidden | Consent not given, access refused. | L'usager n'a pas donné son consentement pour l'opération d'écriture demandée. |
| 400 | Bad Request | No bundle provided. | |
| 409 | Conflict | HTTP code 409 :OID conflict between the one from id_token and the one in the system -> OID different between id_token and ecosystem |
####### OperationOutcome
Le corps de la réponse contient une ressource Bundle de type « transaction-response ». Cette ressource contient le détail des erreurs et avertissements résultants du traitement de la requête transmise à MES.
En cas d'erreur, une ressource OperationOutcome est renvoyée avec le code HTTP « 422 Unprocessable Entity » :
| Niveau | Élément | Card | Type | Description |
|---|---|---|---|---|
| 0 | OperationOutcome | 0..1 | ||
| 1 | Issue | 1..* | BackboneElement | |
| 2 | Severity | 1..1 | Code | Criticité de l'erreur (http://hl7.org/fhir/ValueSet/issue-severity) |
| 2 | Code | 1..1 | Code | Type d'erreur (http://www.hl7.org/fhir/valueset-issue-type.html) |
| 2 | Diagnostics | 0..1 | String | Informations complémentaires sur l'erreur |
####### Liste des erreurs de validation
| Code HTTP | Message | Outcome type | Outcome diagnostic | Précision | |
|---|---|---|---|---|---|
| 422 | Bundle not valid. | NOTSUPPORTED | Resource of type <> is not acceptable with method <>. | L'API ne prend en charge que les ressources Observation ou Device en POST. | |
| 422 | Bundle not valid. | INVALID | Device request must have a valid IfNoneExist attribute : identifier=urn:oid:<OID> | <DEVICE ID> | Si un device est présent, l'identifier du device présent dans l'attribut « ifNoneExist » doit respecter la regex |
| 422 | Bundle not valid. | INVALID | Bundle must contains one observation creation (POST) | ||
| 422 | Observation and Device link not valid. | INVALID | Observation.device.reference is mandatory. | ||
| 422 | Observation and Device link not valid. | INVALID | Observation and device not linked by id (Observation.device.reference <-> Device.id) | ||
| 422 | Observation resource not valid. | INVALID | Observation must provide meta.profile value. | ||
| 422 | Observation resource not valid. | VALUE | Solution oid contains in Observation.meta.source don't belong to root editor oid (<OID>). | Si cet attribut est fourni, il est validé. | |
| 422 | Observation resource not valid. | VALUE | Observation value quantity not provided. | Dans l'ENS, des observations sans valeur sont refusées | |
| 422 | Observation resource not valid. | NOTSUPPORTED | Bmi observation cannot be created. | Les observations IMC sont calculées à la volée | |
| 422 | Observation resource not valid. | INVALID | Observation.subject.identifier is mandatory. | Ce champ doit contenir le couple oid/IDPE | |
| 422 | Observation resource not valid. | INCOMPLETE | Observation.extension.moment is mandatory. | Se référer au cas particulier de la glycémie | |
| 422 | Observation resource not valid. | INVALID | Observation.extension.numberOfDays cannot be added. | Se référer au cas particulier de la glycémie | |
| 422 | Observation resource not valid. | INVALID | Observation.extension.moment cannot be added. | Se référer au cas particulier de la glycémie | |
| 422 | Observation resource not valid. | INCOMPLETE | Observation.extension.numberOfDays is mandatory. | Se référer au cas particulier de la glycémie | |
| 422 | Device resource not valid. | INVALID | Device must provide meta.profile value. |
L'API de lecture des observations consiste en une requête de type Search qui suit la spécification FHIR.
Deux modes de recherche sont mis à disposition. Pour faciliter la suite de la documentation, nous les appellerons « all » et « last ».
La recherche « all » recherche toutes les observations pour un code mesures (Observation.code) donné sur une période. Toutes les observations dont l'Observation.effectiveDateTime est comprise dans la période seront retournées.
La recherche « last » permet de récupérer la dernière observation pour un code mesures (Observation.code) donné.
####### 2.3.1.1. Paramètres d'appel de l'opération Search
| Nom du paramètre | Obligatoire/facultatif | Valeur | Commentaire |
|---|---|---|---|
| code | Obligatoire | Code correspondant à l'observation recherchée | Code LOINC du type d'observation recherché : • 29463-7 : Body weight • 8302-2 : Body height • 8280-0 : Waist circumference • 8310-5 : Body temperature • 2345-7 : Glucose • MED-969 : Interstitial Glucose • 4548-4 : Glycated hemoglobin • MED-972 : Hemoglobin glycation index • 85354-9 : Blood pressure • 39156-5 : Body Mass Index • 72514-3 : Pain severity • 8867-4 : Heart rate • 41950-7 : Steps By Day • 8287-5 : Head circumference |
| subject.identifier | Obligatoire | « Dérivé de l'OID identifiant le patient lors de l'appariement (AssignAuth) » + « | » + « Identifiant du patient (idpe) » | Un contrôle est effectué pour s'assurer que ce patient est cohérent avec les informations d'identification |
| date | Obligatoire pour la recherche « all » | Période sur laquelle s'applique la recherche Ex : date=ge2021-02-16&date=le2021-02-26 |
https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations_search.html#DATE_RANGES http://hl7.org/fhir/search.html#date Si une borne est définie, les deux sont obligatoires. Lorsque les deux champs dates sont fournis, toutes les mesures dont l'Observation.effectiveDateTime se situe entre les deux dates sont retournées |
| _include | Facultatif | Observation:device | Si le paramètre _include est présent et s'il contient « Observation:device », alors les ressources Device sont incluses dans le bundle de retour sans doublon http://hl7.org/fhir/r4/search.html#include |
| _offset | Facultatif | Numéro de page | La première page à l'index 0. Valeur par défaut : 0 |
| _count | Facultatif pour « all » Obligatoire pour « last » |
Nombre d'observations par page | Maximum : 100. Valeur par défaut : 50 L'inclusion ou non des devices n'a pas d'impact sur ce compteur. |
| _sort | Obligatoire pour « last » | Doit toujours être égal à « -date » |
####### Recherche « all » :
https://<baseUrl>/fhir/Observation?subject.identifier=&code=29463-7&date=gt2022-09-04&date=lt2022-09-23&_offset=0&_count=2&_include=Observation.device
| Attention : Si vous effectuez vos tests via Postman vous devez remplacer le « | » séparant l'AssignAuth et l'idpe par « %7C ». |
Cette requête permet de récupérer, pour l'usager ayant l'identifiant Patient Externe « idPe », avec une pagination de deux ressources Observation par page :
####### Requête « last » :
https://<baseUrl>/fhir/Observation?subject.identifier=&code=29463-7&_sort=-date&_count=1&_include=Observation.device
Elle permet de récupérer, pour l'usager ayant l'identifiant Patient Externe « idPe » :
Quel que soit le mode de recherche, le corps de la réponse contient un bundle de type searchset avec pagination (présence des liens previous/self/next pour naviguer dans la pagination).
Exemple de retour de la première page de 2 observations d'une recherche contenant 4 observations au total. Le device remonté étant commun aux 2 observations, il n'est présent qu'une fois :
{
"resourceType": "Bundle",
"id": "0479299d-e813-480b-a00d-4e96b50299e3",
"meta": {
"lastUpdated": "2022-09-22T04:23:24.163+02:00"
},
"type": "searchset",
"total": 4,
"link": [
{
"relation": "next",
"url": "http://<BaseURL>/fhir/Observation?subject.identifier=patient-externe-id-2&code=29463-7&date=2022-09-04&_offset=1&_count=2&_include=Observation.device"
},
{
"relation": "self",
"url": "http://<BaseURL>/fhir/Observation?subject.identifier=patient-externe-id-2&code=29463-7&date=2022-09-04&_offset=0&_count=2&_include=Observation.device"
}
],
"entry": [
{
"resource": {
"resourceType": "Observation",
"id": "3bc44de3-069d-442d-829b-f3ef68cae372",
"meta": {
"source": "urn:oid:1.2.250.1.215.400",
"profile": [
"http://esante.gouv.fr/ci-sis/fhir/StructureDefinition/ENS_FrObservationBodyWeight"
]
},
"extension": [
{
"url": "http://esante.gouv.fr/ci-sis/fhir/StructureDefinition/ENS_ReasonForMeasurement",
"valueString": "Mon nouveau poids !"
}
],
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Signes vitaux"
}
]
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "29463-7",
"display": "Poids corporel"
}
]
},
"subject": {
"identifier": {
"system": "urn:oid:1.2.250.1.215.400",
"value": "patient-externe-id-2"
}
},
"effectiveDateTime": "2022-09-22T01:56:16+01:00",
"valueQuantity": {
"value": 71,
"unit": "kg",
"system": "http://unitsofmeasure.org",
"code": "kg"
},
"device": {
"reference": "Device/75d4e824-7ea3-4719-90f4-c9d9ce871239"
}
}
},
{
"resource": {
"resourceType": "Device",
"id": "75d4e824-7ea3-4719-90f4-c9d9ce871239",
"meta": {
"profile": [
"http://hl7.org/fhir/uv/phd/StructureDefinition/PhdDevice"
]
},
"identifier": [
{
"type": {
"coding": [
{
"system": "http://hl7.org/fhir/uv/phd/CodeSystem/ContinuaDeviceIdentifiers",
"code": "SYSID"
}
]
},
"system": "urn:oid:1.2.840.10004.1.1.1.0.0.1.0.0.1.2680",
"value": "FE-ED-AB-AA-DE-AD-77-C5"
}
],
"manufacturer": "OMRONHEALTHCARE",
"serialNumber": "20150200002A",
"deviceName": [
{
"name": "Ma balance",
"type": "patient-reported-name"
}
],
"modelNumber": "HEM-9200T",
"type": {
"coding": [
{
"system": "urn:iso:std:iso:11073:10101",
"code": "65573"
}
]
},
"specialization": [
{
"systemType": {
"coding": [
{
"system": "urn:iso:std:iso:11073:10101",
"code": "528457"
}
]
},
"version": "2.3"
}
]
}
}
]
}
####### Codes d'erreur
Dans le cas d'une erreur rencontrée, un code erreur HTTP est retourné :
| Statut | Error | Message |
|---|---|---|
| 400 | Bad Request | HTTP code 400 : Bad request -> The ID_TOKEN value is not valid (invalid JWT) |
| 401 | Unauthorized | L'access_token est invalide |
| 403 | Forbidden | idPe requested do not match authorized idPe. (idPe dans la request ne correspond pas à l'idPe de l'id_token) |
| 403 | Forbidden | Consent not given, access refused. (L'usager n'a pas donné son consentement pour l'opération de lecture demandée) |
| 409 | Conflict | HTTP code 409 :OID conflict between the one from id_token and the one in the system -> OID different between id_token and ecosystem |
Dans le cas où la requête ne serait pas valide, un code HTTP « 400 Request not valid » sera renvoyé avec une ressource OperationOutcome dans le corps de la réponse. Cette ressource contient le détail des erreurs et avertissements résultants du traitement de la requête transmise par MES.
| Code HTTP | Message | Outcome type | Outcome diagnostic | Précision |
|---|---|---|---|---|
| 400 | Request not valid | INVALID | Maximum page size allowed is <max_page_size>. Actual : <request_pageSize> | |
| 400 | Request not valid | INVALID | Sort parameter must be equals to -date (date DESC) with _count equals to 1 to retrieve last observation | Dans le cas d'une recherche « last » |
| 400 | Request not valid | INVALID | Paged search and search last cannot be requested concurrently | |
| 400 | Request not valid | INVALID | No search mode detected |