using ECMJobRunner.Application.Common.Exceptions; using Microsoft.AspNetCore.Mvc; using System.Net; namespace ECMJobRunner.WebCron.Middleware; /// /// Middleware for handling exceptions globally in the application. /// Captures exceptions thrown during the request pipeline execution, /// logs them, and returns an appropriate HTTP response with a JSON error details. /// /// /// Initializes a new instance of the class. /// /// The next middleware in the request pipeline. /// The logger instance for logging exceptions. public class ExceptionHandlingMiddleware(RequestDelegate Next, ILogger Logger) { /// /// Invokes the middleware to handle the HTTP request. /// /// The HTTP context of the current request. /// A task that represents the asynchronous operation. public async Task InvokeAsync(HttpContext context) { try { await Next(context); // Continue down the pipeline } catch (Exception ex) { await HandleExceptionAsync(context, ex, Logger); } } /// /// Handles exceptions by logging them and writing an appropriate JSON response. /// /// The HTTP context of the current request. /// The exception that occurred. /// The logger instance for logging the exception. /// A task that represents the asynchronous operation. private static async Task HandleExceptionAsync(HttpContext context, Exception exception, ILogger logger) { context.Response.ContentType = "application/json"; ValidationProblemDetails details; switch (exception) { case JobException jobEx: logger.LogWarning(jobEx, "Job exception occurred."); context.Response.StatusCode = (int)HttpStatusCode.BadRequest; details = new() { Title = "Job Exception", Detail = jobEx.Message }; break; default: logger.LogError(exception, "Unhandled exception occurred."); context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; details = new() { Title = "Internal Server Error", Detail = "An unexpected error occurred. Please try again later." }; break; } if (details is not null) await context.Response.WriteAsJsonAsync(details); } }