initial support for live call control

This commit is contained in:
Dave Horton committed 2020-02-07 10:18:53 -05:00
1 parent eddd4a9a27
commit ec02052d27
7 files changed
+280 -25

No files matched your search

+104 -2
View File
@@ -6,12 +6,14 @@ const Account = require('../../models/account');
const Webhook = require('../../models/webhook');
const ServiceProvider = require('../../models/service-provider');
const decorate = require('./decorate');
const snakeCase = require('../../utils/snake-case');
const sysError = require('./error');
const preconditions = {
'add': validateAdd,
'update': validateUpdate,
'delete': validateDelete
};
const API_VERSION = config.get('services.apiVersion');
function validateTo(to) {
if (to && typeof to === 'object') {
@@ -213,6 +215,9 @@ router.put('/:sid', async(req, res) => {
}
});
/**
* create a new Call
*/
router.post('/:sid/Calls', async(req, res) => {
const sid = req.params.sid;
const logger = req.app.locals.logger;
@@ -230,7 +235,7 @@ router.post('/:sid/Calls', async(req, res) => {
}, (err, response, body) => {
if (err) {
logger.error(err, `Error sending createCall POST to ${serviceUrl}`);
return res.send(500);
return res.sendStatus(500);
}
if (response.statusCode !== 201) {
logger.error({statusCode: response.statusCode}, `Non-success response returned by createCall ${serviceUrl}`);
@@ -241,7 +246,104 @@ router.post('/:sid/Calls', async(req, res) => {
} catch (err) {
sysError(logger, res, err);
}
});
/**
* retrieve info for a group of calls under an account
*/
router.get('/:sid/Calls', async(req, res) => {
const accountSid = req.params.sid;
const {logger, listCalls} = req.app.locals;
try {
const calls = await listCalls(accountSid);
logger.debug(`retrieved ${calls.length} calls for account sid ${accountSid}`);
res.status(200).json(snakeCase(calls));
} catch (err) {
sysError(logger, res, err);
}
});
/**
* retrieve single call
*/
router.get('/:sid/Calls/:callSid', async(req, res) => {
const accountSid = req.params.sid;
const callSid = req.params.callSid;
const {logger, retrieveCall} = req.app.locals;
try {
const callInfo = await retrieveCall(accountSid, callSid);
if (callInfo) {
logger.debug(callInfo, `retrieved call info for call sid ${callSid}`);
res.status(200).json(snakeCase(callInfo));
}
else {
logger.debug(`call not found for call sid ${callSid}`);
res.sendStatus(404);
}
} catch (err) {
sysError(logger, res, err);
}
});
/**
* delete call
*/
router.delete('/:sid/Calls/:callSid', async(req, res) => {
const accountSid = req.params.sid;
const callSid = req.params.callSid;
const {logger, deleteCall} = req.app.locals;
try {
const result = await deleteCall(accountSid, callSid);
if (result) {
logger.debug(`successfully deleted call ${callSid}`);
res.sendStatus(204);
}
else {
logger.debug(`call not found for call sid ${callSid}`);
res.sendStatus(404);
}
} catch (err) {
sysError(logger, res, err);
}
});
/**
* update a call
*/
router.post('/:sid/Calls/:callSid', async(req, res) => {
const accountSid = req.params.sid;
const callSid = req.params.callSid;
const {logger, retrieveCall} = req.app.locals;
try {
const call = await retrieveCall(accountSid, callSid);
if (call) {
const url = `${call.serviceUrl}/${API_VERSION}/updateCall/${callSid}`;
logger.debug({call, url, payload: req.body}, `updateCall: retrieved call info for call sid ${callSid}`);
request({
url: url,
method: 'POST',
json: true,
body: req.body
}, (err, response, body) => {
if (err) {
logger.error(err, `updateCall: Error sending update call POST to ${url}`);
return res.sendStatus(500);
}
res.sendStatus(response.statusCode);
});
}
else {
logger.debug(`updateCall: call not found for call sid ${callSid}`);
res.sendStatus(404);
}
} catch (err) {
sysError(logger, res, err);
}
});
module.exports = router;