diff --git a/app/Services/Dns/DnsTokenCheck.php b/app/Services/Dns/DnsTokenCheck.php index 7d34bc6..834c084 100644 --- a/app/Services/Dns/DnsTokenCheck.php +++ b/app/Services/Dns/DnsTokenCheck.php @@ -47,10 +47,26 @@ final class DnsTokenCheck return ['ok' => false, 'reason' => 'rejected']; } + $verfuegbar = collect($zones->json('zones') ?? [])->pluck('name')->filter()->values(); $zoneId = collect($zones->json('zones') ?? [])->firstWhere('name', $zone)['id'] ?? null; if ($zoneId === null) { - return ['ok' => false, 'reason' => 'zone_not_found', 'zone' => $zone]; + // Die gefundenen Zonen gehören in die Antwort. + // + // `zone_not_found` allein ist eine Sackgasse: der Betreiber liest + // es als „der Token ist falsch" und tauscht ihn aus, obwohl der + // Token gerade eben erfolgreich die Zonenliste geholt hat — ein + // schlechter Token käme oben als `rejected` heraus. Was fehlt, ist + // die ZONE. Nebeneinander gestellt beantwortet sich die Frage von + // selbst: gesucht wurde `clupilot.cloud`, im Konto liegt + // `clupilot.com` — oder gar nichts, dann gehört die Zone dort + // erst angelegt. + return [ + 'ok' => false, + 'reason' => 'zone_not_found', + 'zone' => $zone, + 'available' => $verfuegbar->all(), + ]; } // The actual point of this whole check. A read-only token gets this diff --git a/lang/de/readiness.php b/lang/de/readiness.php index 07527ae..80cda00 100644 --- a/lang/de/readiness.php +++ b/lang/de/readiness.php @@ -114,4 +114,8 @@ return [ 'queue_provisioning' => 'Bereitstellungs-Worker läuft', 'queue_provisioning_breaks' => 'Der Zeitplaner kann laufen und Aufträge auf die provisioning-Warteschlange stellen, ohne dass sie je jemand abholt. Eine bezahlte Bestellung bleibt dann liegen — kein Fehler, keine Meldung, einfach nichts, bis jemand von Hand nachsieht.', ], + + 'zone_wanted' => 'Der Token ist gültig — er hat die Zonenliste geholt. Gesucht wurde die Zone :zone.', + 'zone_available' => 'In diesem Konto liegen: :zones. Entweder CLUPILOT_DNS_ZONE anpassen oder die Zone bei Hetzner anlegen.', + 'zone_none' => 'In diesem Konto liegt keine einzige Zone. Der Token gehört vermutlich zu einem anderen Hetzner-Projekt.', ]; diff --git a/lang/en/readiness.php b/lang/en/readiness.php index f909d11..573c428 100644 --- a/lang/en/readiness.php +++ b/lang/en/readiness.php @@ -109,4 +109,8 @@ return [ 'queue_provisioning' => 'Provisioning worker is running', 'queue_provisioning_breaks' => 'The scheduler can be running and putting jobs on the provisioning queue without anyone ever picking them up. A paid order then just sits there — no error, no notice, simply nothing, until someone happens to look.', ], + + 'zone_wanted' => 'The token is valid — it fetched the zone list. It looked for the zone :zone.', + 'zone_available' => 'This account holds: :zones. Either adjust CLUPILOT_DNS_ZONE or create the zone at Hetzner.', + 'zone_none' => 'This account holds no zones at all. The token probably belongs to a different Hetzner project.', ]; diff --git a/resources/views/livewire/admin/readiness.blade.php b/resources/views/livewire/admin/readiness.blade.php index 07382c1..3229d59 100644 --- a/resources/views/livewire/admin/readiness.blade.php +++ b/resources/views/livewire/admin/readiness.blade.php @@ -25,13 +25,30 @@