a79d8282dc
- 15 Controller-Klassen ersetzen Minimal APIs in Program.cs - Repository Pattern mit Interfaces + Implementierungen (Project, Task, Activity, User) - AuthService verwendet jetzt IUserRepository statt direktem DbContext-Zugriff - SecurityHeadersMiddleware als eigenständige Middleware-Klasse - PathSecurityHelper als gemeinsamer Helper für Pfadvalidierung - DTOs in eigenem Namespace Nexus.Api.DTOs - EF-Entities in Nexus.Api.Data (vorher Nexus.Api.Domain) - Program.cs auf DI-Registrierung + Middleware reduziert - Alle 43 Endpoints unverändert erhalten - Build + 3/3 Tests erfolgreich
50 lines
1.6 KiB
C#
50 lines
1.6 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
|
using Nexus.Api.Integrations;
|
|
|
|
namespace Nexus.Api.Controllers;
|
|
|
|
[ApiController]
|
|
public class HealthController(IAgentRuntime runtime, HealthCheckService healthChecks) : ControllerBase
|
|
{
|
|
[HttpGet("/health")]
|
|
public async Task<IResult> Get(CancellationToken ct)
|
|
{
|
|
var report = await healthChecks.CheckHealthAsync(ct);
|
|
|
|
string runtimeStatus;
|
|
string? runtimeDetail;
|
|
try
|
|
{
|
|
var status = await runtime.GetStatusAsync(ct);
|
|
runtimeStatus = status.Status.ToString();
|
|
runtimeDetail = status.Detail;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
runtimeStatus = "Offline";
|
|
runtimeDetail = ex.Message;
|
|
}
|
|
|
|
var entries = report.Entries.ToDictionary(
|
|
e => e.Key,
|
|
e => new
|
|
{
|
|
status = e.Value.Status.ToString(),
|
|
description = e.Value.Description,
|
|
data = e.Value.Data
|
|
});
|
|
|
|
entries["runtime"] = new
|
|
{
|
|
status = runtimeStatus,
|
|
description = runtimeDetail ?? "Runtime status checked",
|
|
data = (IReadOnlyDictionary<string, object>)new Dictionary<string, object>()
|
|
};
|
|
|
|
var isHealthy = report.Status == HealthStatus.Healthy && runtimeStatus == "Online";
|
|
return isHealthy ? Results.Ok(new { status = "Healthy", checks = entries, timestamp = DateTimeOffset.UtcNow })
|
|
: Results.Ok(new { status = "Degraded", checks = entries, timestamp = DateTimeOffset.UtcNow });
|
|
}
|
|
}
|