CluPilotCloud/app/Support/OperatingMode.php

73 lines
2.7 KiB
PHP

<?php
namespace App\Support;
/**
* Test oder Live — welcher Satz Zugangsdaten gilt.
*
* In `Settings` und nicht in der `.env`, weil `Settings` seinen Zwischenspeicher
* beim Schreiben verwirft: ein Umlegen wirkt sofort, auch in den
* Warteschlangen-Prozessen, die seit Stunden laufen. Eine `.env`-Variable
* bräuchte einen Containerneustart — genau die Falle, die am 2026-07-30 eine
* korrigierte DNS-Zone acht Stunden lang wirkungslos gelassen hat.
*
* Live ist die Vorgabe. Eine Installation, die nichts gespeichert hat, soll
* nicht in einem Modus stehen, der stillschweigend andere Zugangsdaten benutzt.
*/
enum OperatingMode: string
{
case Test = 'test';
case Live = 'live';
public const SETTING = 'platform.mode';
public static function current(): self
{
// tryFrom, nicht from: ein unbekannter Wert in der Zeile ist ein
// Datenfehler und darf nicht jede Anfrage in eine Ausnahme werfen.
return self::tryFrom((string) Settings::get(self::SETTING, self::Live->value))
?? self::Live;
}
public static function set(self $mode): void
{
Settings::set(self::SETTING, $mode->value);
}
/**
* Zu welchem Modus ein Stripe-Schlüssel gehört — am Präfix, ohne Netzverkehr.
*
* Stripe beschriftet den Schlüssel nicht; das Präfix ist das Einzige, was
* bei beiden Schlüsselarten (`sk_`, und der eingeschränkte `rk_`) wahr ist.
* Das reicht, und es muss reichen: die Bereitschaftsseite darf beim
* Seitenaufruf nichts erreichen, und die Migration läuft, bevor irgendein
* Dienst antwortet.
*
* `null` heißt „nicht entscheidbar", nicht „live". Wer daraus eine
* Vorgabe braucht, sagt sie an seiner Stelle selbst — die Migration setzt
* `?? Live` (der Zustand vor ihr, also Fortsetzung statt neuer Behauptung),
* die Bereitschaftsprüfung meldet dagegen NUR einen Widerspruch, den sie
* beweisen kann.
*
* Diese eine Stelle, weil dieselbe Frage vorher an drei Orten unabhängig
* beantwortet wurde: in der Migration, in StripeCheck und — gar nicht — auf
* der Bereitschaftsseite. Drei Formulierungen einer Frage sind der Weg, auf
* dem sie auseinanderlaufen.
*/
public static function ofStripeKey(?string $secret): ?self
{
$secret = trim((string) $secret);
return match (true) {
str_starts_with($secret, 'sk_test_'), str_starts_with($secret, 'rk_test_') => self::Test,
str_starts_with($secret, 'sk_live_'), str_starts_with($secret, 'rk_live_') => self::Live,
default => null,
};
}
public function isTest(): bool
{
return $this === self::Test;
}
}