<?phpnamespace App\Entity\Core;use Doctrine\ORM\Mapping as ORM;/** * ══════════════════════════════════════════════════════════════════════════ * RÉGLAGES DE L'APPLICATION — clé / valeur * ══════════════════════════════════════════════════════════════════════════ * * Table générique, pour tout ce qui doit se changer depuis le backoffice * sans déploiement. Premier usage : la configuration Stripe. * * ── `secret` : LA COLONNE QUI COMPTE ─────────────────────────────────── * * Une valeur marquée `secret` n'est JAMAIS renvoyée au navigateur. Le * formulaire affiche `sk_live_••••4242` et poste une chaîne vide quand on * n'y touche pas. * * Sans ça, la clé secrète Stripe se retrouverait dans le HTML du * backoffice — donc dans le cache du navigateur, dans les captures * d'écran, dans les journaux de tout proxy sur le trajet. Une clé * `sk_live_` permet d'émettre des remboursements et de lire la totalité * des paiements du compte. * * @ORM\Entity(repositoryClass="App\Repository\Core\AppSettingsRepository") * @ORM\Table(name="app_settings", uniqueConstraints={ * @ORM\UniqueConstraint(name="uniq_app_settings_key", columns={"setting_key"}) * }) */class AppSettings{ /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(name="setting_key", type="string", length=100) */ private $settingKey; /** * `text` et pas `string` : une clé de webhook ou un JSON de * configuration dépasse vite 255 caractères. * * @ORM\Column(name="setting_value", type="text", nullable=true) */ private $settingValue; /** * Regroupement d'affichage dans le backoffice (`stripe`, `mail`, …). * * @ORM\Column(name="setting_group", type="string", length=50) */ private $settingGroup = 'general'; /** * Valeur sensible : masquée à l'affichage, jamais renvoyée en clair. * * @ORM\Column(name="is_secret", type="boolean") */ private $isSecret = false; /** * @ORM\Column(name="updated_at", type="datetime", nullable=true) */ private $updatedAt; /** * Qui a modifié, et quand. Une clé d'API qui change sans trace, c'est * une panne de paiement qu'on met une journée à expliquer. * * @ORM\Column(name="updated_by", type="string", length=180, nullable=true) */ private $updatedBy; public function getId(): ?int { return $this->id; } public function getSettingKey(): ?string { return $this->settingKey; } public function setSettingKey(string $k): self { $this->settingKey = $k; return $this; } public function getSettingValue(): ?string { return $this->settingValue; } public function setSettingValue(?string $v): self { $this->settingValue = $v; return $this; } public function getSettingGroup(): ?string { return $this->settingGroup; } public function setSettingGroup(string $g): self { $this->settingGroup = $g; return $this; } public function isSecret(): bool { return (bool) $this->isSecret; } public function setIsSecret(bool $s): self { $this->isSecret = $s; return $this; } public function getUpdatedAt(): ?\DateTimeInterface { return $this->updatedAt; } public function setUpdatedAt(?\DateTimeInterface $d): self { $this->updatedAt = $d; return $this; } public function getUpdatedBy(): ?string { return $this->updatedBy; } public function setUpdatedBy(?string $u): self { $this->updatedBy = $u; return $this; } /** * La valeur telle qu'on peut l'afficher : masquée si elle est secrète. * * On garde les 4 derniers caractères — c'est ce qui permet de vérifier * d'un coup d'œil qu'on a bien la bonne clé, sans la révéler. Même * convention que les numéros de carte. */ public function getMaskedValue(): ?string { if (!$this->settingValue) { return null; } if (!$this->isSecret()) { return $this->settingValue; } $v = $this->settingValue; $len = strlen($v); /* Trop courte pour être masquée utilement : on ne montre rien. */ if ($len <= 8) { return str_repeat('•', 8); } /* Le préfixe Stripe (`sk_live_`, `whsec_`) est public et permet de voir immédiatement si on est en test ou en production. */ $prefixe = ''; if (preg_match('/^(sk_live_|sk_test_|pk_live_|pk_test_|whsec_|price_|prod_)/', $v, $m)) { $prefixe = $m[1]; } return $prefixe . str_repeat('•', 8) . substr($v, -4); }}