using System.Net; using System.Text.Json; namespace DramaLing.Api.Middleware; public class ErrorHandlingMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public ErrorHandlingMiddleware(RequestDelegate next, ILogger logger) { _next = next; _logger = logger; } public async Task InvokeAsync(HttpContext context) { try { await _next(context); } catch (Exception ex) { _logger.LogError(ex, "An unhandled exception occurred during request execution. Request: {Method} {Path}", context.Request.Method, context.Request.Path); await HandleExceptionAsync(context, ex); } } private async Task HandleExceptionAsync(HttpContext context, Exception exception) { context.Response.ContentType = "application/json"; var errorResponse = new { Success = false, Error = "An error occurred while processing your request", Details = exception.Message, Timestamp = DateTime.UtcNow, RequestId = context.TraceIdentifier }; var statusCode = exception switch { ArgumentException => HttpStatusCode.BadRequest, UnauthorizedAccessException => HttpStatusCode.Unauthorized, KeyNotFoundException => HttpStatusCode.NotFound, NotImplementedException => HttpStatusCode.NotImplemented, TimeoutException => HttpStatusCode.RequestTimeout, _ => HttpStatusCode.InternalServerError }; context.Response.StatusCode = (int)statusCode; var jsonResponse = JsonSerializer.Serialize(errorResponse, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); _logger.LogError("Error response sent: {StatusCode} - {Response}", statusCode, jsonResponse); await context.Response.WriteAsync(jsonResponse); } }