/// <summary> /// Emite una respuesta en JSON de un error debido a validación /// </summary> /// <param name="response">Respuesta que se escribirá</param> /// <param name="error">Error de validación arrojado</param> /// <param name="errorMessageTranspiler">Transpilador de mensajes amigables a partir de errores</param> /// <returns></returns> private static async Task EmitValidationErrorResponse( HttpResponse response, ValidationErrorException error, ValidationErrorMessageTranspiler errorMessageTranspiler ) { response.StatusCode = (int)HttpStatusCode.BadRequest; var errorMessage = errorMessageTranspiler.TranspileFriendlyMessage(error); await response.WriteAsync( JsonConvert.SerializeObject( new ValidationErrorResponse(errorMessage) ) ); }
/// <summary> /// Se configura el manejador de excepciones de la aplicación /// Una de las tareas de este debe ser atrapar los errores de validaciones de las entidades que se intenten insertar o actualizar /// </summary> /// <param name="app"></param> public static void ConfigureExceptionHandler(this IApplicationBuilder app) { var validationErrorMessageTranspiler = new ValidationErrorMessageTranspiler(); app.UseExceptionHandler(appError => { appError.Run(async context => { // Ante errores, siempre se responderá con un JSON context.Response.ContentType = "application/json"; var contextFeature = context.Features.Get <IExceptionHandlerFeature>(); // Si es una excepción de validación, se transpila una respuesta que contenga el error if (contextFeature.Error is ValidationErrorException validationError) { await EmitValidationErrorResponse( context.Response, validationError, validationErrorMessageTranspiler ); } else if (contextFeature.Error is RecordChildrenException childrenException) { var errorMessage = "No es posible eliminar, otro registro depende de él"; await context.Response.WriteAsync( JsonConvert.SerializeObject( new ValidationErrorResponse(errorMessage) ) ); } else { await EmitSystemUnhandledErrorResponse( context.Response, contextFeature.Error as Exception ); } }); }); }