All checks were successful
Deploy API / build-and-deploy (push) Successful in 2m33s
107 lines
2.4 KiB
Markdown
107 lines
2.4 KiB
Markdown
# 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) |