package dev.lions.btpxpress.adapter.http; import dev.lions.btpxpress.application.service.EmployeService; import dev.lions.btpxpress.domain.core.entity.Employe; import dev.lions.btpxpress.domain.core.entity.StatutEmploye; import jakarta.inject.Inject; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import java.util.List; import java.util.UUID; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.parameters.Parameter; import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; import org.eclipse.microprofile.openapi.annotations.tags.Tag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Resource REST pour la gestion des employés - Architecture 2025 MIGRATION: Préservation exacte de * tous les endpoints critiques */ @Path("/api/v1/employes") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Tag(name = "Employés", description = "Gestion des employés") public class EmployeResource { private static final Logger logger = LoggerFactory.getLogger(EmployeResource.class); @Inject EmployeService employeService; // === ENDPOINTS DE CONSULTATION - API CONTRACTS PRÉSERVÉS EXACTEMENT === @GET @Operation(summary = "Récupérer tous les employés") @APIResponse(responseCode = "200", description = "Liste des employés récupérée avec succès") public Response getAllEmployes( @Parameter(description = "Terme de recherche") @QueryParam("search") String search, @Parameter(description = "Statut de l'employé") @QueryParam("statut") String statut) { try { List employes; if (statut != null && !statut.isEmpty()) { employes = employeService.findByStatut(StatutEmploye.valueOf(statut.toUpperCase())); } else if (search != null && !search.isEmpty()) { employes = employeService.search(search, null, null, null); } else { employes = employeService.findAll(); } return Response.ok(employes).build(); } catch (Exception e) { logger.error("Erreur lors de la récupération des employés", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Erreur lors de la récupération des employés: " + e.getMessage()) .build(); } } @GET @Path("/{id}") @Operation(summary = "Récupérer un employé par ID") @APIResponse(responseCode = "200", description = "Employé récupéré avec succès") @APIResponse(responseCode = "404", description = "Employé non trouvé") public Response getEmployeById( @Parameter(description = "ID de l'employé") @PathParam("id") String id) { try { UUID employeId = UUID.fromString(id); return employeService .findById(employeId) .map(employe -> Response.ok(employe).build()) .orElse( Response.status(Response.Status.NOT_FOUND) .entity("Employé non trouvé avec l'ID: " + id) .build()); } catch (IllegalArgumentException e) { return Response.status(Response.Status.BAD_REQUEST) .entity("ID d'employé invalide: " + id) .build(); } catch (Exception e) { logger.error("Erreur lors de la récupération de l'employé {}", id, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Erreur lors de la récupération de l'employé: " + e.getMessage()) .build(); } } @GET @Path("/count") @Operation(summary = "Compter le nombre d'employés") @APIResponse(responseCode = "200", description = "Nombre d'employés retourné avec succès") public Response countEmployes() { try { long count = employeService.count(); return Response.ok(new CountResponse(count)).build(); } catch (Exception e) { logger.error("Erreur lors du comptage des employés", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Erreur lors du comptage des employés: " + e.getMessage()) .build(); } } @GET @Path("/stats") @Operation(summary = "Obtenir les statistiques des employés") @APIResponse(responseCode = "200", description = "Statistiques récupérées avec succès") public Response getStats() { try { Object stats = employeService.getStatistics(); return Response.ok(stats).build(); } catch (Exception e) { logger.error("Erreur lors de la génération des statistiques des employés", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Erreur lors de la génération des statistiques: " + e.getMessage()) .build(); } } @GET @Path("/disponibles") @Operation(summary = "Récupérer les employés disponibles") @APIResponse( responseCode = "200", description = "Liste des employés disponibles récupérée avec succès") @APIResponse(responseCode = "400", description = "Paramètres de date manquants") public Response getEmployesDisponibles( @Parameter(description = "Date de début (YYYY-MM-DD)") @QueryParam("dateDebut") String dateDebut, @Parameter(description = "Date de fin (YYYY-MM-DD)") @QueryParam("dateFin") String dateFin) { try { if (dateDebut == null || dateFin == null) { return Response.status(Response.Status.BAD_REQUEST) .entity("Les paramètres dateDebut et dateFin sont obligatoires") .build(); } List employes = employeService.findDisponibles(dateDebut, dateFin); return Response.ok(employes).build(); } catch (Exception e) { logger.error("Erreur lors de la récupération des employés disponibles", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Erreur lors de la récupération des employés disponibles: " + e.getMessage()) .build(); } } @GET @Path("/actifs") @Operation(summary = "Récupérer les employés actifs") @APIResponse( responseCode = "200", description = "Liste des employés actifs récupérée avec succès") public Response getEmployesActifs() { try { List employes = employeService.findByStatut(StatutEmploye.ACTIF); return Response.ok(employes).build(); } catch (Exception e) { logger.error("Erreur lors de la récupération des employés actifs", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Erreur lors de la récupération des employés actifs: " + e.getMessage()) .build(); } } // ============================================ // CLASSES UTILITAIRES // ============================================ public static record CountResponse(long count) {} }