using System.Net; using System.Text.Json; namespace Codex.Api.Middleware; /// /// Global exception handler middleware that catches all unhandled exceptions /// and returns a standardized error response format /// public class GlobalExceptionHandler { private readonly RequestDelegate _next; private readonly ILogger _logger; private readonly IWebHostEnvironment _env; private static readonly JsonSerializerOptions JsonOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; public GlobalExceptionHandler( RequestDelegate next, ILogger logger, IWebHostEnvironment env) { _next = next; _logger = logger; _env = env; } public async Task InvokeAsync(HttpContext context) { try { await _next(context); } catch (Exception ex) { _logger.LogError(ex, "Unhandled exception occurred: {Message}", ex.Message); await HandleExceptionAsync(context, ex); } } private async Task HandleExceptionAsync(HttpContext context, Exception exception) { context.Response.ContentType = "application/json"; context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; var response = new { message = "An unexpected error occurred", statusCode = context.Response.StatusCode, traceId = context.TraceIdentifier, details = _env.IsDevelopment() ? exception.Message : null }; var json = JsonSerializer.Serialize(response, JsonOptions); await context.Response.WriteAsync(json); } }