Add files via upload

This commit is contained in:
tips-of-mine
2025-06-14 19:03:54 +02:00
committed by GitHub
parent 2df60f551b
commit b17c666c5a
51 changed files with 4363 additions and 0 deletions

View File

@ -0,0 +1,117 @@
<?php
namespace App\Services;
use PDO;
/**
* Service d'authentification utilisateur.
* Gère les connexions, déconnexions et vérifie l'état de l'authentification.
*/
class AuthService
{
private $db; // Instance PDO pour l'accès à la base de données
private $logService; // Service de journalisation
/**
* Constructeur du service d'authentification.
*
* @param PDO $db L'instance PDO de la base de données.
*/
public function __construct(PDO $db)
{
$this->db = $db;
// Le chemin du fichier de log doit être défini dans config/app.php
$this->logService = new LogService(APP_LOG_PATH);
}
/**
* Tente de connecter un utilisateur.
*
* @param string $username Le nom d'utilisateur.
* @param string $password Le mot de passe en clair.
* @param string $ipAddress L'adresse IP de la requête de connexion.
* @return bool Vrai si la connexion est réussie, faux sinon.
*/
public function login($username, $password, $ipAddress)
{
$stmt = $this->db->prepare("SELECT id, username, password, role FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
// Connexion réussie : enregistre les informations de l session
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['role'] = $user['role'];
// Log de l'action de connexion réussie
$this->logService->log('info', "Connexion réussie pour l'utilisateur '{$username}'.", $user['id'], $ipAddress);
return true;
} else {
// Connexion échouée : log de la tentative
$this->logService->log('warning', "Tentative de connexion échouée pour l'utilisateur '{$username}'.", null, $ipAddress);
return false;
}
}
/**
* Déconnecte l'utilisateur actuellement connecté.
*
* @param string $ipAddress L'adresse IP de la requête de déconnexion.
* @return bool Vrai si la déconnexion est effectuée.
*/
public function logout($ipAddress)
{
$userId = $_SESSION['user_id'] ?? 'inconnu';
$username = $_SESSION['username'] ?? 'inconnu';
// Détruit toutes les données de session
session_destroy();
$_SESSION = array(); // Vider le tableau $_SESSION
// Log de l'action de déconnexion
$this->logService->log('info', "Déconnexion de l'utilisateur '{$username}'.", $userId, $ipAddress);
return true;
}
/**
* Vérifie si un utilisateur est actuellement connecté.
*
* @return bool Vrai si l'utilisateur est connecté, faux sinon.
*/
public function isLoggedIn()
{
return isset($_SESSION['user_id']);
}
/**
* Récupère le rôle de l'utilisateur connecté.
*
* @return string|null Le rôle de l'utilisateur ('admin' ou 'user'), ou null si non connecté.
*/
public function getUserRole()
{
return $_SESSION['role'] ?? null;
}
/**
* Récupère l'ID de l'utilisateur connecté.
*
* @return int|null L'ID de l'utilisateur, ou null si non connecté.
*/
public function getUserId()
{
return $_SESSION['user_id'] ?? null;
}
/**
* Récupère le nom d'utilisateur de l'utilisateur connecté.
*
* @return string|null Le nom d'utilisateur, ou null si non connecté.
*/
public function getUsername()
{
return $_SESSION['username'] ?? null;
}
}

View File

