@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
124 lines • 15.1 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
import { HttpErrorResponse } from '@angular/common/http';
import { CollectionsUtil } from '../../../utils';
import { generateErrorCode } from '../../../common';
/**
* ** Process service HTTP request error and return ErrorRecord.
*
* @param {string} objectUUID - is objectUUID of the Object for which processing error is invoked
* @param {Record<keyof ServiceHttpErrorCodes, string>} serviceHttpErrorCodes - is map of Service method supported error codes auto-handling
* @param {unknown} error - is actual error object reference
*/
export const processServiceRequestError = (objectUUID, serviceHttpErrorCodes, error) => {
const _objectUUID = CollectionsUtil.isDefined(objectUUID) ? objectUUID : CollectionsUtil.generateObjectUUID('UnknownClassName');
if (!CollectionsUtil.isLiteralObject(serviceHttpErrorCodes)) {
return {
code: generateErrorCode('UnknownClassName', 'UnknownPublicName', 'UnknownMethodName', 'Generic'),
objectUUID: _objectUUID,
error: error instanceof Error ? error : null
};
}
if (error instanceof HttpErrorResponse) {
let code;
switch (error.status) {
case 400 /* BadRequest */:
code = serviceHttpErrorCodes.BadRequest;
break;
case 401 /* Unauthorized */:
code = serviceHttpErrorCodes.Unauthorized;
break;
case 403 /* Forbidden */:
code = serviceHttpErrorCodes.Forbidden;
break;
case 404 /* NotFound */:
code = serviceHttpErrorCodes.NotFound;
break;
case 405 /* MethodNotAllowed */:
code = serviceHttpErrorCodes.MethodNotAllowed;
break;
case 409 /* Conflict */:
code = serviceHttpErrorCodes.Conflict;
break;
case 422 /* UnprocessableEntity */:
code = serviceHttpErrorCodes.UnprocessableEntity;
break;
case 500 /* InternalServerError */:
code = serviceHttpErrorCodes.InternalServerError;
break;
case 503 /* ServiceUnavailable */:
code = serviceHttpErrorCodes.ServiceUnavailable;
break;
default:
code = serviceHttpErrorCodes.Unknown;
}
return {
code,
objectUUID: _objectUUID,
error,
httpStatusCode: error.status
};
}
return {
code: serviceHttpErrorCodes.Unknown,
objectUUID: _objectUUID,
error: error instanceof Error ? error : null
};
};
/**
* ** Get API formatted error message from provided Error.
*/
export const getApiFormattedErrorMessage = (error) => {
let statusCode = null;
if (error instanceof HttpErrorResponse) {
if (CollectionsUtil.isString(error.error)) {
return {
what: `${error.error}`,
why: `${error.message}`
};
}
if (CollectionsUtil.isLiteralObject(error.error)) {
return {
what: `${error.error.what}`,
why: `${error.error.why}`,
consequences: `${error.error.consequences}`,
countermeasures: `${error.error.countermeasures}`
};
}
statusCode = error.status;
}
return {
what: 'Please contact Superollider and report the issue',
why: getHumanReadableStatusText(statusCode)
};
};
/**
* ** Get Human readable text from HTTP error status code.
*/
export const getHumanReadableStatusText = (httpErrorStatus) => {
switch (httpErrorStatus) {
case 400 /* BadRequest */:
return 'Invalid param';
case 401 /* Unauthorized */:
return 'Unauthorized';
case 403 /* Forbidden */:
return 'Forbidden';
case 404 /* NotFound */:
return 'Not Found';
case 405 /* MethodNotAllowed */:
return 'Not Allowed';
case 409 /* Conflict */:
return 'Conflict';
case 422 /* UnprocessableEntity */:
return 'Invalid operation';
case 500 /* InternalServerError */:
return 'Internal Server Error';
case 503 /* ServiceUnavailable */:
return 'Service Unavailable';
default:
return 'Unknown Error';
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb3JlL2Vycm9yL3V0aWxzL2Vycm9yLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxpQkFBaUIsRUFBa0IsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFnQyxpQkFBaUIsRUFBeUIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6Rzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUN0QyxVQUFrQixFQUNsQixxQkFBa0UsRUFDbEUsS0FBYyxFQUNILEVBQUU7SUFDYixNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRWhJLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7UUFDekQsT0FBTztZQUNILElBQUksRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLENBQUM7WUFDaEcsVUFBVSxFQUFFLFdBQVc7WUFDdkIsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUMvQyxDQUFDO0tBQ0w7SUFFRCxJQUFJLEtBQUssWUFBWSxpQkFBaUIsRUFBRTtRQUNwQyxJQUFJLElBQVksQ0FBQztRQUVqQixRQUFRLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDbEI7Z0JBQ0ksSUFBSSxHQUFHLHFCQUFxQixDQUFDLFVBQVUs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Q0ksT0FBTyxxQkFBcUIsQ0FBQztRQUNqQztZQUNJLE9BQU8sZUFBZSxDQUFDO0tBQzlCO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBTdGF0dXNDb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBDb2xsZWN0aW9uc1V0aWwgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCB7IEFwaUVycm9yTWVzc2FnZSwgRXJyb3JSZWNvcmQsIGdlbmVyYXRlRXJyb3JDb2RlLCBTZXJ2aWNlSHR0cEVycm9yQ29kZXMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24nO1xuXG4vKipcbiAqICoqIFByb2Nlc3Mgc2VydmljZSBIVFRQIHJlcXVlc3QgZXJyb3IgYW5kIHJldHVybiBFcnJvclJlY29yZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0VVVJRCAtIGlzIG9iamVjdFVVSUQgb2YgdGhlIE9iamVjdCBmb3Igd2hpY2ggcHJvY2Vzc2luZyBlcnJvciBpcyBpbnZva2VkXG4gKiBAcGFyYW0ge1JlY29yZDxrZXlvZiBTZXJ2aWNlSHR0cEVycm9yQ29kZXMsIHN0cmluZz59IHNlcnZpY2VIdHRwRXJyb3JDb2RlcyAtIGlzIG1hcCBvZiBTZXJ2aWNlIG1ldGhvZCBzdXBwb3J0ZWQgZXJyb3IgY29kZXMgYXV0by1oYW5kbGluZ1xuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIGlzIGFjdHVhbCBlcnJvciBvYmplY3QgcmVmZXJlbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2VydmljZVJlcXVlc3RFcnJvciA9IChcbiAgICBvYmplY3RVVUlEOiBzdHJpbmcsXG4gICAgc2VydmljZUh0dHBFcnJvckNvZGVzOiBSZWNvcmQ8a2V5b2YgU2VydmljZUh0dHBFcnJvckNvZGVzLCBzdHJpbmc+LFxuICAgIGVycm9yOiB1bmtub3duXG4pOiBFcnJvclJlY29yZCA9PiB7XG4gICAgY29uc3QgX29iamVjdFVVSUQgPSBDb2xsZWN0aW9uc1V0aWwuaXNEZWZpbmVkKG9iamVjdFVVSUQpID8gb2JqZWN0VVVJRCA6IENvbGxlY3Rpb25zVXRpbC5nZW5lcmF0ZU9iamVjdFVVSUQoJ1Vua25vd25DbGFzc05hbWUnKTtcblxuICAgIGlmICghQ29sbGVjdGlvbnNVdGlsLmlzTGl0ZXJhbE9iamVjdChzZXJ2aWNlSHR0cEVycm9yQ29kZXMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiBnZW5lcmF0ZUVycm9yQ29kZSgnVW5rbm93bkNsYXNzTmFtZScsICdVbmtub3duUHVibGljTmFtZScsICdVbmtub3duTWV0aG9kTmFtZScsICdHZW5lcmljJyksXG4gICAgICAgICAgICBvYmplY3RVVUlEOiBfb2JqZWN0VVVJRCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBudWxsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGNvZGU6IHN0cmluZztcblxuICAgICAgICBzd2l0Y2ggKGVycm9yLnN0YXR1cykge1xuICAgICAgICAgICAgY2FzZSBIdHRwU3RhdHVzQ29kZS5CYWRSZXF1ZXN0OlxuICAgICAgICAgICAgICAgIGNvZGUgPSBzZXJ2aWNlSHR0cEVycm9yQ29kZXMuQmFkUmVxdWVzdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSHR0cFN0YXR1c0NvZGUuVW5hdXRob3JpemVkOlxuICAgICAgICAgICAgICAgIGNvZGUgPSBzZXJ2aWNlSHR0cEVycm9yQ29kZXMuVW5hdXRob3JpemVkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBIdHRwU3RhdHVzQ29kZS5Gb3JiaWRkZW46XG4gICAgICAgICAgICAgICAgY29kZSA9IHNlcnZpY2VIdHRwRXJyb3JDb2Rlcy5Gb3JiaWRkZW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEh0dHBTdGF0dXNDb2RlLk5vdEZvdW5kOlxuICAgICAgICAgICAgICAgIGNvZGUgPSBzZXJ2aWNlSHR0cEVycm9yQ29kZXMuTm90Rm91bmQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEh0dHBTdGF0dXNDb2RlLk1ldGhvZE5vdEFsbG93ZWQ6XG4gICAgICAgICAgICAgICAgY29kZSA9IHNlcnZpY2VIdHRwRXJyb3JDb2Rlcy5NZXRob2ROb3RBbGxvd2VkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBIdHRwU3RhdHVzQ29kZS5Db25mbGljdDpcbiAgICAgICAgICAgICAgICBjb2RlID0gc2VydmljZUh0dHBFcnJvckNvZGVzLkNvbmZsaWN0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBIdHRwU3RhdHVzQ29kZS5VbnByb2Nlc3NhYmxlRW50aXR5OlxuICAgICAgICAgICAgICAgIGNvZGUgPSBzZXJ2aWNlSHR0cEVycm9yQ29kZXMuVW5wcm9jZXNzYWJsZUVudGl0eTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSHR0cFN0YXR1c0NvZGUuSW50ZXJuYWxTZXJ2ZXJFcnJvcjpcbiAgICAgICAgICAgICAgICBjb2RlID0gc2VydmljZUh0dHBFcnJvckNvZGVzLkludGVybmFsU2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEh0dHBTdGF0dXNDb2RlLlNlcnZpY2VVbmF2YWlsYWJsZTpcbiAgICAgICAgICAgICAgICBjb2RlID0gc2VydmljZUh0dHBFcnJvckNvZGVzLlNlcnZpY2VVbmF2YWlsYWJsZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29kZSA9IHNlcnZpY2VIdHRwRXJyb3JDb2Rlcy5Vbmtub3duO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICBvYmplY3RVVUlEOiBfb2JqZWN0VVVJRCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgaHR0cFN0YXR1c0NvZGU6IGVycm9yLnN0YXR1c1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHNlcnZpY2VIdHRwRXJyb3JDb2Rlcy5Vbmtub3duLFxuICAgICAgICBvYmplY3RVVUlEOiBfb2JqZWN0VVVJRCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG51bGxcbiAgICB9O1xufTtcblxuLyoqXG4gKiAqKiBHZXQgQVBJIGZvcm1hdHRlZCBlcnJvciBtZXNzYWdlIGZyb20gcHJvdmlkZWQgRXJyb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBcGlGb3JtYXR0ZWRFcnJvck1lc3NhZ2UgPSAoZXJyb3I6IEVycm9yKTogQXBpRXJyb3JNZXNzYWdlID0+IHtcbiAgICBsZXQgc3RhdHVzQ29kZTogbnVtYmVyID0gbnVsbDtcblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChDb2xsZWN0aW9uc1V0aWwuaXNTdHJpbmcoZXJyb3IuZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHdoYXQ6IGAke2Vycm9yLmVycm9yfWAsXG4gICAgICAgICAgICAgICAgd2h5OiBgJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQ29sbGVjdGlvbnNVdGlsLmlzTGl0ZXJhbE9iamVjdChlcnJvci5lcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgd2hhdDogYCR7KGVycm9yLmVycm9yIGFzIEFwaUVycm9yTWVzc2FnZSkud2hhdH1gLFxuICAgICAgICAgICAgICAgIHdoeTogYCR7KGVycm9yLmVycm9yIGFzIEFwaUVycm9yTWVzc2FnZSkud2h5fWAsXG4gICAgICAgICAgICAgICAgY29uc2VxdWVuY2VzOiBgJHsoZXJyb3IuZXJyb3IgYXMgQXBpRXJyb3JNZXNzYWdlKS5jb25zZXF1ZW5jZXN9YCxcbiAgICAgICAgICAgICAgICBjb3VudGVybWVhc3VyZXM6IGAkeyhlcnJvci5lcnJvciBhcyBBcGlFcnJvck1lc3NhZ2UpLmNvdW50ZXJtZWFzdXJlc31gXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdHVzQ29kZSA9IGVycm9yLnN0YXR1cztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3aGF0OiAnUGxlYXNlIGNvbnRhY3QgU3VwZXJvbGxpZGVyIGFuZCByZXBvcnQgdGhlIGlzc3VlJyxcbiAgICAgICAgd2h5OiBnZXRIdW1hblJlYWRhYmxlU3RhdHVzVGV4dChzdGF0dXNDb2RlKVxuICAgIH07XG59O1xuXG4vKipcbiAqICoqIEdldCBIdW1hbiByZWFkYWJsZSB0ZXh0IGZyb20gSFRUUCBlcnJvciBzdGF0dXMgY29kZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEh1bWFuUmVhZGFibGVTdGF0dXNUZXh0ID0gKGh0dHBFcnJvclN0YXR1czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICBzd2l0Y2ggKGh0dHBFcnJvclN0YXR1cykge1xuICAgICAgICBjYXNlIEh0dHBTdGF0dXNDb2RlLkJhZFJlcXVlc3Q6XG4gICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgcGFyYW0nO1xuICAgICAgICBjYXNlIEh0dHBTdGF0dXNDb2RlLlVuYXV0aG9yaXplZDpcbiAgICAgICAgICAgIHJldHVybiAnVW5hdXRob3JpemVkJztcbiAgICAgICAgY2FzZSBIdHRwU3RhdHVzQ29kZS5Gb3JiaWRkZW46XG4gICAgICAgICAgICByZXR1cm4gJ0ZvcmJpZGRlbic7XG4gICAgICAgIGNhc2UgSHR0cFN0YXR1c0NvZGUuTm90Rm91bmQ6XG4gICAgICAgICAgICByZXR1cm4gJ05vdCBGb3VuZCc7XG4gICAgICAgIGNhc2UgSHR0cFN0YXR1c0NvZGUuTWV0aG9kTm90QWxsb3dlZDpcbiAgICAgICAgICAgIHJldHVybiAnTm90IEFsbG93ZWQnO1xuICAgICAgICBjYXNlIEh0dHBTdGF0dXNDb2RlLkNvbmZsaWN0OlxuICAgICAgICAgICAgcmV0dXJuICdDb25mbGljdCc7XG4gICAgICAgIGNhc2UgSHR0cFN0YXR1c0NvZGUuVW5wcm9jZXNzYWJsZUVudGl0eTpcbiAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBvcGVyYXRpb24nO1xuICAgICAgICBjYXNlIEh0dHBTdGF0dXNDb2RlLkludGVybmFsU2VydmVyRXJyb3I6XG4gICAgICAgICAgICByZXR1cm4gJ0ludGVybmFsIFNlcnZlciBFcnJvcic7XG4gICAgICAgIGNhc2UgSHR0cFN0YXR1c0NvZGUuU2VydmljZVVuYXZhaWxhYmxlOlxuICAgICAgICAgICAgcmV0dXJuICdTZXJ2aWNlIFVuYXZhaWxhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAnVW5rbm93biBFcnJvcic7XG4gICAgfVxufTtcbiJdfQ==