From 6e9dd738d7504db08c9f88d348e71f1a7c5000b0 Mon Sep 17 00:00:00 2001 From: Benoit Date: Sun, 24 May 2026 22:28:43 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20correction=20=C3=A9dition/suppression=20?= =?UTF-8?q?groupes=20avec=20IDs=20g=C3=A9n=C3=A9r=C3=A9s=20dynamiquement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problème : l'édition et la suppression de groupes ne fonctionnaient pas car les IDs n'étaient pas persistés dans le YAML. Solution : - loadConfig() génère maintenant les IDs à chaque chargement (slugify du nom) - PUT /admin/groups/:id cherche le groupe par nom slugifié au lieu de l'ID - DELETE /admin/groups/:id idem - Les IDs ne sont jamais sauvegardés dans config.yaml (source de vérité = nom) - Rechargement après mise à jour pour renvoyer les IDs corrects au client Comportement : - Création : génère l'ID depuis le nom - Édition : trouve le groupe par son nom slugifié, sauvegarde sans ID, recharge - Suppression : trouve le groupe par son nom slugifié - Les IDs restent cohérents entre les rechargements --- server/api/admin.js | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/server/api/admin.js b/server/api/admin.js index 6f9f84e..c10b84c 100644 --- a/server/api/admin.js +++ b/server/api/admin.js @@ -44,10 +44,26 @@ const configPath = join(__dirname, '..', 'config', 'config.yaml'); /** * Charge la configuration depuis le fichier YAML + * et génère les IDs à partir des noms */ function loadConfig() { const configFile = readFileSync(configPath, 'utf8'); - return YAML.parse(configFile); + const config = YAML.parse(configFile); + + // Générer les IDs pour les groupes et canaux + config.groups = config.groups.map(group => { + const groupId = slugify(group.name); + return { + ...group, + id: groupId, + channels: group.channels ? group.channels.map(channel => ({ + ...channel, + id: channel.id || `${groupId}-${slugify(channel.name)}` + })) : [] + }; + }); + + return config; } /** @@ -213,6 +229,7 @@ router.post('/groups', (req, res) => { * PUT /admin/groups/:id * Modifie un groupe existant * Body: { name?, audioBitrate?, channels? } + * Note: l'ID est un slug généré, on cherche le groupe par nom dans le YAML */ router.put('/groups/:id', (req, res) => { try { @@ -220,7 +237,9 @@ router.put('/groups/:id', (req, res) => { const { name, audioBitrate, channels } = req.body; const config = loadConfig(); - const groupIndex = config.groups.findIndex(g => g.id === id); + + // Chercher le groupe par son nom (qui correspond à l'ID slugifié) + const groupIndex = config.groups.findIndex(g => slugify(g.name) === id); if (groupIndex === -1) { return res.status(404).json({ @@ -232,10 +251,11 @@ router.put('/groups/:id', (req, res) => { if (name !== undefined) config.groups[groupIndex].name = name; if (audioBitrate !== undefined) config.groups[groupIndex].audioBitrate = audioBitrate; if (channels !== undefined) { - // Générer les IDs pour les canaux s'ils n'existent pas + // Pas besoin de générer les IDs ici, ils seront générés au chargement config.groups[groupIndex].channels = channels.map(channel => ({ - ...channel, - id: channel.id || `${id}-${slugify(channel.name)}` + name: channel.name, + audioInput: channel.audioInput, + audioOutput: channel.audioOutput })); } @@ -243,9 +263,14 @@ router.put('/groups/:id', (req, res) => { addLog('info', `Group updated: ${config.groups[groupIndex].name}`, { id }); + // Recharger pour obtenir les IDs générés + const updatedConfig = loadConfig(); + const updatedGroupIndex = updatedConfig.groups.findIndex(g => slugify(g.name) === id || slugify(g.name) === slugify(name)); + const updatedGroup = updatedGroupIndex !== -1 ? updatedConfig.groups[updatedGroupIndex] : null; + res.json({ message: 'Group updated', - group: config.groups[groupIndex] + group: updatedGroup }); } catch (error) { @@ -257,13 +282,14 @@ router.put('/groups/:id', (req, res) => { /** * DELETE /admin/groups/:id * Supprime un groupe + * Note: l'ID est un slug généré, on cherche le groupe par nom dans le YAML */ router.delete('/groups/:id', (req, res) => { try { const { id } = req.params; const config = loadConfig(); - const groupIndex = config.groups.findIndex(g => g.id === id); + const groupIndex = config.groups.findIndex(g => slugify(g.name) === id); if (groupIndex === -1) { return res.status(404).json({