Refactoring
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user