HEX
Server: Apache
System: Linux p3plzcpnl506847.prod.phx3.secureserver.net 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: slfopp7cb1df (5698090)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: /home/slfopp7cb1df/public_html/Call/master/controllers/setup.js
const Twilio 	= require('twilio')
const async 	= require('async')

const client = new Twilio(
	process.env.TWILIO_ACCOUNT_SID,
	process.env.TWILIO_AUTH_TOKEN)

module.exports.get = function (req, res) {
	res.status(200).json(req.configuration)
}

module.exports.update = function (req, res) {
	let config = req.body.configuration

	async.waterfall([

		function (callback) {

			module.exports.createOrUpdateApplication(config, req, function (err, application) {
				if (err) {
					console.log('Setup Failure: Error setting up Twilio client application.')
					callback(err)
				} else {
					config.twilio.applicationSid = application.sid

					callback(null, config)
				}
			})

		}, function (config, callback) {

			module.exports.updateMessagingService(req, config, function (err) {
				if (err) {
					console.log('Setup Failure: Error updating messaging service.')
					callback(err)
				} else {
					callback(null, config)
				}
			})

		}, function (config, callback) {

			module.exports.syncQueues(config, function (err) {
				if (err) {
					console.log('Setup Failure: Error establishing queues.')
					callback(err)
				} else {
					callback(null, config)
				}
			})

		}, function (config, callback) {
			let workflowConfiguration = { task_routing: { filters: [] }}

			for (let i = 0; i < config.queues.length; i++) {
				let target = {
					queue: config.queues[i].taskQueueSid
				}

				if (config.queues[i].targetWorkerExpression) {
					target.expression = config.queues[i].targetWorkerExpression
				}

				let item = {
					targets: [target],
					expression: config.queues[i].expression,
					filterFriendlyName: config.queues[i].filterFriendlyName
				}

				workflowConfiguration.task_routing.filters.push(item)
			}

			const workflow = {
				sid: config.twilio.workflowSid,
				friendlyName: 'Twilio Contact Center Workflow',
				taskReservationTimeout: 1200,
				configuration: JSON.stringify(workflowConfiguration)
			}

			module.exports.createOrUpdateWorkflow(workflow, function (err, workflow) {

				if (err) {
					console.log('Setup Failure: Error setting up workflows.')
					callback(err)
				} else {
					config.twilio.workflowSid = workflow.sid
					callback(null, config)
				}
			})

		}, function (config, callback) {

			req.util.setConfiguration(config, function (err) {
				if (err) {
					callback(err)
				} else {
					callback()
				}
			})

		}
	], function (err) {
		if (err) {
			res.status(500).send(res.convertErrorToJSON(err))
			return
		}

		res.status(200).end()
	})

}

module.exports.syncQueues = function (config, callback) {
	let queues = config.queues

	/* create queues */
	async.eachSeries(queues, function (queue, next) {
		let queueForSync = {
			sid: queue.taskQueueSid,
			friendlyName: queue.friendlyName,
			reservationActivitySid: config.twilio.workerReservationActivitySid,
			assignmentActivitySid: config.twilio.workerAssignmentActivitySid,
			targetWorkers: 'channels HAS "' + queue.id + '"'
		}

		module.exports.createOrUpdateQueue(queueForSync, function (err, queueFromApi) {
			if (err) {
				console.log('Queue Setup Failure: Problem setting up specific queue.')
				callback(err)
			} else {
				queue.taskQueueSid = queueFromApi.sid
				next()
			}
		})
	}, function () {
		callback(null, config)
	})
}

module.exports.createOrUpdateQueue = function (queue, callback) {
	if (queue.sid) {

		client.taskrouter.workspaces(process.env.TWILIO_WORKSPACE_SID).taskQueues(queue.sid).update(queue, function (err) {
			if (err) {
				callback(err)
			} else {
				callback(null, queue)
			}
		})

	} else  {

		client.taskrouter.workspaces(process.env.TWILIO_WORKSPACE_SID).taskQueues.create(queue, function (err, queueFromApi) {
			if (err) {
				callback(err)
			} else {
				queue.sid = queueFromApi.sid
				callback(null, queue)
			}
		})
	}
}

module.exports.createOrUpdateWorkflow = function (workflow, callback) {
	if (workflow.sid) {

		client.taskrouter.workspaces(process.env.TWILIO_WORKSPACE_SID).workflows(workflow.sid).update(workflow, function (err) {
			if (err) {
				callback(err)
			} else {
				callback(null, workflow)
			}
		})

	} else  {

		client.taskrouter.workspaces(process.env.TWILIO_WORKSPACE_SID).workflows.create(workflow, function (err, workflowFromApi) {
			if (err) {
				callback(err)
			} else {
				workflow.sid = workflowFromApi.sid
				callback(null, workflow)
			}
		})

	}
}

module.exports.createOrUpdateApplication = function (configuration, req, callback) {
	const url =  req.protocol + '://' + req.hostname + '/api/phone/call'

	if (configuration.twilio.applicationSid) {

		client.applications(configuration.twilio.applicationSid).update({
			friendlyName: 'Twilio Contact Center Demo',
			voiceUrl: url,
			voiceMethod: 'POST'
		}, function (err, application) {
			if (err) {
				callback(err)
			} else {
				callback(null, application)
			}
		})

	} else  {

		client.applications.create({
			friendlyName: 'Twilio Contact Center Demo',
			voiceUrl: url,
			voiceMethod: 'POST'
		}, function (err, application) {
			if (err) {
				callback(err)
			} else {
				callback(null, application)
			}
		})

	}
}

module.exports.updateMessagingService = function (req, config, callback) {
	const url = req.protocol + '://' + req.hostname + '/api/messaging-adapter/outbound'

	let webhooks = {}

	webhooks.postWebhookUrl = url
	webhooks.webhookFilters = 'onMessageSent'
	webhooks.webhookMethod = 'POST'

	client.chat.services(process.env.TWILIO_CHAT_SERVICE_SID).update(webhooks)
		.then(function (res) {
			callback(null)
		}).catch(function (err) {
			console.log(err)
			callback(err)
		})

}