query('SELECT id, name, can_validate, created_at FROM user_groups ORDER BY name')->fetchAll(); $members = db()->query( 'SELECT gm.group_id, u.id, u.username FROM group_members gm JOIN users u ON u.id = gm.user_id ORDER BY u.username' )->fetchAll(); $scopes = db()->query('SELECT id, group_id, com, depc FROM group_scopes ORDER BY com')->fetchAll(); $byMembers = []; foreach ($members as $m) { $byMembers[(int) $m['group_id']][] = ['id' => (int) $m['id'], 'username' => $m['username']]; } $byScopes = []; foreach ($scopes as $s) { $byScopes[(int) $s['group_id']][] = ['id' => (int) $s['id'], 'com' => $s['com'], 'depc' => $s['depc']]; } foreach ($groups as &$g) { $g['id'] = (int) $g['id']; $g['can_validate'] = (int) $g['can_validate']; $g['members'] = $byMembers[$g['id']] ?? []; $g['scopes'] = $byScopes[$g['id']] ?? []; } json_out($groups); } // ---- Bascule du droit de validation ----------------------------------- if ($method === 'POST' && $action === 'toggle') { $b = body_json(); $id = (int) ($b['id'] ?? 0); if ($id <= 0) { json_error('id requis.'); } $can = !empty($b['can_validate']) ? 1 : 0; db()->prepare('UPDATE user_groups SET can_validate = ? WHERE id = ?')->execute([$can, $id]); json_out(['ok' => true, 'can_validate' => $can]); } // ---- Ajout d'un membre ------------------------------------------------ if ($method === 'POST' && $action === 'member') { $b = body_json(); $gid = (int) ($b['group_id'] ?? 0); $uid = (int) ($b['user_id'] ?? 0); if ($gid <= 0 || $uid <= 0) { json_error('group_id et user_id requis.'); } db()->prepare('INSERT IGNORE INTO group_members (group_id, user_id) VALUES (?, ?)') ->execute([$gid, $uid]); json_out(['ok' => true]); } // ---- Ajout d'une commune au périmètre --------------------------------- if ($method === 'POST' && $action === 'scope') { $b = body_json(); $gid = (int) ($b['group_id'] ?? 0); $com = trim((string) ($b['com'] ?? '')); $depc = trim((string) ($b['depc'] ?? '')); if ($gid <= 0 || $com === '' || $depc === '') { json_error('group_id, com et depc requis.'); } db()->prepare('INSERT IGNORE INTO group_scopes (group_id, com, depc) VALUES (?, ?, ?)') ->execute([$gid, $com, $depc]); json_out(['ok' => true]); } // ---- Création d'un groupe --------------------------------------------- if ($method === 'POST') { $b = body_json(); $name = trim((string) ($b['name'] ?? '')); $can = !empty($b['can_validate']) ? 1 : 0; if ($name === '') { json_error('Nom de groupe requis.'); } $exists = db()->prepare('SELECT 1 FROM user_groups WHERE name = ?'); $exists->execute([$name]); if ($exists->fetchColumn()) { json_error('Ce nom de groupe existe déjà.'); } db()->prepare('INSERT INTO user_groups (name, can_validate) VALUES (?, ?)')->execute([$name, $can]); json_out(['id' => (int) db()->lastInsertId(), 'name' => $name, 'can_validate' => $can], 201); } // ---- Retrait d'un membre ---------------------------------------------- if ($method === 'DELETE' && $action === 'member') { $gid = (int) ($_GET['group_id'] ?? 0); $uid = (int) ($_GET['user_id'] ?? 0); if ($gid <= 0 || $uid <= 0) { json_error('group_id et user_id requis.'); } db()->prepare('DELETE FROM group_members WHERE group_id = ? AND user_id = ?')->execute([$gid, $uid]); json_out(['ok' => true]); } // ---- Retrait d'une commune -------------------------------------------- if ($method === 'DELETE' && $action === 'scope') { $id = (int) ($_GET['id'] ?? 0); if ($id <= 0) { json_error('id requis.'); } db()->prepare('DELETE FROM group_scopes WHERE id = ?')->execute([$id]); json_out(['deleted' => $id]); } // ---- Suppression d'un groupe ------------------------------------------ if ($method === 'DELETE') { $id = (int) ($_GET['id'] ?? 0); if ($id <= 0) { json_error('id requis.'); } db()->prepare('DELETE FROM user_groups WHERE id = ?')->execute([$id]); json_out(['deleted' => $id]); } json_error('Méthode non supportée.', 405); } catch (Throwable $e) { json_error('Erreur : ' . $e->getMessage(), 500); }