cds-hooks/sandbox-cds-services

View on GitHub
services/patient-greeting.js

Summary

Maintainability
A
0 mins
Test Coverage
const express = require('express');
const axios = require('axios');
const uuidv4 = require('uuid/v4');

const router = express.Router();

function isDataAvailable(patient) {
  return patient.name && patient.name[0] && patient.name[0].given && patient.name[0].given[0];
}

function isValidPrefetch(request) {
  const data = request.body;
  if (!(data && data.prefetch && data.prefetch.patient)) {
    return false;
  }
  return isDataAvailable(data.prefetch.patient);
}

function retrievePatientResource(fhirServer, patientId, accessToken) {
  const headers = { Accept: 'application/json+fhir' };
  if (accessToken) {
    headers.Authorization = `Bearer ${accessToken}`;
  }
  return axios({
    method: 'get',
    url: `${fhirServer}/Patient/${patientId}`,
    headers,
  }).then((result) => {
    if (result.data && isDataAvailable(result.data)) {
      return result.data;
    }
    throw new Error();
  });
}

function buildCard(patient) {
  const name = patient.name[0].given[0];
  return {
    cards: [{
      uuid: uuidv4(),
      summary: `Now seeing: ${name}`,
      source: {
        label: 'Patient greeting service',
      },
      indicator: 'info',
    }],
  };
}

// CDS Service endpoint
router.post('/', (request, response) => {
  if (!isValidPrefetch(request)) {
    const { fhirServer, fhirAuthorization } = request.body;
    let patient;
    if (request.body.context) {
      patient = request.body.context.patientId;
    }
    if (fhirServer && patient) {
      let accessToken;
      if (fhirAuthorization && fhirAuthorization.access_token) {
        accessToken = fhirAuthorization.access_token;
      }
      retrievePatientResource(fhirServer, patient, accessToken)
        .then((result) => {
          response.json(buildCard(result));
        }).catch(() => {
          response.sendStatus(412);
        });
      return;
    }
    response.sendStatus(412);
    return;
  }
  const resource = request.body.prefetch.patient;
  response.json(buildCard(resource));
});

module.exports = router;