@ -0,0 +1,118 @@
<?php
namespace App\Services;
/**
* Service pour gérer la langue de l'application et charger les traductions.
*/
class LanguageService
{
private $langDir; // Répertoire où sont stockés les fichiers de traduction
private $currentLang; // Langue actuellement sélectionnée
/**
* Constructeur du service de langue.
* Initialise la langue actuelle à partir de la session ou une valeur par défaut.
*
* @param string $langDir Chemin absolu du répertoire des fichiers de traduction.
*/
public function __construct($langDir)
{
$this->langDir = rtrim($langDir, '/') . '/'; // Assure qu'il y a un slash final
// Récupère la langue de la session ou utilise 'en' par default
$this->currentLang = $_SESSION['lang'] ?? 'en';
// Vérifie si la langue est supportée, sinon revient à 'en'
// CORRIGÉ: La condition était incorrecte
if (!in_array($this->currentLang, SUPPORTED_LANGUAGES)) {
$this->currentLang = 'en';
}
}
/**
* Définit la langue de l'application.
*
* @param string $lang Le code de la langue (ex: 'fr', 'en').
* @return bool Vrai si la langue a été définie avec succès, faux sinon.
*/
public function setLanguage($lang)
{
if (in_array($lang, SUPPORTED_LANGUAGES)) {
$_SESSION['lang'] = $lang;
$this->currentLang = $lang;
return true;
}
return false;
}
/**
* Retourne la langue actuellement sélectionnée.
*
* @return string Le code de la langue.
*/
public function getLanguage()
{
return $this->currentLang;
}
/**
* Charge et retourne toutes les traductions pour la langue actuelle.
*
* @return array Tableau associatif des traductions.
*/
public function getTranslations()
{
$filePath = $this->langDir . $this->currentLang . '.json';
if (file_exists($filePath)) {
$content = file_get_contents($filePath);
if ($content === false) {
error_log("LanguageService: Impossible de lire le fichier de traduction: " . $filePath);
return [];
}
$translations = json_decode($content, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("LanguageService: Erreur de décodage JSON pour le fichier: " . $filePath . " - " . json_last_error_msg());
return [];
}
return $translations;
}
// Fallback à l'anglais si le fichier de la langue actuelle est manquant
$englishFilePath = $this->langDir . 'en.json';
if (file_exists($englishFilePath)) {
$content = file_get_contents($englishFilePath);
if ($content === false) {
error_log("LanguageService: Impossible de lire le fichier de traduction anglais de secours: " . $englishFilePath);
return [];
}
$translations = json_decode($content, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("LanguageService: Erreur de décodage JSON pour le fichier anglais de secours: " . $englishFilePath . " - " . json_last_error_msg());
return [];
}
return $translations;
}
error_log("LanguageService: Aucun fichier de traduction trouvé pour la langue '" . $this->currentLang . "' ou 'en'.");
return []; // Retourne un tableau vide si aucune traduction n'est trouvée
}
/**
* Traduit une clé donnée.
*
* @param string $key La clé de traduction.
* @param array $replacements Tableau associatif de [placeholder => valeur] pour les remplacements.
* @return string La chaîne traduite ou la clé si non trouvée.
*/
public function __($key, $replacements = [])
{
// Utilise la variable globale $translations qui est chargée dans index.php
global $translations;
$translatedString = $translations[$key] ?? $key;
// Effectuer les remplacements de placeholders
foreach ($replacements as $placeholder => $value) {
$translatedString = str_replace("{" . $placeholder . "}", $value, $translatedString);
}
return $translatedString;
}
}

View File

