Skip to content

Instantly share code, notes, and snippets.

@dlidstrom
Created October 30, 2014 06:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dlidstrom/7a3285fb1ee518ea6635 to your computer and use it in GitHub Desktop.
Save dlidstrom/7a3285fb1ee518ea6635 to your computer and use it in GitHub Desktop.
(function () {
'use strict';
angular.module('PortalModule')
.factory('httpRequestInterceptor', HttpRequestInterceptor);
function HttpRequestInterceptor($q, toaster) {
return {
responseError: function (response) {
if (response.status === 500) {
// internal server error
toaster.error(response.statusText);
} else {
// validation error
var error = ErrorParser(response);
var html;
if (error.modelState && error.modelState.length) {
html = ModelStateErrors(error.modelState);
} else if (error.exceptionMessage) {
html = ModelStateErrors('Exception: ' + error.exceptionMessage);
} else if (error.message) {
html = ModelStateErrors('Error: ' + error.message);
} else if (response && response.status) {
html = ModelStateErrors('Internal Server Error: ' + response.status);
} else {
html = ModelStateErrors('Unknown error occurred');
}
toaster.warning('Warning', html);
}
return $q.reject(response);
}
};
}
HttpRequestInterceptor.$inject = ['$q', 'Toaster'];
angular.module('PortalModule')
.config(Config);
function Config($httpProvider) {
$httpProvider.interceptors.push('httpRequestInterceptor');
}
Config.$inject = ['$httpProvider'];
function ErrorParser(response) {
var data = {
modelState: [],
message: (response || {}).message
};
if (!response) return data;
if (response.data) {
angular.extend(data, {
exceptionMessage: response.data.exceptionMessage,
exceptionType: response.data.exceptionType,
stackTrace: response.data.stackTrace,
message: response.data.message
});
}
// convert model state into something usable
if (response.modelState || (response.data && (response.modelState = response.data.modelState))) {
var modelState = response.modelState;
for (var s in modelState) {
var state = {
field: s.replace('criteria.', ''),
reasons: modelState[s].join(', ')
};
data.modelState.push(state);
}
}
return data;
}
function ModelStateErrors(modelState) {
var dl = '<dl>';
for (var k in modelState) {
dl += '<dt>' + modelState[k].field + '</dt>';
dl += '<dd>' + modelState[k].reasons + '</dd>';
}
return dl;
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment