# 👤 CONCEPT: USER ## 📌 Vue d'ensemble Le concept **USER** gère les utilisateurs, authentification, rôles et permissions via Keycloak. **Importance**: ⭐⭐⭐⭐⭐ (Concept fondamental) --- ## 🗂️ Fichiers concernés ### **Entités JPA** | Fichier | Description | |---------|-------------| | `User.java` | Entité principale utilisateur | | `UserRole.java` | Enum (ADMIN, MANAGER, CHEF_CHANTIER, COMPTABLE, OUVRIER) | | `UserStatus.java` | Enum (ACTIVE, INACTIVE, LOCKED, SUSPENDED) | | `Permission.java` | Enum permissions | ### **Services** | Fichier | Description | |---------|-------------| | `UserService.java` | Service métier utilisateurs | | `PermissionService.java` | Service permissions | ### **Resources** | Fichier | Description | |---------|-------------| | `UserResource.java` | API REST utilisateurs | | `AuthResource.java` | API authentification | --- ## 📊 Modèle de données ```java @Entity @Table(name = "users") public class User extends PanacheEntityBase { @Id @GeneratedValue(strategy = GenerationType.UUID) private UUID id; @Column(name = "keycloak_id", unique = true) private String keycloakId; @Column(name = "username", unique = true, nullable = false) private String username; @Column(name = "email", unique = true, nullable = false) private String email; @Column(name = "nom") private String nom; @Column(name = "prenom") private String prenom; @Enumerated(EnumType.STRING) @Column(name = "role") private UserRole role; @Enumerated(EnumType.STRING) @Column(name = "status") private UserStatus status = UserStatus.ACTIVE; @OneToOne @JoinColumn(name = "employe_id") private Employe employe; } ``` ### **Enum UserRole** ```java public enum UserRole { ADMIN, // Administrateur système MANAGER, // Manager/Directeur CHEF_CHANTIER, // Chef de chantier COMPTABLE, // Comptable OUVRIER // Ouvrier } ``` --- ## 🔌 API REST ### **Endpoints** | Méthode | Endpoint | Description | |---------|----------|-------------| | GET | `/api/v1/users` | Liste utilisateurs | | GET | `/api/v1/users/{id}` | Détails | | POST | `/api/v1/users` | Créer | | PUT | `/api/v1/users/{id}` | Modifier | | DELETE | `/api/v1/users/{id}` | Supprimer | | GET | `/api/v1/users/me` | Utilisateur connecté | | POST | `/api/v1/auth/login` | Connexion | | POST | `/api/v1/auth/logout` | Déconnexion | --- ## 💻 Exemples ### **Créer un utilisateur** ```bash curl -X POST http://localhost:8080/api/v1/users \ -H "Content-Type: application/json" \ -d '{ "username": "jdupont", "email": "jean.dupont@btpxpress.fr", "nom": "Dupont", "prenom": "Jean", "role": "CHEF_CHANTIER", "password": "SecurePass123!" }' ``` ### **Utilisateur connecté** ```bash curl -X GET http://localhost:8080/api/v1/users/me \ -H "Authorization: Bearer $TOKEN" ``` --- ## 🔐 Authentification L'authentification se fait via **Keycloak** avec OAuth2/OIDC : 1. L'utilisateur se connecte via Keycloak 2. Keycloak retourne un JWT token 3. Le token est envoyé dans le header `Authorization: Bearer ` 4. Le backend valide le token auprès de Keycloak --- **Dernière mise à jour**: 2025-09-30 **Version**: 1.0