diff --git a/lib/routes/api/accounts.js b/lib/routes/api/accounts.js index 3ac5cd3..7824d57 100644 --- a/lib/routes/api/accounts.js +++ b/lib/routes/api/accounts.js @@ -60,7 +60,7 @@ function validateUpdateCall(opts) { throw new DbErrorBadRequest('multiple options are not allowed in updateCall'); } - if (typeof opts.call_hook === 'object' && !opts.call_hook.url) throw new DbErrorBadRequest('missing call_hook.url'); + if (opts.call_hook && !opts.call_hook.url) throw new DbErrorBadRequest('missing call_hook.url'); if (opts.call_status && !['completed', 'no-answer'].includes(opts.call_status)) { throw new DbErrorBadRequest('invalid call_status'); } @@ -289,31 +289,49 @@ router.put('/:sid', async(req, res) => { const sid = req.params.sid; const logger = req.app.locals.logger; try { + // create webhooks if provided const obj = Object.assign({}, req.body); - for (const prop of ['registration_hook']) { - if (prop in obj && Object.keys(obj[prop]).length) { - if ('webhook_sid' in obj[prop]) { - const sid = obj[prop]['webhook_sid']; - delete obj[prop]['webhook_sid']; - await Webhook.update(sid, obj[prop]); + if (null !== obj.registration_hook) { + for (const prop of ['registration_hook']) { + if (prop in obj && Object.keys(obj[prop]).length) { + if ('webhook_sid' in obj[prop]) { + const sid = obj[prop]['webhook_sid']; + delete obj[prop]['webhook_sid']; + await Webhook.update(sid, obj[prop]); + } + else { + const sid = await Webhook.make(obj[prop]); + obj[`${prop}_sid`] = sid; + } } else { - const sid = await Webhook.make(obj[prop]); - obj[`${prop}_sid`] = sid; + obj[`${prop}_sid`] = null; } + delete obj[prop]; } - else { - obj[`${prop}_sid`] = null; - } - delete obj[prop]; } await validateUpdate(req, sid); - const rowsAffected = await Account.update(sid, obj); - if (rowsAffected === 0) { - return res.status(404).end(); + + if (Object.keys(obj).length) { + let orphanedHook; + if (null === obj.registration_hook) { + const results = await Account.retrieve(sid); + if (results.length && results[0].registration_hook_sid) orphanedHook = results[0].registration_hook_sid; + obj.registration_hook_sid = null; + delete obj.registration_hook; + } + logger.info({obj}, `about to update Account ${sid}`); + const rowsAffected = await Account.update(sid, obj); + if (rowsAffected === 0) { + return res.status(404).end(); + } + if (orphanedHook) { + await Webhook.remove(orphanedHook); + } } + res.status(204).end(); updateLastUsed(logger, sid, req).catch((err) => {}); } catch (err) {