@villedemontreal/general-utils
Version:
General utilities library
211 lines • 8.17 kB
JavaScript
"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