Files
geo/api/src/Core/Controller.php

86 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Core;
use Database;
use Session;
use Response;
use Request;
use PDO;
/**
* Classe de base pour tous les controllers
* Fournit des méthodes communes pour l'authentification et les réponses
*/
abstract class Controller {
protected PDO $db;
public function __construct() {
$this->db = Database::getInstance();
}
/**
* Vérifier que l'utilisateur est authentifié
*/
protected function requireAuth(): void {
if (!Session::isAuthenticated()) {
$this->sendError('Non authentifié', 401);
exit;
}
}
/**
* Récupérer les données JSON de la requête
*/
protected function getJsonInput(): array {
return Request::getJson();
}
/**
* Envoyer une réponse de succès
*/
protected function sendSuccess($data = null, int $code = 200): void {
if ($data === null) {
Response::json(['status' => 'success'], $code);
} else {
Response::json($data, $code);
}
}
/**
* Envoyer une réponse d'erreur
*/
protected function sendError(string $message, int $code = 500): void {
Response::json([
'status' => 'error',
'message' => $message
], $code);
}
/**
* Valider qu'un tableau contient les clés requises
*/
protected function validateRequired(array $data, array $requiredFields): bool {
foreach ($requiredFields as $field) {
if (!isset($data[$field]) || $data[$field] === '') {
$this->sendError("Le champ '$field' est requis", 400);
return false;
}
}
return true;
}
/**
* Nettoyer et valider un ID
*/
protected function validateId($id): ?int {
if (!is_numeric($id) || $id <= 0) {
$this->sendError('ID invalide', 400);
return null;
}
return (int) $id;
}
}