'Non identifié — veuillez vous connecter.']); exit; } try { $pdo = getDbConnection(); } catch (PDOException $e) { http_response_code(500); echo json_encode(['error' => 'Connexion base de données impossible']); exit; } $method = $_SERVER['REQUEST_METHOD']; if ($method === 'GET') { $competences = $pdo->query('SELECT CMP_Code, CMP_Libelle, CMP_Description, CMP_DateCreation FROM ASP_Competences ORDER BY CMP_Libelle')->fetchAll(); echo json_encode(['competences' => $competences]); exit; } if ($method === 'POST') { $data = json_decode(file_get_contents('php://input'), true) ?? []; $code = trim((string) ($data['CMP_Code'] ?? '')); $libelle = trim((string) ($data['CMP_Libelle'] ?? '')); $description = trim((string) ($data['CMP_Description'] ?? '')); if ($code === '' || $libelle === '') { http_response_code(400); echo json_encode(['error' => 'CMP_Code et CMP_Libelle sont obligatoires.']); exit; } // Whitelist de forme plutôt qu'une simple absence de vérification : un // code de compétence est aussi un identifiant utilisé en dur dans // mission_agent.php (outilsDeLaCompetence()) — jamais d'espace ni de // caractère qui compliquerait sa lecture dans le code PHP. if (!preg_match('/^[A-Z0-9_]+$/', $code)) { http_response_code(400); echo json_encode(['error' => 'CMP_Code ne doit contenir que des majuscules, chiffres et underscores (ex. SITE_WEB).']); exit; } try { $stmt = $pdo->prepare('SELECT 1 FROM ASP_Competences WHERE CMP_Code = ?'); $stmt->execute([$code]); if ($stmt->fetch()) { http_response_code(409); echo json_encode(['error' => "La compétence $code existe déjà."]); exit; } $pdo->prepare('INSERT INTO ASP_Competences (CMP_Code, CMP_Libelle, CMP_Description) VALUES (?, ?, ?)') ->execute([$code, $libelle, $description !== '' ? $description : null]); echo json_encode(['success' => true]); } catch (PDOException $e) { http_response_code(500); echo json_encode(['error' => 'Erreur base de données : ' . $e->getMessage()]); } exit; } http_response_code(405); echo json_encode(['error' => 'Méthode non autorisée']);