@ -0,0 +1,117 @@
<?php
namespace App\Services;
/**
* Service pour gérer la langue de l'application et charger les traductions.
*/
class LanguageService
{
private $langDir; // Répertoire où sont stockés les fichiers de traduction
private $currentLang; // Langue actuellement sélectionnée
/**
* Constructeur du service de langue.
* Initialise la langue actuelle à partir de la session ou une valeur par défaut.
*
* @param string $langDir Chemin absolu du répertoire des fichiers de traduction.
*/
public function __construct($langDir)
{
$this->langDir = rtrim($langDir, '/') . '/'; // Assure qu'il y a un slash final
// Récupère la langue de la session ou utilise 'en' par défaut
$this->currentLang = $_SESSION['lang'] ?? 'en';
// Vérifie si la langue est supportée, sinon revient à 'en'
if (!in_array($this->currentLang, SUPPORTED_LANGUAGES)) {
$this->currentLang = 'en';
}
}
/**
* Définit la langue de l'application.
*
* @param string $lang Le code de la langue (ex: 'fr', 'en').
* @return bool Vrai si la langue a été définie avec succès, faux sinon.
*/
public function setLanguage($lang)
{
if (in_array($lang, SUPPORTED_LANGUAGES)) {
$_SESSION['lang'] = $lang;
$this->currentLang = $lang;
return true;
}
return false;
}
/**
* Retourne la langue actuellement sélectionnée.
*
* @return string Le code de la langue.
*/
public function getLanguage()
{
return $this->currentLang;
}
/**
* Charge et retourne toutes les traductions pour la langue actuelle.
*
* @return array Tableau associatif des traductions.
*/
public function getTranslations()
{
$filePath = $this->langDir . $this->currentLang . '.json';
if (file_exists($filePath)) {
$content = file_get_contents($filePath);
if ($content === false) {
error_log("LanguageService: Impossible de lire le fichier de traduction: " . $filePath);
return [];
}
$translations = json_decode($content, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("LanguageService: Erreur de décodage JSON pour le fichier: " . $filePath . " - " . json_last_error_msg());
return [];
}
return $translations;
}
// Fallback à l'anglais si le fichier de la langue actuelle est manquant
$englishFilePath = $this->langDir . 'en.json';
if (file_exists($englishFilePath)) {
$content = file_get_contents($englishFilePath);
if ($content === false) {
error_log("LanguageService: Impossible de lire le fichier de traduction anglais de secours: " . $englishFilePath);
return [];
}
$translations = json_decode($content, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("LanguageService: Erreur de décodage JSON pour le fichier anglais de secours: " . $englishFilePath . " - " . json_last_error_msg());
return [];
}
return $translations;
}
error_log("LanguageService: Aucun fichier de traduction trouvé pour la langue '" . $this->currentLang . "' ou 'en'.");
return []; // Retourne un tableau vide si aucune traduction n'est trouvée
}
/**
* Traduit une clé donnée.
*
* @param string $key La clé de traduction.
* @param array $replacements Tableau associatif de [placeholder => valeur] pour les remplacements.
* @return string La chaîne traduite ou la clé si non trouvée.
*/
public function __($key, $replacements = [])
{
// Utilise la variable globale $translations qui est chargée dans index.php
global $translations;
$translatedString = $translations[$key] ?? $key;
// Effectuer les remplacements de placeholders
foreach ($replacements as $placeholder => $value) {
$translatedString = str_replace("{" . $placeholder . "}", $value, $translatedString);
}
return $translatedString;
}
}

View File

@ -0,0 +1,48 @@
<?php
namespace App\Services;
/**
* Service pour journaliser les actions de l'application dans un fichier.
*/
class LogService
{
private $logFile; // Chemin complet du fichier de log
/**
* Constructeur du service de journalisation.
*
* @param string $logFile Chemin complet du fichier de log.
*/
public function __construct($logFile)
{
$this->logFile = $logFile;
}
/**
* Enregistre un message dans le fichier de log.
*
* @param string $level Niveau de gravité du log (ex: 'info', 'warning', 'error').
* @param string $message Le message à enregistrer.
* @param int|null $userId L'ID de l'utilisateur si l'action est liée à un utilisateur.
* @param string|null $ipAddress L'adresse IP d'où provient l'action.
*/
public function log($level, $message, $userId = null, $ipAddress = null)
{
$timestamp = date('Y-m-d H:i:s'); // Date et heure actuelle
$logEntry = sprintf("[%s] [%s] ", $timestamp, strtoupper($level)); // Format de base du log
// Ajoute l'ID utilisateur si fourni
if ($userId !== null) {
$logEntry .= "[User: $userId] ";
}
// Ajoute l'adresse IP si fournie
if ($ipAddress !== null) {
$logEntry .= "[IP: $ipAddress] ";
}
$logEntry .= "$message\n"; // Ajoute le message et un saut de ligne
// Écrit le log dans le fichier, en ajoutant au contenu existant
file_put_contents($this->logFile, $logEntry, FILE_APPEND);
}
}