package dev.lions.unionflow.server.resource; import dev.lions.unionflow.server.api.dto.ticket.request.CreateTicketRequest; import dev.lions.unionflow.server.api.dto.ticket.response.TicketResponse; import dev.lions.unionflow.server.service.TicketService; import jakarta.annotation.security.RolesAllowed; import jakarta.inject.Inject; import jakarta.validation.Valid; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import lombok.extern.slf4j.Slf4j; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; import org.eclipse.microprofile.openapi.annotations.tags.Tag; import java.util.List; import java.util.Map; import java.util.UUID; /** * Resource REST pour la gestion des tickets support * * @author UnionFlow Team * @version 1.0 */ @Path("/api/tickets") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Tag(name = "Tickets", description = "Gestion des tickets support") @Slf4j @RolesAllowed({ "USER", "ADMIN", "ADMIN_ORGANISATION", "MEMBRE" }) public class TicketResource { @Inject TicketService ticketService; @GET @Path("/utilisateur/{utilisateurId}") @Operation(summary = "Lister les tickets d'un utilisateur") @APIResponse(responseCode = "200", description = "Liste des tickets récupérée avec succès") public Response listerTickets(@PathParam("utilisateurId") UUID utilisateurId) { log.info("GET /api/tickets/utilisateur/{}", utilisateurId); List tickets = ticketService.listerTickets(utilisateurId); return Response.ok(tickets).build(); } @GET @Path("/{id}") @Operation(summary = "Récupérer un ticket par ID") @APIResponse(responseCode = "200", description = "Ticket trouvé") public Response obtenirTicket(@PathParam("id") UUID id) { log.info("GET /api/tickets/{}", id); TicketResponse ticket = ticketService.obtenirTicket(id); return Response.ok(ticket).build(); } @POST @Operation(summary = "Créer un nouveau ticket") @APIResponse(responseCode = "201", description = "Ticket créé avec succès") public Response creerTicket(@Valid CreateTicketRequest request) { log.info("POST /api/tickets - Création d'un ticket"); TicketResponse created = ticketService.creerTicket(request); return Response.status(Response.Status.CREATED).entity(created).build(); } @GET @Path("/utilisateur/{utilisateurId}/statistiques") @Operation(summary = "Obtenir les statistiques des tickets d'un utilisateur") @APIResponse(responseCode = "200", description = "Statistiques récupérées avec succès") public Response obtenirStatistiques(@PathParam("utilisateurId") UUID utilisateurId) { log.info("GET /api/tickets/utilisateur/{}/statistiques", utilisateurId); Map stats = ticketService.obtenirStatistiques(utilisateurId); return Response.ok(stats).build(); } }