first commit

This commit is contained in:
Dhananjaya99
2026-09-28 11:44:26 +05:30
parent 721743ae6b
commit bffc9b1686
424 changed files with 46474 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
using Fitness_core_BE.Exceptions;
using Fitness_core_BE.Models.IOs;
namespace Fitness_core_BE.Helpers
{
// The app has no central exception->HTTP mapping today -- an unhandled NotFoundException/
// BadRequestException/etc. (or the equivalent BCL KeyNotFoundException/ArgumentException
// many services throw) 500s with a raw stack trace instead of the ApiResponse shape every
// other error path returns. AgentController.cs already hand-rolls this exact mapping
// per-action (see its catch blocks); this middleware applies the same mapping once, for
// every controller, without having to add a try/catch to each action.
public class GlobalExceptionMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<GlobalExceptionMiddleware> _logger;
public GlobalExceptionMiddleware(RequestDelegate next, ILogger<GlobalExceptionMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
var (statusCode, message) = ex switch
{
NotFoundException or KeyNotFoundException => (404, ex.Message),
BadRequestException or ArgumentException => (400, ex.Message),
UnauthorizedException => (401, ex.Message),
ForbiddenException => (403, ex.Message),
ServiceUnavailableException => (503, ex.Message),
_ => (500, "An unexpected error occurred."),
};
if (statusCode == 500)
_logger.LogError(ex, "Unhandled exception for {Method} {Path}", context.Request.Method, context.Request.Path);
if (context.Response.HasStarted)
throw;
context.Response.Clear();
context.Response.StatusCode = statusCode;
context.Response.ContentType = "application/json";
await context.Response.WriteAsJsonAsync(new ApiResponse<object>
{
StatusCode = statusCode,
Message = message,
Data = null!
});
}
}
}
}