01-gestion-utilisateurs

<?php
class UserManager {
    public function register(string $name, string $email, string $password): void {
        if(empty($name) || empty($email) || empty($password)) {
            throw new Exception("Données invalides");
        }
        
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new Exception("Email invalide");
        }
        
        if(strlen($password) < 8) {
            throw new Exception("Mot de passe trop court");
        }
        
        $hashedPassword = password_hash($password, PASSWORD_BCRYPT);
        
        $db = new PDO('mysql:host=localhost;dbname=app','root','');
        $stmt = $db->prepare('INSERT INTO users (name,email,password) VALUES (?,?,?)');
        $stmt->execute([$name, $email, $hashedPassword]);
        $userId = $db->lastInsertId();
        
        $subject = "Bienvenue $name!";
        $message = "Votre compte a été créé avec succès.";
        mail($email, $subject, $message);
        
        error_log("User registered: $userId - $email");
    }
    
    public function authenticate(string $email, string $password): ?array {
        $db = new PDO('mysql:host=localhost;dbname=app','root','');
        $stmt = $db->prepare('SELECT * FROM users WHERE email = ?');
        $stmt->execute([$email]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if(!$user || !password_verify($password, $user['password'])) {
            error_log("Failed login attempt: $email");
            return null;
        }
        
        error_log("Successful login: {$user['id']} - $email");
        return $user;
    }
}

/*
=== USER STORIES ===

US1: En tant que développeur, je veux pouvoir tester la logique d'authentification 
     sans avoir besoin d'une vraie base de données.

US2: En tant que product owner, je veux remplacer l'envoi d'email par SMS 
     par un service externe (Twilio) pour les nouveaux utilisateurs.

US3: En tant que développeur, je veux changer le système de logs pour utiliser 
     Monolog au lieu de error_log().

US4: En tant que développeur, je veux ajouter une validation qui vérifie que 
     l'email n'existe pas déjà en base avant l'insertion.
*/