UNPKG

@villedemontreal/general-utils

Version:
211 lines 8.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isErrorBuilder = exports.ErrorBuilder = void 0; exports.createError = createError; exports.createServerError = createServerError; exports.createNotFoundError = createNotFoundError; exports.createInvalidParameterError = createInvalidParameterError; exports.createUnprocessableEntityError = createUnprocessableEntityError; exports.createNotImplementedError = createNotImplementedError; exports.createUnauthorizedError = createUnauthorizedError; exports.createForbiddenError = createForbiddenError; // ========================================== // Interfaces and classes related to errors // to be sent in response to an API request. // // It is recommended that you use the provided // builder to create an error. This builder can be // started by using the exported "createError()" // function. // // The structure of those errors is based on // https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#7102-error-condition-responses // // ========================================== const HttpStatusCodes = require("http-status-codes"); const apiError_1 = require("./apiError"); const globalConstants_1 = require("./config/globalConstants"); const logLevel_1 = require("./logLevel"); /** * Builder to create errors. */ class ErrorBuilder { /** * Constructor * The error node and log message are mandatory. */ constructor(code, logMessage) { this.publicMessage = (publicMessage) => { this._publicMessage = publicMessage; return this; }; this.target = (target) => { this._target = target; return this; }; this.details = (details) => { this._details = details; return this; }; this.addDetail = (detail) => { if (!this._details) { this._details = []; } this._details.push(detail); return this; }; this.innererror = (innererror) => { this._innererror = innererror; return this; }; this.httpStatus = (httpStatus) => { this._httpStatus = httpStatus; return this; }; this.logLevel = (logLevel) => { this._logLevel = logLevel; return this; }; this.logStackTrace = (logStackTrace) => { this._logStackTrace = logStackTrace; return this; }; /** * Builds the error! */ this.build = () => { const error = { code: this._code, message: this._publicMessage || 'An error occured', }; if (this._target !== undefined) { error.target = this._target; } if (this._details && this._details.length > 0) { error.details = this._details; } if (this._innererror !== undefined) { error.innererror = this._innererror; } const errorAndInfo = new apiError_1.ApiErrorAndInfo(error, this._logMessage, this._httpStatus || HttpStatusCodes.INTERNAL_SERVER_ERROR, this._logLevel !== undefined ? this._logLevel : logLevel_1.LogLevel.ERROR, this._logStackTrace !== undefined ? this._logStackTrace : true); return errorAndInfo; }; this._code = code; this._logMessage = logMessage; } } exports.ErrorBuilder = ErrorBuilder; /** * ErrorBuilder Type Guard */ const isErrorBuilder = (obj) => { return obj && obj.addDetail !== undefined && obj.build !== undefined; }; exports.isErrorBuilder = isErrorBuilder; /** * Starts a builder to create an error. */ function createError(code, logMessage) { const builder = new ErrorBuilder(code, logMessage); return builder; } /** * Easily creates a generic internal server error (500) * * The log message is mandatory. */ function createServerError(logMessage, publicMessage = 'Server error') { return createError(globalConstants_1.globalConstants.errors.apiGeneralErrors.codes.GENERIC_ERROR, logMessage) .httpStatus(HttpStatusCodes.INTERNAL_SERVER_ERROR) .publicMessage(publicMessage) .logLevel(logLevel_1.LogLevel.ERROR) .logStackTrace(true) .build(); } /** * Easily creates a Not Found error (404) * * @param logMessage The message to log. * @param publicMessage The message to return in the error. * @param logLevel The log level to use. * @param logStackTrace Should the stack trace be logged? */ function createNotFoundError(logMessage, publicMessage = 'Not Found', logLevel = logLevel_1.LogLevel.DEBUG, logStackTrace = false) { return createError(globalConstants_1.globalConstants.errors.apiGeneralErrors.codes.NOT_FOUND, logMessage) .httpStatus(HttpStatusCodes.NOT_FOUND) .publicMessage(publicMessage) .logLevel(logLevel) .logStackTrace(logStackTrace) .build(); } /** * Easily creates an invalid parameter error (400) * * @param publicMessage The message to return in the error (will also be logged). * @param details Some additional information about the validation that failed. * @param logLevel The log level to use. * @param logStackTrace Should the stack trace be logged? */ function createInvalidParameterError(publicMessage, details = [], logLevel = logLevel_1.LogLevel.DEBUG, logStackTrace = false) { return createError(globalConstants_1.globalConstants.errors.apiGeneralErrors.codes.INVALID_PARAMETER, publicMessage) .httpStatus(HttpStatusCodes.BAD_REQUEST) .publicMessage(publicMessage) .details(details) .logLevel(logLevel) .logStackTrace(logStackTrace) .build(); } /** * Easily creates an unprocessable entity error (422) * * @param publicMessage The message to return in the error (will also be logged). * @param details Some additional information about the validation that failed. * @param logLevel The log level to use. * @param logStackTrace Should the stack trace be logged? */ function createUnprocessableEntityError(publicMessage, details = [], logLevel = logLevel_1.LogLevel.DEBUG, logStackTrace = false) { return createError(globalConstants_1.globalConstants.errors.apiGeneralErrors.codes.UNPROCESSABLE_ENTITY, publicMessage) .httpStatus(HttpStatusCodes.UNPROCESSABLE_ENTITY) .publicMessage(publicMessage) .details(details) .logLevel(logLevel) .logStackTrace(logStackTrace) .build(); } /** * Easily creates an "Not Implemented" error (501) */ function createNotImplementedError(logMessage = 'Not implemented', publicMessage = 'Not implemented yet') { return createError(globalConstants_1.globalConstants.errors.apiGeneralErrors.codes.NOT_IMPLEMENTED, logMessage) .publicMessage(publicMessage) .httpStatus(HttpStatusCodes.NOT_IMPLEMENTED) .logLevel(logLevel_1.LogLevel.INFO) .logStackTrace(false) .build(); } /** * Easily creates an "Unauthorized" error (401). To throw when * the user *is not authenticated*. */ function createUnauthorizedError(logMessage = 'Unauthorized', publicMessage = 'Please authenticate yourself first.') { return createError(globalConstants_1.globalConstants.errors.apiGeneralErrors.codes.UNAUTHORIZED, logMessage) .publicMessage(publicMessage) .httpStatus(HttpStatusCodes.UNAUTHORIZED) .logLevel(logLevel_1.LogLevel.INFO) .logStackTrace(false) .build(); } /** * Easily creates a "Forbidden" error (403). To throw when * the user is authenticated but doesn't have sufficient * rights to access the requested resource. */ function createForbiddenError(logMessage = 'Forbidden', publicMessage = 'Access denied.') { return createError(globalConstants_1.globalConstants.errors.apiGeneralErrors.codes.FORBIDDEN, logMessage) .publicMessage(publicMessage) .httpStatus(HttpStatusCodes.FORBIDDEN) .logLevel(logLevel_1.LogLevel.INFO) .logStackTrace(false) .build(); } //# sourceMappingURL=apiErrorBuilder.js.map