Source: index.js

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
    })
}