# 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)  