feat: Stripe-Key-Checker, Krea AI Pattern, Scan-Progress-Tracking

- StripeKeyChecker: 2-Schritt-Check (/v1/balance + /v1/account), Live/Test-Erkennung, Balance, Account-Details
- KeyPatterns: Stripe-Patterns einkommentiert (sk_live_, sk_test_), Krea AI Pattern (UUID:Token), Mindest-Suchlänge 4
- KeyScannerService: Stripe-Check integriert, Auto-Check nach Scan entfernt (manuell separat), Progress-Tracking (Phase, Detail, Current/Total, KeysFound)
- ApiKeysEndpoint: Stripe in HandleCheck/HandleCheckAll/HandleAdopt, Progress im Status-Endpoint
- Frontend: Live-Fortschrittsanzeige mit Spinner, Phase, Query, Counter, Polling 1.5s, Krea AI in typeNames/typeIcons
This commit is contained in:
Meleki committed 2026-03-14 14:34:02 +01:00
1 parent 122000487c
commit 3cd35ebbfa
6 files changed
+326 -14

No files matched your search

+37 -1
View File
@@ -220,6 +220,27 @@ public static class ApiKeysEndpoint
await ctx.Response.WriteAsJsonAsync(new { status = dbStatus, message = result.Message, plan = result.Message });
break;
}
case "stripe":
{
var result = await StripeKeyChecker.CheckKeyAsync(httpFactory, existing.ApiKey);
var dbStatus = result.Status == "ok" ? "valid" : result.Status;
await db.UpdateApiKeyMeta(keyId, dbStatus, result.Message, null, null);
await ctx.Response.WriteAsJsonAsync(new {
status = dbStatus,
message = result.Message,
plan = result.IsLiveKey ? "Live" : "Test",
result.AccountId,
result.AccountName,
result.AccountEmail,
result.AccountCountry,
result.Currency,
result.BalanceAvailable,
result.BalancePending,
result.ChargesEnabled,
result.PayoutsEnabled
});
break;
}
default:
{
ctx.Response.StatusCode = 400;
@@ -264,6 +285,14 @@ public static class ApiKeysEndpoint
results.Add(new { key.KeyId, key.Name, status = dbStatus, Plan = result.Message, Usage5h = (double?)null, Usage7d = (double?)null });
break;
}
case "stripe":
{
var result = await StripeKeyChecker.CheckKeyAsync(httpFactory, key.ApiKey);
var dbStatus = result.Status == "ok" ? "valid" : result.Status;
await db.UpdateApiKeyMeta(key.KeyId, dbStatus, result.Message, null, null);
results.Add(new { key.KeyId, key.Name, status = dbStatus, Plan = result.IsLiveKey ? "Live" : "Test", Usage5h = (double?)null, Usage7d = (double?)null });
break;
}
}
}
@@ -294,11 +323,17 @@ public static class ApiKeysEndpoint
{
if (!ctx.IsAdmin()) { ctx.Response.StatusCode = 403; return Task.CompletedTask; }
var progress = scanner.Progress;
return ctx.Response.WriteAsJsonAsync(new
{
running = scanner.IsRunning,
lastRun = scanner.LastRun,
lastResult = scanner.LastResult
lastResult = scanner.LastResult,
phase = progress.Phase,
detail = progress.Detail,
current = progress.Current,
total = progress.Total,
keysFound = progress.KeysFound
});
}
@@ -426,6 +461,7 @@ public static class ApiKeysEndpoint
string provider;
if (keyType.StartsWith("openai")) provider = "openai";
else if (keyType == "google_api") provider = "google";
else if (keyType.StartsWith("stripe")) provider = "stripe";
else provider = "anthropic";
var record = new ApiKeyRecord