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>
This commit is contained in:
+144
@@ -0,0 +1,144 @@
|
||||
<?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);
|
||||
}
|
||||
Reference in New Issue
Block a user