Files
nexus/backend/Controllers/OpenClawContentReadEndpoint.cs
AzuTear cd8c78d165
CI - Build & Test / Backend (.NET) (push) Successful in 45s
CI - Build & Test / Backend integration (PostgreSQL/Toxiproxy) (push) Failing after 1m0s
CI - Build & Test / Frontend (Vue/TS) (push) Successful in 2m49s
CI - Build & Test / Security Check (push) Successful in 7s
CI - Build & Test / Deploy Nexus (push) Has been skipped
feat(stability): unify readiness and recovery
2026-08-01 01:21:33 +02:00

104 lines
4.2 KiB
C#

using Nexus.Api.Http;
using Nexus.Api.Services;
namespace Nexus.Api.Controllers;
internal static class OpenClawContentReadEndpoint
{
public static async Task<IResult> ExecuteAsync(Func<Task<IResult>> action)
{
try
{
return await action();
}
catch (OpenClawAgentConfigurationValidationException exception)
{
return Results.ValidationProblem(
new Dictionary<string, string[]>
{
[exception.Field] = [exception.Message]
});
}
catch (OpenClawAgentConfigurationUnavailableException exception)
{
var status = exception.State switch
{
"forbidden" or "management_disabled" =>
StatusCodes.Status403Forbidden,
"disconnected" => StatusCodes.Status503ServiceUnavailable,
_ => StatusCodes.Status409Conflict
};
return NexusHttpResults.Problem(
status,
exception.Message,
status switch
{
StatusCodes.Status403Forbidden => NexusProblemCodes.Forbidden,
StatusCodes.Status503ServiceUnavailable => NexusProblemCodes.DependencyUnavailable,
_ => NexusProblemCodes.Conflict
},
extensions: new Dictionary<string, object?>
{
["method"] = exception.Method,
["requiredScope"] = exception.RequiredScope,
["state"] = exception.State
});
}
catch (OpenClawAgentConfigurationVerificationException)
{
return NexusHttpResults.Problem(
StatusCodes.Status502BadGateway,
"OpenClaw-Antwort konnte nicht sicher verifiziert werden.",
NexusProblemCodes.DependencyUnavailable,
extensions: new Dictionary<string, object?>
{
["state"] = "verification_failed"
});
}
catch (OpenClawGatewayRpcException exception)
{
var code = exception.Code.ToUpperInvariant();
var status = code switch
{
"FORBIDDEN" or "AUTH_SCOPE_MISMATCH" =>
StatusCodes.Status403Forbidden,
"METHOD_UNAVAILABLE" or "METHOD_NOT_FOUND"
or "NOT_IMPLEMENTED" =>
StatusCodes.Status409Conflict,
"GATEWAY_DISCONNECTED" or "UNAVAILABLE" =>
StatusCodes.Status503ServiceUnavailable,
"GATEWAY_TIMEOUT" or "TIMEOUT" =>
StatusCodes.Status504GatewayTimeout,
_ => StatusCodes.Status502BadGateway
};
var problemCode = status switch
{
StatusCodes.Status403Forbidden => NexusProblemCodes.Forbidden,
StatusCodes.Status409Conflict => NexusProblemCodes.UnsupportedCapability,
StatusCodes.Status503ServiceUnavailable => NexusProblemCodes.DependencyUnavailable,
StatusCodes.Status504GatewayTimeout => NexusProblemCodes.Timeout,
_ => NexusProblemCodes.DependencyUnavailable
};
return NexusHttpResults.Problem(
status,
status switch
{
StatusCodes.Status403Forbidden =>
"OpenClaw hat Nexus nicht die erforderliche Leseberechtigung gewährt.",
StatusCodes.Status409Conflict =>
"Die verbundene OpenClaw-Version unterstützt diese Leseoperation nicht.",
StatusCodes.Status503ServiceUnavailable =>
"OpenClaw Gateway ist nicht verfügbar.",
StatusCodes.Status504GatewayTimeout =>
"OpenClaw hat nicht rechtzeitig geantwortet.",
_ => "OpenClaw-Leseoperation ist fehlgeschlagen."
},
problemCode,
extensions: new Dictionary<string, object?>
{
["state"] = code.ToLowerInvariant()
});
}
}
}