60"
:style="scrolled ? 'background-color:#252426;box-shadow:0 2px 20px rgba(0,0,0,0.4);padding-top:0.5rem;padding-bottom:0.5rem;' : 'background-color:#252426;padding-top:0.75rem;padding-bottom:0.75rem;'">
4
entités BDD
3
rôles utilisateurs
JWT
Auth stateless
Docker
Multi-stage build
Contexte & description
Projet réalisé en BAC+3 — concevoir une API REST backend complète de zéro, sans frontend. L'objectif : simuler un vrai système de réservation ferroviaire avec authentification, contrôle d'accès par rôles, gestion des images, documentation interactive et tests d'intégration. Tout déployé via Docker multi-stage avec une image de production allégée.
Fonctionnalités clés
Auth JWT + Bcrypt
Inscription et connexion avec tokens JWT stateless. Mots de passe hashés via Bcrypt.
Contrôle d'accès par rôles
3 niveaux d'accès : user, employee, admin. Chaque route est protégée selon le rôle requis.
CRUD complet — 4 entités
Gestion complète des utilisateurs, gares, trains et réservations via des endpoints REST structurés.
Réservation avec code unique
Chaque billet génère un code unique (type QR). Statuts :
valid / used / cancelled.Upload & redimensionnement d'images
Images des gares uploadées via Multer, stockées en RAM (buffer) et redimensionnées à 200px avec Sharp avant sauvegarde.
Documentation Swagger interactive
Tous les endpoints documentés et testables via Swagger UI accessible sur
/api-docs.Tests d'intégration Jest + Supertest
Couverture des routes auth, CRUD et contrôle d'accès par rôle. Health check endpoint sur
/health.Docker multi-stage sécurisé
Image de production allégée avec utilisateur non-root. Environnements dev et prod séparés via Docker Compose.
Modèle de données — 4 entités
User
email · pseudo · mot de passe (Bcrypt)
user employee admin
user employee admin
TrainStation
nom · horaires d'ouverture/fermeture
image (upload + redimensionnement 200px)
image (upload + redimensionnement 200px)
Train
nom · heure de départ
gare de départ → gare d'arrivée
gare de départ → gare d'arrivée
Booking
code unique (type QR) · lien user/train
valid used cancelled
valid used cancelled
Stack technique
Core
Node.jsExpress.js v5MySQL 8Prisma ORM
Auth & Sécurité
JWTBcryptHelmetCORS
Validation & Upload
JoiMulterSharp
Tests & DevOps
JestSupertestSwagger UIDocker Compose
Points techniques notables
Pipeline image RAM → Sharp → disque
Multer stocke l'image uploadée en mémoire RAM (buffer), Sharp redimensionne automatiquement à 200px, puis le fichier final est sauvegardé sur disque — sans écriture intermédiaire.
Gestion des erreurs Prisma
Interception et traduction des codes d'erreur Prisma :
P2002 (contrainte unique),
P2025 (enregistrement introuvable),
P2003 (contrainte de clé étrangère) en réponses HTTP lisibles.
Docker multi-stage build sécurisé
Build en deux étapes : une image de développement avec tous les outils, et une image de production allégée qui n'embarque que le strict nécessaire, exécutée par un utilisateur non-root pour limiter la surface d'attaque.
Validation centralisée avec Joi
Schémas Joi réutilisables pour valider les corps de requêtes à l'entrée de chaque route, centralisés dans un dossier dédié pour éviter la duplication et faciliter la maintenance.
Voir le code source
Code complet disponible sur GitHub.