using FluentValidation; using Microsoft.AspNetCore.Http; using Mirea.Api.DataAccess.Application.Common.Exceptions; using Mirea.Api.Dto.Responses; using Mirea.Api.Endpoint.Common.Exceptions; using System; using System.Text.Json; using System.Threading.Tasks; namespace Mirea.Api.Endpoint.Configuration.Core.Middleware; public class CustomExceptionHandlerMiddleware(RequestDelegate next) { public async Task InvokeAsync(HttpContext context) { try { await next(context); } catch (Exception exception) { await HandleExceptionAsync(context, exception); } } private static Task HandleExceptionAsync(HttpContext context, Exception exception) { var code = StatusCodes.Status500InternalServerError; var result = string.Empty; switch (exception) { case ValidationException validationException: code = StatusCodes.Status400BadRequest; result = JsonSerializer.Serialize(new ErrorResponse() { Error = validationException.Message, Code = code }); break; case NotFoundException: code = StatusCodes.Status404NotFound; break; case ControllerArgumentException: code = StatusCodes.Status400BadRequest; break; } context.Response.ContentType = "application/json"; context.Response.StatusCode = code; if (string.IsNullOrEmpty(result)) result = JsonSerializer.Serialize(new ErrorResponse() { Error = exception.Message, Code = code }); return context.Response.WriteAsync(result); } }