eHealth TRHC MedWise Risk API Sample

node v8.17.0
version: 4.0.0
endpointsharetweet
Here are some samples scripts using the TRHC MedWise Risk API , these samples are using test resources from the smarthealthit demo fhir server. Prerequisites: We are assuming the developer has obtained a Client ID and Secret from MASS. 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.
const fetch = 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_PROD_APP_CLIENTID}:${process.env.MW_RISK_API_PROD_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 }}))) JSON.stringify(medications, null, 2)
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. Risk score data can be retrieved via the 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. Now that we have a profileId, internal TRHC developers can retrieve the 4 visualizations. (External developers only have access to the risk score data endpoint and risk score viz endpoint. External developers do not have access to matrix, adverse effects, and risk factor 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
For external and internal developers, a 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
For internal TRHC developers, a GET /profiles/{profile id}/allscoredata endpoint provides the risk score as JSON data.
const allScoreData = await fetch(`${process.env.MEDWISE_RISK_API_URL}/profiles/${result.id}/allscoredata`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` } }) .then(res => res.json()) JSON.stringify(allScoreData, null, 2)
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