openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
73 lines (55 loc) • 2.76 kB
text/coffeescript
logger = require 'winston'
syslogParser = require('glossy').Parse
parseString = require('xml2js').parseString
firstCharLowerCase = require('xml2js').processors.firstCharLowerCase
Audit = require('./model/audits').Audit
parseAuditRecordFromXML = (xml, callback) ->
# DICOM mappers
csdCodeToCode = (name) -> if name is 'csd-code' then 'code' else name
originalTextToDisplayName = (name) -> if name is 'originalText' then 'displayName' else name
options =
mergeAttrs: true,
explicitArray: false
tagNameProcessors: [firstCharLowerCase]
attrNameProcessors: [firstCharLowerCase, csdCodeToCode, originalTextToDisplayName]
parseString xml, options, (err, result) ->
return callback err if err
if not result?.auditMessage
return callback new Error 'Document is not a valid AuditMessage'
audit = {}
if result.auditMessage.eventIdentification
audit.eventIdentification = result.auditMessage.eventIdentification
audit.activeParticipant = []
if result.auditMessage.activeParticipant
# xml2js will only use an array if multiple items exist (explicitArray: false), else it's an object
if result.auditMessage.activeParticipant instanceof Array
for ap in result.auditMessage.activeParticipant
audit.activeParticipant.push ap
else
audit.activeParticipant.push result.auditMessage.activeParticipant
if result.auditMessage.auditSourceIdentification
audit.auditSourceIdentification = result.auditMessage.auditSourceIdentification
audit.participantObjectIdentification = []
if result.auditMessage.participantObjectIdentification
# xml2js will only use an array if multiple items exist (explicitArray: false), else it's an object
if result.auditMessage.participantObjectIdentification instanceof Array
for poi in result.auditMessage.participantObjectIdentification
audit.participantObjectIdentification.push poi
else
audit.participantObjectIdentification.push result.auditMessage.participantObjectIdentification
callback null, audit
exports.processAudit = (msg, callback) ->
parsedMsg = syslogParser.parse(msg)
if not parsedMsg or not parsedMsg.message
logger.info 'Invalid message received'
return callback()
parseAuditRecordFromXML parsedMsg.message, (xmlErr, result) ->
audit = new Audit result
audit.rawMessage = msg
audit.syslog = parsedMsg
delete audit.syslog.originalMessage
delete audit.syslog.message
audit.save (saveErr) ->
if saveErr then logger.error "An error occurred while processing the audit entry: #{saveErr}"
if xmlErr then logger.info "Failed to parse message as an AuditMessage XML document: #{xmlErr}"
callback()