$name, 'label' => $label]; if ($desc !== null) $entry['description'] = $desc; $registry['channels'][] = $entry; Channels::save($manifestDir, $registry); $message = "Channel « {$name} » créé."; if ($name !== $rawName) { $message .= " (Nom normalisé depuis « {$rawName} ».)"; } } elseif ($action === 'edit') { $name = trim((string)($_POST['name'] ?? '')); $label = trim((string)($_POST['label'] ?? '')) ?: $name; $desc = trim((string)($_POST['description'] ?? '')) ?: null; $found = false; foreach ($registry['channels'] as &$c) { if (($c['name'] ?? '') === $name) { $c['label'] = $label; if ($desc === null) unset($c['description']); else $c['description'] = $desc; $found = true; break; } } unset($c); if (!$found) throw new \RuntimeException("Channel « {$name} » introuvable."); Channels::save($manifestDir, $registry); $message = "Channel « {$name} » mis à jour."; } elseif ($action === 'delete') { $name = trim((string)($_POST['name'] ?? '')); if ($name === 'default') throw new \RuntimeException("Le channel « default » ne peut pas être supprimé."); // Sécurité : empêche la suppression si des versions ou licenses // référencent encore ce channel — sinon ces refs deviennent silencieusement // pendantes et l'admin oublie pourquoi tel client ne voit rien. $usage = checkChannelUsage($manifestDir, $name); if ($usage['versions'] > 0 || $usage['licenses'] > 0) { throw new \RuntimeException( "Impossible de supprimer « {$name} » : " . "{$usage['versions']} version(s) taggée(s) et {$usage['licenses']} license(s) attribuée(s) à ce channel. " . "Détague d'abord les versions (page Versions) et change les licenses concernées (page Licenses)." ); } $registry['channels'] = array_values(array_filter( $registry['channels'], fn($c) => ($c['name'] ?? '') !== $name )); Channels::save($manifestDir, $registry); $message = "Channel « {$name} » supprimé."; } } catch (\Throwable $e) { $message = $e->getMessage(); $messageType = 'error'; } } /** * Compte les versions et licenses qui pointent encore sur un channel. * Sert de garde-fou avant suppression. */ function checkChannelUsage(string $manifestDir, string $channelName): array { $usage = ['versions' => 0, 'licenses' => 0]; $manifestPath = $manifestDir . '/versions.json'; if (is_file($manifestPath)) { $m = json_decode(file_get_contents($manifestPath), true); if (is_array($m) && isset($m['versions'])) { foreach ($m['versions'] as $v) { $channels = $v['channels'] ?? []; if (in_array($channelName, $channels, true)) $usage['versions']++; } } } try { $config = require __DIR__ . '/../api/config.php'; $db = \PSLauncher\Db::get($config); $stmt = $db->prepare('SELECT COUNT(*) FROM licenses WHERE channel = ?'); $stmt->execute([$channelName]); $usage['licenses'] = (int)$stmt->fetchColumn(); } catch (\Throwable) { /* DB not reachable from this context, best effort */ } return $usage; } require_once __DIR__ . '/../api/lib/Db.php'; $registry = Channels::load($manifestDir); Layout::header('Channels', 'channels'); ?>

Channels de distribution

Comment ça marche

Créer un channel

Channels existants

Nom Label Description Actions
implicite
Éditer