This is the initial commit for the CODEX_ADK project, a full-stack AI agent management platform featuring: BACKEND (ASP.NET Core 8.0): - CQRS architecture with 6 commands and 7 queries - 16 API endpoints (all working and tested) - PostgreSQL database with 5 entities - AES-256 encryption for API keys - FluentValidation on all commands - Rate limiting and CORS configured - OpenAPI/Swagger documentation - Docker Compose setup (PostgreSQL + Ollama) FRONTEND (Flutter 3.x): - Dark theme with Svrnty branding - Collapsible sidebar navigation - CQRS API client with Result<T> error handling - Type-safe endpoints from OpenAPI schema - Multi-platform support (Web, iOS, Android, macOS, Linux, Windows) DOCUMENTATION: - Comprehensive API reference - Architecture documentation - Development guidelines for Claude Code - API integration guides - context-claude.md project overview Status: Backend ready (Grade A-), Frontend integration pending 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
60 lines
1.7 KiB
C#
60 lines
1.7 KiB
C#
using System.Net;
|
|
using System.Text.Json;
|
|
|
|
namespace Codex.Api.Middleware;
|
|
|
|
/// <summary>
|
|
/// Global exception handler middleware that catches all unhandled exceptions
|
|
/// and returns a standardized error response format
|
|
/// </summary>
|
|
public class GlobalExceptionHandler
|
|
{
|
|
private readonly RequestDelegate _next;
|
|
private readonly ILogger<GlobalExceptionHandler> _logger;
|
|
private readonly IWebHostEnvironment _env;
|
|
|
|
public GlobalExceptionHandler(
|
|
RequestDelegate next,
|
|
ILogger<GlobalExceptionHandler> 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, new JsonSerializerOptions
|
|
{
|
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
|
|
});
|
|
|
|
await context.Response.WriteAsync(json);
|
|
}
|
|
}
|