Source: mHelpDesk/updateAsset.js

/**
 * Update Asset
 * @module mHelpDesk/updateAsset
 */

const axios = require('axios')

const { getPromiseOfAccessToken } = require('./authentication')
const config = require('../config')

const updateAsset = async (xmlObject) => {
  // TODO: replace with generic access token getter
  const accessToken = await getPromiseOfAccessToken()
  const res = await axios({
    url: `${config.api.url}/portal/${config.api.portalId}/equipment`,
    method: 'get',
    headers: {
      Authorization: `Bearer ${accessToken}`
    }
  })
  const matchingEquipment = res.data.results.filter(result => {
    return result.customFields.some(field =>
      field.customFieldId ===
        config.api.equipmentCustomFieldMappings['ClientReferenceNumber'] &&
      parseInt(field.value) === parseInt(xmlObject['ClientReferenceNumber'][0])
    )
  })
  console.log(JSON.stringify(matchingEquipment))
  if (matchingEquipment.length !== 1) {
    throw new Error(`${matchingEquipment.length} matching equipments. Should be 1.`)
  }
  const equipmentToUpdate = matchingEquipment[0]
  equipmentToUpdate.serialNumber = xmlObject['SerialNumber'][0]
  // TODO: make this more extenisble. For now it's fine though.
  equipmentToUpdate.customFields.forEach(customField => {
    // xmlObject: these are arrays of one value
    switch (customField.customFieldId) {
      case config.api.equipmentCustomFieldMappings['ModelNumber']:
        customField.fieldValue = xmlObject['ModelNumber'][0]
        equipmentToUpdate.name = xmlObject['ModelNumber'][0]
        break
      case config.api.equipmentCustomFieldMappings['AssetId']:
        customField.fieldValue = xmlObject['AssetId'][0]
        break
      case config.api.equipmentCustomFieldMappings['Description']:
        customField.fieldValue = customField.value ? customField.value : 'No Description'
        break
      default:
        customField.fieldValue = customField.value
        break
    }
  })
  // filter out null custom fields; no need to submit + it errors
  equipmentToUpdate.customFields = equipmentToUpdate.customFields.filter(
    customField => customField.fieldValue !== null
  )
  const updatedEquipment = equipmentToUpdate
  console.log(JSON.stringify(updatedEquipment))
  await axios({
    url: `${config.api.url}/portal/${config.api.portalId}/equipment/${updatedEquipment.equipmentId}`,
    method: 'put',
    headers: {
      Authorization: `Bearer ${accessToken}`,
      'Content-Type': 'application/json'
    },
    data: JSON.stringify(updatedEquipment)
  })
  console.log('Updated Asset')
  return true
}

exports.updateAsset = updateAsset