diff --git a/ui/modules/api.ts b/ui/modules/api.ts index bac8828c58..cd1939c5a9 100644 --- a/ui/modules/api.ts +++ b/ui/modules/api.ts @@ -307,6 +307,14 @@ export function setAuthHeader(forDevOps) { } } +function showDittoError(dittoErr, response) { + if (dittoErr.status && dittoErr.message) { + Utils.showError(dittoErr.description + `\n(${dittoErr.error})`, dittoErr.message, dittoErr.status); + } else { + Utils.showError(JSON.stringify(dittoErr), 'Error', response.status); + } +} + /** * Calls the Ditto api * @param {String} method 'POST', 'GET', 'DELETE', etc. @@ -315,10 +323,16 @@ export function setAuthHeader(forDevOps) { * @param {Object} additionalHeaders object with additional header fields * @param {boolean} returnHeaders request full response instead of json content * @param {boolean} devOps default: false. Set true to avoid /api/2 path + * @param {boolean} returnErrorJson default: false. Set true to return the response of a failed HTTP call as JSON * @return {Object} result as json object */ -export async function callDittoREST(method, path, body = null, - additionalHeaders = null, returnHeaders = false, devOps = false): Promise { +export async function callDittoREST(method, + path, + body = null, + additionalHeaders = null, + returnHeaders = false, + devOps = false, + returnErrorJson = false): Promise { let response; const contentType = method === 'PATCH' ? 'application/merge-patch+json' : 'application/json'; try { @@ -336,14 +350,25 @@ export async function callDittoREST(method, path, body = null, throw err; } if (!response.ok) { - response.json() + if (returnErrorJson) { + if (returnHeaders) { + return response; + } else { + return response.json().then((dittoErr) => { + showDittoError(dittoErr, response); + return dittoErr; + }); + } + } else { + response.json() .then((dittoErr) => { - Utils.showError(dittoErr.description + `\n(${dittoErr.error})`, dittoErr.message, dittoErr.status); + showDittoError(dittoErr, response); }) .catch((err) => { Utils.showError('No error details from Ditto', response.statusText, response.status); }); - throw new Error('An error occurred: ' + response.status); + throw new Error('An error occurred: ' + response.status); + } } if (response.status !== 204) { if (returnHeaders) { @@ -409,7 +434,7 @@ export async function callConnectionsAPI(operation, successCallback, connectionI if (!response.ok) { response.json() .then((dittoErr) => { - Utils.showError(dittoErr.description, dittoErr.message, dittoErr.status); + showDittoError(dittoErr, response); }) .catch((err) => { Utils.showError('No error details from Ditto', response.statusText, response.status); @@ -422,7 +447,7 @@ export async function callConnectionsAPI(operation, successCallback, connectionI .then((data) => { if (data && data['?'] && data['?']['?'].status >= 400) { const dittoErr = data['?']['?'].payload; - Utils.showError(dittoErr.description, dittoErr.message, dittoErr.status); + showDittoError(dittoErr, response); } else { if (params.unwrapJsonPath) { params.unwrapJsonPath.split('.').forEach(function(node) { diff --git a/ui/modules/things/featureMessages.ts b/ui/modules/things/featureMessages.ts index 5aec47f7f5..9e38d878e7 100644 --- a/ui/modules/things/featureMessages.ts +++ b/ui/modules/things/featureMessages.ts @@ -124,10 +124,14 @@ function messageFeature() { } aceResponse.setValue(''); API.callDittoREST('POST', '/things/' + Things.theThing.thingId + - '/features/' + theFeatureId + - '/inbox/messages/' + dom.inputMessageSubject.value + - '?timeout=' + dom.inputMessageTimeout.value, - payload, + '/features/' + theFeatureId + + '/inbox/messages/' + dom.inputMessageSubject.value + + '?timeout=' + dom.inputMessageTimeout.value, + payload, + null, + false, + false, + true ).then((data) => { dom.buttonMessageSend.classList.remove('busy'); dom.buttonMessageSend.disabled = false; @@ -137,7 +141,7 @@ function messageFeature() { }).catch((err) => { dom.buttonMessageSend.classList.remove('busy'); dom.buttonMessageSend.disabled = false; - aceResponse.setValue(''); + aceResponse.setValue(`Error: ${err}`); }); } diff --git a/ui/modules/things/thingMessages.ts b/ui/modules/things/thingMessages.ts index 1de988d521..bb04418405 100644 --- a/ui/modules/things/thingMessages.ts +++ b/ui/modules/things/thingMessages.ts @@ -117,9 +117,13 @@ function messageThing() { } aceResponse.setValue(''); API.callDittoREST('POST', '/things/' + Things.theThing.thingId + - '/inbox/messages/' + dom.inputThingMessageSubject.value + - '?timeout=' + dom.inputThingMessageTimeout.value, - payload, + '/inbox/messages/' + dom.inputThingMessageSubject.value + + '?timeout=' + dom.inputThingMessageTimeout.value, + payload, + null, + false, + false, + true ).then((data) => { dom.buttonThingMessageSend.classList.remove('busy'); dom.buttonThingMessageSend.disabled = false; @@ -129,7 +133,7 @@ function messageThing() { }).catch((err) => { dom.buttonThingMessageSend.classList.remove('busy'); dom.buttonThingMessageSend.disabled = false; - aceResponse.setValue(''); + aceResponse.setValue(`Error: ${err}`); }); }