eHealth TRHC MedWise Risk API Demo

node v8.17.0
version: 1.0.0
endpointsharetweet
Goal: Let's display MedWise visualizations using the new TRHC MedWise Risk API and sample test resources from the smarthealthit demo fhir server. Step 1 - Create an app in the eHealth developer portal (soon to be developer.trhc.com) Step 2- eHealth approves the app Step 3 - Create Prerequisites: We are assuming the developer has obtained a Client ID and Secret from eHealth Services. These "keys" represent a developer application that is approved to use the MedWise Risk API. Get access token using OAuth2 Client Credentials. Warning! Be sure to keep the secret safe! Don't store your secrets in souce code control. Don't expose secrets within the code of a user agent such as a web browser or mobile client. Part 1 - Get access token using OAuth2 Client Credentials.
require('isomorphic-fetch') // authentication url const authUrl = process.env.AUTH_URL // create basic authentication with id and secret const basicAuth = Buffer.from(`${process.env.MW_RISK_API_TEST_APP_CLIENTID}:${process.env.MW_RISK_API_TEST_APP_SECRET}`).toString('base64') // get access token from authentication server const doc = await fetch(authUrl, { headers: { Authorization: `Basic ${basicAuth}`, 'Content-Type': 'application/json' }, method: 'POST' }).then(res => res.json()) const accessToken = doc.access_token console.log('access token', accessToken)
Now that we have the access token, we need to create a temporary profile to be used to generate the visualizations. We fetch a patient from the FHIR server using a patientId. Next, we grab an array of MedicationOrder FHIR resources for the patient. Since MedWise Risk API currently only accepts Medication, MedicationStatement, and MedicationDispense FHIR resources, we convert the MedicationOrders to simpler Medication resources. The patient and medications will be used to create a FHIR bundle.
const { pluck, prop, map } = require('ramda') const patientId = 'smart-1685497' const patient = await fetch('https://r2.smarthealthit.org/Patient/' + patientId) .then(res => res.json()) .then(patient => ({resource: patient})) const medications = await fetch('https://r2.smarthealthit.org/MedicationOrder?patient=' + patientId) .then(res => res.json()) .then(bundle => pluck('resource', prop('entry', bundle))) .then(pluck('medicationCodeableConcept')) .then(map(med => ({resource: { resourceType: 'Medication', code: med }})))
Now that we have our access token and our patient and converted medications, we can create a bundle
const bundle = { resourceType: 'Bundle', type: 'collection', entry: [ patient, ...medications ] } JSON.stringify(bundle, null, 2)
and submit to MedWise Risk API. Note the absense of the risk score data in the response JSON. This has been moved to a new GET /profiles/{profile id}/scoredata endpoint which provide the risk score as JSON data. See call to scoredata toward the end of this runkit.
const result = await fetch(`${process.env.MEDWISE_RISK_API_URL}/profiles`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` }, body: JSON.stringify(bundle) }).then(res => res.json()) const profileId = result.id result
Above, you can see the returned object contains a profile Id and risk score. Now that we have a profileId, we can retrieve the 4 visualizations....
const score = await fetch(`${process.env.MEDWISE_RISK_API_URL}/profiles/${result.id}/riskscore`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` } }) .then(res => res.json()) score.html
const matrix = await fetch(`${process.env.MEDWISE_RISK_API_URL}/profiles/${result.id}/matrix`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` } }) .then(res => res.json()) matrix.html
const riskFactors = await fetch(`${process.env.MEDWISE_RISK_API_URL}/profiles/${result.id}/risk-factors`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` } }) .then(res => res.json()) riskFactors.html
const adverseEffects = await fetch(`${process.env.MEDWISE_RISK_API_URL}/profiles/${result.id}/adverse-effects`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` } }) .then(res => res.json()) adverseEffects.html
A new GET /profiles/{profile id}/scoredata endpoint provides the risk score as JSON data.
const scoreData = await fetch(`${process.env.MEDWISE_RISK_API_URL}/profiles/${result.id}/scoredata`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` } }) .then(res => res.json()) scoreData
The bundle that was send in the prior POST to /profiles is cached for a limited time.
const cachedBundle = await fetch(`${process.env.MEDWISE_RISK_API_URL}/profiles/${result.id}`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` } }) .then(res => res.json()) cachedBundle
Loading…

no comments

    sign in to comment