# hotel-api-rs ## Description Ce projet est un proof of concept servant de terrain d'expérimentation pour un outil interne destiné à des hotels. ### Objectif: - Petite échelle: ~50 hôtels maximum, ~5 utilisateurs par hôtel - Facilité de maintenance, y compris pour des utilisateurs peu à l'aise avec Linux Ce projet m'a persmis de découvrir et mettre en pratique : - Rust (API backend) - Authentification JWT - Hash de mots de passe(Argon2) - WebSockets (temps réel) - Docker - GitActions - SQlite ## Fonctionalités - CRUD (rooms, inventory, chat) - Authentification : - Refresh token - Session token - Notifications en temps réel(WebSocket) - Chat en temps réel ## Démo Une interface de démonstration est disponible ici: https://mallardromain.com/hotel-demo/ ## Installation ### Local ``` cargo run ``` - Les bases SQLite sont présentes par défaut dans `/db` - Port par défaut : 7080(configuré dans `main.rs`) ### Docker ``` docker run -d \ -e JWT_SECRET=secret_JWT \ -v "/votre/chemin/:/app/db" \ ``` Notes: - Il est nécessaire de copier les bases de donner par défaut dans le volume - Le scret doit obligatoirement être préciser a la création du container - Valeur de JWT_SECRET pour les utilisateur présent sur les bases de donnée par défault: - `your_jwt_secret_key` ## Architecture ### Routing - Point d'entrée: `./src/routes/mod.rs` (utilié dans le `./main.rs`) - Organisation par domaine: - chaque module posséde son propre `routes.rs` ### Modules principaux - `.src/rooms`,`.src/inventory` et `.src/chat` sont principalement de la logique CRUD ### Utils - `src/utils/db_pools.rs` - Getsion des connexions aux bases SQLite de chaque hôtels - `.src/utils/websocket.rs` - Implémentation des WebSockets: - Notification temps réel - chat (émission/reception) - `.src/utils/auth.rs` - Hash/vérification des mots de passe(Argon2) - Génération et validation des JWT - Pré-traitement des tokens ## Authentification Flow: - 1. Obtenir un "refresh token" `GET /auth/get_refresh` - 2. Obtenir un session token `POST /auth/login_refresh_token` - 3. Ouvrir une connexion WebSocket `/auth/ws/YourToken` ## Ce que j'ai appris - Utilisation du framework "Axum" - Gestion de payload des requète explicite et stricte - Gestion des websocket plus complexe - Dockerisation simple - CD simple (déploiment automatique sur un VPS linux)