From 0b63922f4682352f208294fc43a83f12566bf8b9 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Mon, 26 Aug 2024 12:14:30 +0000 Subject: [PATCH] feat: map and expose objection.js errors --- packages/backend/src/helpers/error-handler.js | 7 ++++++- packages/backend/src/helpers/renderer.js | 20 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/helpers/error-handler.js b/packages/backend/src/helpers/error-handler.js index 14a120dc..44d58fcc 100644 --- a/packages/backend/src/helpers/error-handler.js +++ b/packages/backend/src/helpers/error-handler.js @@ -1,8 +1,9 @@ import logger from './logger.js'; import objection from 'objection'; import * as Sentry from './sentry.ee.js'; -const { NotFoundError, DataError } = objection; +const { NotFoundError, DataError, ValidationError } = objection; import HttpError from '../errors/http.js'; +import { renderObjectionError } from './renderer.js'; // Do not remove `next` argument as the function signature will not fit for an error handler middleware // eslint-disable-next-line no-unused-vars @@ -15,6 +16,10 @@ const errorHandler = (error, request, response, next) => { response.status(404).end(); } + if (error instanceof ValidationError) { + renderObjectionError(response, error); + } + if (error instanceof DataError) { response.status(400).end(); } diff --git a/packages/backend/src/helpers/renderer.js b/packages/backend/src/helpers/renderer.js index 8bcf6373..10851385 100644 --- a/packages/backend/src/helpers/renderer.js +++ b/packages/backend/src/helpers/renderer.js @@ -64,4 +64,22 @@ const renderError = (response, errors, status, type) => { return response.status(errorStatus).send(payload); }; -export { renderObject, renderError }; +const renderObjectionError = (response, error) => { + const { + statusCode, + type, + data = {}, + } = error; + + const errorEntries = Object.entries(data); + + const computedErrors = errorEntries.reduce((errors, [fieldName, fieldErrors]) => { + const computedErrors = fieldErrors.map(fieldError => fieldError.message); + + return errors.concat({ [fieldName]: computedErrors }); + }, []); + + return renderError(response, computedErrors, statusCode, type); +}; + +export { renderObject, renderError, renderObjectionError };