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