using System.Net.Http; using System.Threading.Tasks; namespace Gott.Services; /// /// Normalisiertes Key-Check-Ergebnis für alle Provider. /// Provider-spezifische Details über ProviderResult (cast zum konkreten Typ). /// public class UnifiedKeyCheckResult { /// Normalisierter DB-Status: "valid", "invalid", "rate_limited", "quota_exceeded", "error" public string DbStatus { get; set; } public string Message { get; set; } public string Plan { get; set; } public double? Usage7d { get; set; } public double? Usage5h { get; set; } /// Original-Result des Providers (KeyCheckResult, OpenAiCheckResult, etc.) public object ProviderResult { get; set; } } /// /// Zentraler Dispatcher für Key-Checks aller Provider. /// Normalisiert den Status und gibt ein einheitliches Ergebnis zurück. /// Eliminiert die wiederholten switch/if-Ketten in ApiKeysEndpoint, KeyScannerService, GitHubEventScannerService. /// public static class KeyCheckDispatcher { /// /// Prüft einen API-Key anhand des Providers. /// Provider: "anthropic", "openai", "google", "stripe". /// Gibt null zurück bei unbekanntem Provider. /// public static async Task CheckByProvider(IHttpClientFactory httpFactory, string provider, string apiKey) { switch (provider) { case "anthropic": { var r = await AnthropicKeyChecker.CheckKeyAsync(httpFactory, apiKey); return new UnifiedKeyCheckResult { DbStatus = (r.Status == "ok" || r.Status == "usage_limited") ? "valid" : r.Status, Message = r.Message, Plan = r.Plan, Usage7d = r.Usage7d, Usage5h = r.Usage5h, ProviderResult = r }; } case "openai": { var r = await OpenAiKeyChecker.CheckKeyAsync(httpFactory, apiKey); return new UnifiedKeyCheckResult { DbStatus = r.Status == "ok" ? "valid" : r.Status, Message = r.Message, Plan = r.Message, ProviderResult = r }; } case "google": { var r = await GoogleKeyChecker.CheckKeyAsync(httpFactory, apiKey); return new UnifiedKeyCheckResult { DbStatus = r.Status == "ok" ? "valid" : r.Status, Message = r.Message, Plan = r.Message, ProviderResult = r }; } case "stripe": { var r = await StripeKeyChecker.CheckKeyAsync(httpFactory, apiKey); return new UnifiedKeyCheckResult { DbStatus = r.Status == "ok" ? "valid" : r.Status, Message = r.Message, Plan = r.IsLiveKey ? "Live" : "Test", ProviderResult = r }; } default: return null; } } /// /// Prüft einen API-Key anhand des Key-Typs (z.B. "openai_project", "anthropic_oauth"). /// Nutzt KeyPatterns.GetCheckerProvider() für die Zuordnung. /// Gibt null zurück wenn kein Checker für den Typ existiert. /// public static Task CheckByKeyType(IHttpClientFactory httpFactory, string keyType, string apiKey) { var provider = KeyPatterns.GetCheckerProvider(keyType); if (provider == null) return Task.FromResult(null); return CheckByProvider(httpFactory, provider, apiKey); } }