41 lines
1.8 KiB
Markdown
41 lines
1.8 KiB
Markdown
## 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.
|
|
|
|
---
|
|
|
|
## Documentation
|
|
|
|
- **API (REST & WebSocket) :** `/swagger-ui` ou `/scalar`
|
|
- La documentation du WebSocket est incluse dans l'OpenAPI via une route descriptive `/handler/ws/`.
|
|
|
|
## TODO
|
|
|
|
Terminer le système d'authentification (login, changement de mot de passe...)
|