services/patient-greeting.js
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;