UNPKG

xmtoolbox

Version:

A Node JS package for interacting with xMatters. Contains functions to interact with xMatters APIs or perform a synchronization, create events, libraries to convert data, and much much more!

137 lines (120 loc) 3.95 kB
const dict = require('./dictionary'); /** * * @param {*} rowsJson * @param {*} people array of person objects with devices * @param {*} sites * @param {*} deviceNames */ async function userUploadToExport(rowsJson, people, sites, deviceNames) { const results = { people: [], devices: [], remove: [] }; const ignoreCol = getUserImportIgnoreColumns(deviceNames); rowsJson.map(row => { if (!row.Operation || row.Operation === 'process') { const person = {}; person.recipientType = 'PERSON'; person.targetName = row.User; person.status = 'ACTIVE'; if (row['First Name']) person.firstName = row['First Name']; if (row['Last Name']) person.lastName = row['Last Name']; if (row.Language) person.language = dict.language.codeByName[row.Language]; if (row['Time Zone']) person.timezone = row['Time Zone']; if (row.User) person.webLogin = row.User; if (row.Role) person.roles = row.Role.split('|'); if (row.Site) person.site = sites.find(site => site.name === row.Site).id; if (row['User Supervisor']) person.supervisors = getSupervisors(row['User Supervisor'], people); //get custom fields, attributes, or device. for (const key in row) { if (Object.prototype.hasOwnProperty.call(row, key) && ignoreCol.indexOf(key) < 0) { const value = row[key]; const deviceName = deviceNames.find(({ name }) => name === key); if (deviceName.deviceType) { //is device results.devices.push(getDevice(key, value, deviceName, row.User)); } else { if (!person.properties) person.properties = {}; //is custom field or attribute person.properties[key] = value.split('|'); } } } results.people.push(person); } else if (row.Operation === 'remove') { results.remove.push(row['User ID']); } }); return results; } /** * * @param {*} userSupervisor userSupervisor column in user upload. * * Format is : "{id}|{id}" where id is a UUID for a user's supervisor. * @param {*} people */ function getSupervisors(userSupervisor, people) { if (!userSupervisor) return undefined; return userSupervisor.split('|').map(UUID => people.find(({ targetName }) => targetName === UUID).id); } function getUserImportIgnoreColumns(deviceNames) { const ignoreList = [ 'Operation', 'Password Status', 'Last Login', 'Externally Owned Status', 'First Name', 'Language', 'Last Login', 'Last Name', 'Role', 'Site', 'Time Zone', 'User', 'User Supervisor', 'UUID' ]; for (let i = 0; i < deviceNames.length; i++) { const { name } = deviceNames[i]; ignoreList.push(name + ' Status', name + ' Valid'); } return ignoreList; } function getDevice(name, value, { deviceType }, personTargetName) { const device = { deviceType, name, owner: personTargetName, targetName: `${personTargetName}|${name}` }; switch (deviceType) { case 'EMAIL': device.emailAddress = value; break; case 'TEXT_PHONE': case 'VOICE': device.phoneNumber = value; break; default: break; } return device; } /** * called after people are added. This populates the owner property with the person's id * @param {*} devices * @param {*} people array of current people in the environment. [{targetName, id}] are the only props needed. */ function userUploadDevicesToExport(devices, people) { for (let index = 0; index < devices.length; index++) { const device = devices[index]; device.owner = people.find(({ targetName }) => targetName === device.owner).id; device.recipientType = 'DEVICE'; if (device.phoneNumber) device.phoneNumber = device.phoneNumber.replace(/\s/g, ''); } } exports.userUploadToExport = userUploadToExport; exports.userUploadDevicesToExport = userUploadDevicesToExport;