@apidaze/node-red-contrib-apidaze
Version:
Node-RED module for Apidaze
93 lines (76 loc) • 2 kB
JavaScript
function prepareCallData(data) {
const {
caller_id_number: caller_number = '',
uuid: call_uuid,
sessid: call_session_id,
destination_number: called_number,
caller_id_name: caller_id,
caller_username,
dialed_digits = '',
} = data;
const uuid = call_uuid || call_session_id;
const caller_descript = caller_id
? `${caller_id} (${caller_number})`
: caller_username;
const call = {
caller_number: caller_number.replace(' ', ''),
call_uuid: uuid,
called_number,
caller_id,
caller_username,
caller_descript,
dialed_digits,
custom: {},
};
return call;
}
async function prepareCallMessage(msg, addressBook) {
const callsDb = require('./call-store');
const { payload } = msg;
const { query } = payload;
let call = prepareCallData(query);
let isNewCall = false;
let hasUpdates = false;
const { call_uuid: uuid } = call;
try {
const calls = await callsDb.fetch(uuid);
if (!calls || calls.length === 0) {
call = await callsDb.add(call);
isNewCall = true;
} else {
call = calls[0];
}
} catch (err) {
console.error('An error has occured.', payload, err);
}
if (!!query.dialed_digits && query.dialed_digits.length > 0) {
call.dialed_digits = query.dialed_digits;
hasUpdates = true;
}
// inject the associated contact out of the `addressBook`
const contact = addressBook && (addressBook[call.called_number] || addressBook.default);
if (contact) {
call.custom = {
...call.custom,
...contact,
};
hasUpdates = true;
}
if (hasUpdates) {
call = await callsDb.update(uuid, call);
}
const isExiting = query.exiting === 'true';
// update the call data in the message payload
msg.payload.call = call;
if (isExiting) {
return [null, null, msg];
} else if (isNewCall) {
return [msg, null, null];
} else {
return [null, msg, null];
}
}
module.exports = {
prepareCallData,
prepareCallMessage,
};