Refactoring

This commit is contained in:
dahoud
2026-02-05 18:09:30 +00:00
parent 2a794523b6
commit 806efeb074
24 changed files with 2261 additions and 123 deletions

View File

@@ -1,18 +1,20 @@
package com.lions.dev.resource;
import com.lions.dev.core.security.JwtAuthFilter;
import com.lions.dev.core.security.RequiresAuth;
import com.lions.dev.dto.request.promotion.PromotionCreateRequestDTO;
import com.lions.dev.dto.request.promotion.PromotionUpdateRequestDTO;
import com.lions.dev.dto.response.promotion.PromotionResponseDTO;
import com.lions.dev.entity.promotion.Promotion;
import com.lions.dev.security.Permission;
import com.lions.dev.security.RequiresPermission;
import com.lions.dev.service.PromotionService;
import com.lions.dev.service.SecurityService;
import com.lions.dev.util.UserRoles;
import jakarta.annotation.security.PermitAll;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import jakarta.ws.rs.*;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.eclipse.microprofile.openapi.annotations.Operation;
@@ -29,8 +31,10 @@ import java.util.stream.Collectors;
/**
* Ressource REST pour la gestion des promotions dans le système AfterWork.
*
* Cette classe expose des endpoints pour créer, récupérer, mettre à jour
* et supprimer des promotions d'établissements.
* SÉCURITÉ : Les lectures sont publiques, les écritures requièrent une authentification.
* Seul le responsable de l'établissement peut créer/modifier/supprimer des promotions.
*
* @since 2.0 - Sécurité JWT + RBAC production-ready
*/
@Path("/promotions")
@Produces(MediaType.APPLICATION_JSON)
@@ -41,14 +45,10 @@ public class PromotionResource {
@Inject
PromotionService promotionService;
private static final Logger LOG = Logger.getLogger(PromotionResource.class);
@Inject
SecurityService securityService;
/**
* Extrait l'ID de l'utilisateur authentifié du contexte de la requête.
*/
private UUID getAuthenticatedUserId(ContainerRequestContext requestContext) {
return (UUID) requestContext.getProperty(JwtAuthFilter.AUTHENTICATED_USER_ID);
}
private static final Logger LOG = Logger.getLogger(PromotionResource.class);
// =====================================================================
// ENDPOINTS PUBLICS (LECTURE)
@@ -62,6 +62,7 @@ public class PromotionResource {
* @return Liste paginée des promotions actives
*/
@GET
@PermitAll
@Operation(
summary = "Récupérer toutes les promotions actives",
description = "Retourne une liste paginée de toutes les promotions actives et valides")
@@ -94,6 +95,7 @@ public class PromotionResource {
*/
@GET
@Path("/{id}")
@PermitAll
@Operation(
summary = "Récupérer une promotion par ID",
description = "Retourne les détails d'une promotion spécifique")
@@ -127,6 +129,7 @@ public class PromotionResource {
*/
@GET
@Path("/code/{code}")
@PermitAll
@Operation(
summary = "Rechercher une promotion par code promo",
description = "Retourne la promotion correspondant au code promo")
@@ -164,6 +167,7 @@ public class PromotionResource {
*/
@GET
@Path("/establishment/{establishmentId}")
@PermitAll
@Operation(
summary = "Récupérer les promotions d'un établissement",
description = "Retourne les promotions d'un établissement spécifique")
@@ -211,7 +215,8 @@ public class PromotionResource {
*/
@POST
@Transactional
@RequiresAuth
@RolesAllowed({UserRoles.OWNER, UserRoles.MANAGER, UserRoles.ADMIN, UserRoles.SUPER_ADMIN})
@RequiresPermission(Permission.PROMOTIONS_CREATE)
@Operation(
summary = "Créer une promotion",
description = "Crée une nouvelle promotion pour un établissement. Seul le responsable peut créer.")
@@ -220,10 +225,8 @@ public class PromotionResource {
@APIResponse(responseCode = "400", description = "Données invalides")
@APIResponse(responseCode = "401", description = "Non authentifié")
@APIResponse(responseCode = "403", description = "Non autorisé à créer des promotions pour cet établissement")
public Response createPromotion(
@Context ContainerRequestContext requestContext,
@Valid PromotionCreateRequestDTO requestDTO) {
UUID authenticatedUserId = getAuthenticatedUserId(requestContext);
public Response createPromotion(@Valid PromotionCreateRequestDTO requestDTO) {
UUID authenticatedUserId = securityService.getCurrentUserId();
LOG.info("[LOG] Création d'une promotion pour l'établissement : " + requestDTO.getEstablishmentId() +
" par l'utilisateur : " + authenticatedUserId);
@@ -267,7 +270,8 @@ public class PromotionResource {
@PUT
@Path("/{id}")
@Transactional
@RequiresAuth
@RolesAllowed({UserRoles.OWNER, UserRoles.MANAGER, UserRoles.ADMIN, UserRoles.SUPER_ADMIN})
@RequiresPermission(Permission.PROMOTIONS_UPDATE_OWN)
@Operation(
summary = "Mettre à jour une promotion",
description = "Met à jour une promotion existante. Seul le responsable peut modifier.")
@@ -277,10 +281,9 @@ public class PromotionResource {
@APIResponse(responseCode = "403", description = "Non autorisé à modifier cette promotion")
@APIResponse(responseCode = "404", description = "Promotion non trouvée")
public Response updatePromotion(
@Context ContainerRequestContext requestContext,
@PathParam("id") UUID promotionId,
@Valid PromotionUpdateRequestDTO requestDTO) {
UUID authenticatedUserId = getAuthenticatedUserId(requestContext);
UUID authenticatedUserId = securityService.getCurrentUserId();
LOG.info("[LOG] Mise à jour de la promotion : " + promotionId + " par l'utilisateur : " + authenticatedUserId);
try {
@@ -321,7 +324,8 @@ public class PromotionResource {
@DELETE
@Path("/{id}")
@Transactional
@RequiresAuth
@RolesAllowed({UserRoles.OWNER, UserRoles.MANAGER, UserRoles.ADMIN, UserRoles.SUPER_ADMIN})
@RequiresPermission(Permission.PROMOTIONS_DELETE_OWN)
@Operation(
summary = "Supprimer une promotion",
description = "Supprime une promotion. Seul le responsable peut supprimer.")
@@ -330,10 +334,8 @@ public class PromotionResource {
@APIResponse(responseCode = "401", description = "Non authentifié")
@APIResponse(responseCode = "403", description = "Non autorisé à supprimer cette promotion")
@APIResponse(responseCode = "404", description = "Promotion non trouvée")
public Response deletePromotion(
@Context ContainerRequestContext requestContext,
@PathParam("id") UUID promotionId) {
UUID authenticatedUserId = getAuthenticatedUserId(requestContext);
public Response deletePromotion(@PathParam("id") UUID promotionId) {
UUID authenticatedUserId = securityService.getCurrentUserId();
LOG.info("[LOG] Suppression de la promotion : " + promotionId + " par l'utilisateur : " + authenticatedUserId);
try {
@@ -379,7 +381,8 @@ public class PromotionResource {
@PATCH
@Path("/{id}/active")
@Transactional
@RequiresAuth
@RolesAllowed({UserRoles.OWNER, UserRoles.MANAGER, UserRoles.ADMIN, UserRoles.SUPER_ADMIN})
@RequiresPermission(Permission.PROMOTIONS_UPDATE_OWN)
@Operation(
summary = "Activer/Désactiver une promotion",
description = "Change l'état actif d'une promotion. Seul le responsable peut modifier.")
@@ -389,10 +392,9 @@ public class PromotionResource {
@APIResponse(responseCode = "403", description = "Non autorisé")
@APIResponse(responseCode = "404", description = "Promotion non trouvée")
public Response setPromotionActive(
@Context ContainerRequestContext requestContext,
@PathParam("id") UUID promotionId,
@QueryParam("active") @DefaultValue("true") boolean isActive) {
UUID authenticatedUserId = getAuthenticatedUserId(requestContext);
UUID authenticatedUserId = securityService.getCurrentUserId();
LOG.info("[LOG] Changement d'état de la promotion " + promotionId + " à " + isActive);
try {