UNPKG

yrexpert-js

Version:

L'interface Web pour votre système expert...

320 lines (280 loc) 9.24 kB
var nodeYRexpert = require('nodeYRexpert'); var crypto = require('crypto'); // Crypto functions var encryptCredentials = function(accessCode, verifyCode, key) { var text = 'accessCode=' + accessCode + '&verifyCode=' + verifyCode; var cipher = crypto.createCipher('aes-256-cbc',key) var crypted = cipher.update(text,'utf8','hex') crypted += cipher.final('hex'); return crypted; }; var decryptCredentials = function(encryptedString, key) { var decipher = crypto.createDecipher('aes-256-cbc', key); var dec; try { dec = decipher.update(encryptedString,'hex','utf8') dec += decipher.final('utf8'); var str = dec.split('accessCode=')[1]; var pieces = str.split('&verifyCode='); return { accessCode: pieces[0], verifyCode: pieces[1] }; } catch(err) { return { error: 'Invalid credentials value' } } }; // Re-usable core YRexpert interface functions var yrexpertLogin = function(accessCode, verifyCode, ewd) { var authP = new ewd.mumps.GlobalNode('%zewdTemp', [process.pid]); authP._delete(); authP._setDocument({ inputs:{ password: verifyCode, username: accessCode } }); var result = ewd.mumps.function('login^ZZCPCR00', ''); if (result === '') { var document = authP._getDocument(); return { error: false, outputs: document.outputs }; } else{ return {error: result}; } }; var getPatientsByName = function(prefix, max, ewd) { var patientIndex = new ewd.mumps.GlobalNode("DPT", ["B"]); var results = []; var namesById = {}; var i = 0; patientIndex._forPrefix(prefix.toUpperCase(), function(name, node) { node._forEach(function(id) { i++; if (i > max) return true; results.push({ id: id, text: name }); namesById[id] = name; }); if (i > max) return true; }); return { results: results, namesById: namesById }; }; var getPatientSummaryDetails = function(patientId, ewd) { var patient= new ewd.mumps.GlobalNode("DPT", [patientId,'0']); var patientRec0 = patient._value; var patientObj = patientRec0.split('^'); return { EIN: patientId, name: patientObj[0], sex: patientObj[1], DOB: nodeYRexpert.convertFtoStringDate(patientObj[2]), SSN: patientObj[8] }; }; // REST & Web Server authentication function var authenticate = function(ewd) { var statusCode = 401; var token = ewd.query.token; if (ewd.query['rest_auth']) token = ewd.query['rest_auth']; if (!token) { return errorResponse('Failed authentication (1)', statusCode, ewd); } else if (token === '') { return errorResponse('Failed authentication (2)', statusCode, ewd); } else { var session = ewd.util.getSession(token); if (session === '') { return errorResponse('Failed authentication (3)', statusCode, ewd); } else { ewd.util.updateSessionExpiry({ sessid: session.$('ewd_sessid')._value }); return { ok: true, session: session } } } }; var loginStatus = function(ewd) { var status = authenticate(ewd); if (status.error) return status; var statusCode=401; if (status.session.$('yrexpertUser').$('DUZ')._value === '') return errorResponse('Failed authentication (4)', statusCode, ewd); if (status.session.$('cipherKey')._value !== '') return errorResponse('Failed authentication (5)', statusCode, ewd); return status; } // REST & Web Service error response formatter function var errorResponse = function(error, statusCode, ewd) { if (ewd.query['rest_method']) { return { "error": { "text": error, "statusCode": statusCode } }; } else { return {error: error}; } }; module.exports = { // encryption function for manual testing encrypt: function(accessCode, verifyCode, key) { return encryptCredentials(accessCode, verifyCode, key); }, // Web Service wrappers initiate: function(ewd) { var session = ewd.util.createNewSession('yrexpertStart', 300); var token = session.$('ewd_token')._value; var key = ewd.util.createToken(); session.$('cipherKey')._value = key; return { Authorization: token, key: key }; }, login: function(ewd) { var status = authenticate(ewd); if (status.error) { return status; } else { var session = status.session; var sessid = session.$('ewd_sessid')._value; var errorStatusCode = 400; var key = session.$('cipherKey')._value; if (key === '') { ewd.util.deleteSession(sessid); return errorResponse('No key available', errorStatusCode, ewd); } var credentials = decryptCredentials(ewd.query.credentials, key); if (credentials.error) { ewd.util.deleteSession(sessid); return errorResponse(credentials.error, errorStatusCode, ewd); } if (!credentials.accessCode || credentials.accessCode === '') { ewd.util.deleteSession(sessid); return errorResponse('Missing Access Code', errorStatusCode, ewd); } if (!credentials.verifyCode || credentials.verifyCode === '') { ewd.util.deleteSession(sessid); return errorResponse('Missing Verify Code', errorStatusCode, ewd); } // **************************** var results = yrexpertLogin(credentials.accessCode, credentials.verifyCode, ewd); // **************************** if (results.error) { ewd.util.deleteSession(sessid); return errorResponse(results.error, errorStatusCode, ewd); } else { // logged in session.$('cipherKey')._delete(); //results.outputs.token = session.$('ewd_token')._value; session.$('yrexpertUser')._setDocument(results.outputs); return results.outputs; } } }, getPatientsByNamePrefix: function(ewd) { var status = loginStatus(ewd); if (status.error) { return status; } else { var session = status.session; var errorStatusCode = 400; if (!ewd.query.prefix || ewd.query.prefix === '') return errorResponse('You must enter a name prefix', errorStatusCode, ewd); // ****************************** var results = getPatientsByName(ewd.query.prefix, 1000, ewd) // ****************************** return results.results; } }, getPatientSummary: function(ewd) { var status = loginStatus(ewd); if (status.error) { return status; } else { var errorStatusCode = 400; if (!ewd.query.id || ewd.query.id === '') return errorResponse('You must enter a patient Id', errorStatusCode, ewd); // ********************************** var results = getPatientSummaryDetails(ewd.query.id, ewd) // ********************************** return results; } }, // EWD.js Application Handlers/wrappers onMessage: { 'EWD.form.login': function(params, ewd) { if (params.username === '') return 'You must enter an Access Code'; if (params.password === '') return 'You must enter a Verify Code'; // Access Code / Verify Code Example: fakedoc1/1Doc!@#$ // ********************************** var results = yrexpertLogin(params.username, params.password, ewd); // ********************************** if (results.error) { return results.error; } else { ewd.session.$('username')._value = params.username; ewd.session.$('userDUZ')._value = results.outputs.DUZ; ewd.session.$('displayName')._value = results.outputs.displayName; ewd.sendWebSocketMsg({ type: 'loggedInAs', message: { fullName: results.outputs.displayName } }); ewd.session.setAuthenticated(); ewd.sendWebSocketMsg({ type: 'loggedIn', message: { ok: true, name: ewd.session.$('displayName')._value } }); return ''; } }, patientQuery: function(params, ewd) { if (ewd.session.isAuthenticated) { // ******************************** var results = getPatientsByName(params.prefix, 40, ewd); // ******************************** ewd.session.$('names')._delete(); ewd.session.$('names')._setDocument(results.namesById); ewd.sendWebSocketMsg({ type: 'patientMatches', message: results.results }); } }, patientSelected: function(params, ewd) { if (ewd.session.isAuthenticated) { // record at back end for future validation of actions ewd.session.$('patientIdSelected')._value = params.patientId; // *********************************** var results = getPatientSummaryDetails(params.patientId, ewd) // *********************************** return results; } } } };