// Fiche projet
Gestionnaire de tickets support
API REST Java / Spring Boot sécurisée avec authentification JWT, contrôle d'accès par rôles (USER / AGENT) et cycle de vie complet des tickets. PostgreSQL, tests JUnit 5 / Mockito, Swagger UI, Docker, CI/CD avec GitHub Actions et JaCoCo. Déployée sur Railway.

Contexte & objectifs
Construire une API REST complète de gestion de tickets support, pensée comme une vraie application métier : authentification JWT, gestion des rôles (USER / AGENT), cycle de vie des tickets (OPEN → IN_PROGRESS → SOLVED). Objectifs : maîtriser la stack backend de bout en bout — Spring Security, modélisation JPA, API REST, tests — et produire un code testé, documenté (Swagger UI) et facile à faire évoluer.
Fonctionnalités principales
- Authentification JWT et contrôle d'accès par rôles (USER / AGENT)
- CRUD des tickets avec cycle de vie (OPEN → IN_PROGRESS → SOLVED)
- Documentation API interactive avec Swagger UI
- Pipeline CI/CD automatisé (GitHub Actions + JaCoCo)
- Containerisation Docker et déploiement Railway
Choix techniques & compétences mobilisées
Difficultés rencontrées & solutions apportées
Difficulté
Sécuriser tous les endpoints selon le rôle de l'utilisateur sans dupliquer la logique de contrôle.
Solution
Configuration déclarative de Spring Security (règles par endpoint) et granularité par annotations, couverte par des tests de sécurité.
Difficulté
Gérer des relations JPA complexes (tickets, utilisateurs) sans erreurs de lazy loading ni requêtes N+1.
Solution
Architecture en couches stricte (Controller → Service → Repository), DTOs explicites et tests unitaires Mockito sur les comportements critiques.
Enseignements tirés
- Sécurité pensée dès la conception : définir Spring Security et les rôles avant la logique métier évite de tout réécrire.
- L'architecture en couches et les DTOs rendent le code testable (Mockito) et facile à faire évoluer.
- Un modèle de données réfléchi en amont (relations JPA) évite les requêtes N+1 et les surprises de lazy loading.
- Documenter l'API (Swagger UI) transforme le projet en un outil utilisable par d'autres développeurs.
- Les tests doivent cibler les comportements critiques plutôt que couvrir le code pour la forme.

