Files
ecoles/api/groups.php
T
Arnaud 5633969d98 Version initiale — carte des établissements scolaires
Carte Leaflet (annuaire Éducation nationale) + API PHP/MySQL :
fiche établissement (effectifs, IPS, population INSEE, DPE ADEME),
GED documents/photos, commentaires par groupe, gestion utilisateurs
et politique de mots de passe. Imports opendata (effectifs, IPS,
population, DPE, IRIS).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 21:35:41 +02:00

145 lines
5.9 KiB
PHP

<?php
/**
* Gestion des groupes d'utilisateurs (super-admin uniquement).
*
* Un groupe rassemble des utilisateurs. S'il est « valideur » (can_validate=1),
* ses membres peuvent valider les documents des établissements de ses communes
* (group_scopes). Les commentaires de fiche sont visibles entre membres d'un
* même groupe (voir api/comments.php).
*
* GET → liste des groupes (membres + communes)
* POST {name, can_validate?} → crée un groupe
* POST ?action=toggle {id, can_validate} → (dés)active le droit de validation
* POST ?action=member {group_id, user_id} → ajoute un membre
* POST ?action=scope {group_id, com, depc}→ ajoute une commune au périmètre
* DELETE ?id=N → supprime un groupe
* DELETE ?action=member&group_id=G&user_id=U → retire un membre
* DELETE ?action=scope&id=N → retire une commune
*/
declare(strict_types=1);
require __DIR__ . '/db.php';
try {
require_super();
$method = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? '';
// ---- Liste des groupes (avec membres et communes) ---------------------
if ($method === 'GET') {
$groups = db()->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);
}