const xml2js = require('xml2js')
const {
unsupportedMediaTypeResponse,
badRequestResponse,
generateMovementResponse,
generateAssetResponse
} = require('./responses')
const {
createAsset,
updateAsset,
createPickupRequest,
createDeliveryRequest
} = require('./mHelpDesk')
/**
* This function is the root handler, it takes the event created by AWS and uses
* it to handle the input. The lambda function this resides in must be setup as
* a proxy handler within the AWS gateway, as this needs access to all request
* data, and the ability to construct its own responses.
* @param {object} event The AWS event object.
*/
exports.handler = async event => {
// Check that the request uses expected "Content-Type"s.
if (
!event.headers['Content-Type'] ||
!['text/xml', 'application/xml'].includes(event.headers['Content-Type'])
) {
return unsupportedMediaTypeResponse
}
const makeAction = (mHelpDeskManipulator, responseGenerator) => xmlObject =>
mHelpDeskManipulator(xmlObject)
.then(result => responseGenerator(xmlObject, result))
.catch(error => {
console.error(error)
return responseGenerator(xmlObject, null, error)
})
const actions = {
'ns0:CreateAssetBindingModel': makeAction(
createAsset, generateAssetResponse
),
'ns0:UpdateAssetBindingModel': makeAction(
updateAsset, generateAssetResponse
),
'ns0:PickupRequestBindingModel': makeAction(
createPickupRequest, generateMovementResponse
),
'ns0:DeliveryRequestBindingModel': makeAction(
createDeliveryRequest, generateMovementResponse
)
}
return new Promise((resolve, reject) => xml2js.parseString(
event.body,
(error, result) => {
// If there is an error, or we receive no XML, reject the promise.
if (error || !result) return reject(error || new Error('Empty XML'))
resolve(result)
}
))
.then(result => {
console.log(event.body)
console.log(result)
const key = Object.keys(result)[0]
if (!key || !result[key]) return badRequestResponse
return actions[key](result[key])
})
.catch(error => {
console.log(error)
return badRequestResponse
})
}