## Architecture & Philosophie Ce projet s'inspire de la philosophie de Rust : **"Rendre les états illégaux impossibles à représenter"**. Si vous venez de **Django**, voici les principales différences à garder en tête : ### 1. Extracteurs vs Objet Request Contrairement à Django qui passe un objet `request` "fourre-tout" à chaque vue, ce projet utilise des **Extracteurs Axum ** (dans la signature des fonctions). - **Le "Contrat" par la signature :** Si une vue demande `user: CurrentUser`, Axum garantit que l'utilisateur est authentifié. Si ce n'est pas le cas, la vue n'est pas appelée et une erreur 401 est retournée automatiquement. - **Auto-documentation :** En regardant simplement la signature d'une fonction, on sait exactement ce dont elle a besoin (Base de données, Utilisateur, JSON, etc.). ### 2. Le Flux d'Authentification 1. **Middleware (`context_middleware`) :** Intercepte la requête, vérifie le JWT, récupère l'utilisateur complet en base de données, et injecte le tout dans `RequestContext`. 2. **Extensions :** Le `RequestContext` est stocké dans les "extensions" de la requête (un espace de stockage de type Map). 3. **Extracteurs :** L'extracteur `CurrentUser` récupère les données depuis les extensions et les rend disponibles dans la signature de votre vue. ### 3. Transparence (Deref) L'objet `CurrentUser` enveloppe le modèle de base de données. Grâce à l'implémentation de `Deref`, vous pouvez accéder aux champs de l'utilisateur (ex: `user.is_superuser`) directement comme s'il s'agissait du modèle lui-même. --- ## TODO Terminer le système d'authentification (login, changement de mot de passe...)