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.establishment.EstablishmentRatingRequestDTO;
|
||||
import com.lions.dev.dto.response.establishment.EstablishmentRatingResponseDTO;
|
||||
import com.lions.dev.dto.response.establishment.EstablishmentRatingStatsResponseDTO;
|
||||
import com.lions.dev.entity.establishment.EstablishmentRating;
|
||||
import com.lions.dev.security.Permission;
|
||||
import com.lions.dev.security.RequiresPermission;
|
||||
import com.lions.dev.service.EstablishmentRatingService;
|
||||
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;
|
||||
@@ -26,7 +28,10 @@ import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Ressource REST pour la gestion des notations d'établissements.
|
||||
* Cette classe expose des endpoints pour soumettre, modifier et récupérer les notes.
|
||||
*
|
||||
* SÉCURITÉ : Les lectures sont publiques, les écritures requièrent une authentification.
|
||||
*
|
||||
* @since 2.0 - Sécurité JWT + RBAC production-ready
|
||||
*/
|
||||
@Path("/establishments/{establishmentId}/ratings")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@@ -37,14 +42,10 @@ public class EstablishmentRatingResource {
|
||||
@Inject
|
||||
EstablishmentRatingService ratingService;
|
||||
|
||||
private static final Logger LOG = Logger.getLogger(EstablishmentRatingResource.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(EstablishmentRatingResource.class);
|
||||
|
||||
/**
|
||||
* Soumet une nouvelle note pour un établissement.
|
||||
@@ -52,7 +53,8 @@ public class EstablishmentRatingResource {
|
||||
*/
|
||||
@POST
|
||||
@Transactional
|
||||
@RequiresAuth
|
||||
@RolesAllowed({UserRoles.USER, UserRoles.OWNER, UserRoles.MANAGER, UserRoles.ADMIN, UserRoles.SUPER_ADMIN})
|
||||
@RequiresPermission(Permission.REVIEWS_CREATE)
|
||||
@Operation(summary = "Soumettre une note pour un établissement",
|
||||
description = "Soumet une nouvelle note (1 à 5 étoiles) pour un établissement. Requiert une authentification JWT.")
|
||||
@SecurityRequirement(name = "bearerAuth")
|
||||
@@ -60,10 +62,9 @@ public class EstablishmentRatingResource {
|
||||
@APIResponse(responseCode = "401", description = "Non authentifié")
|
||||
@APIResponse(responseCode = "400", description = "Données invalides")
|
||||
public Response submitRating(
|
||||
@Context ContainerRequestContext requestContext,
|
||||
@PathParam("establishmentId") String establishmentId,
|
||||
@Valid EstablishmentRatingRequestDTO requestDTO) {
|
||||
UUID authenticatedUserId = getAuthenticatedUserId(requestContext);
|
||||
UUID authenticatedUserId = securityService.getCurrentUserId();
|
||||
LOG.info("Soumission d'une note pour l'établissement " + establishmentId + " par l'utilisateur " + authenticatedUserId);
|
||||
|
||||
try {
|
||||
@@ -96,7 +97,8 @@ public class EstablishmentRatingResource {
|
||||
*/
|
||||
@PUT
|
||||
@Transactional
|
||||
@RequiresAuth
|
||||
@RolesAllowed({UserRoles.USER, UserRoles.OWNER, UserRoles.MANAGER, UserRoles.ADMIN, UserRoles.SUPER_ADMIN})
|
||||
@RequiresPermission(Permission.REVIEWS_UPDATE_OWN)
|
||||
@Operation(summary = "Modifier une note existante",
|
||||
description = "Met à jour une note existante pour un établissement. Requiert une authentification JWT.")
|
||||
@SecurityRequirement(name = "bearerAuth")
|
||||
@@ -104,10 +106,9 @@ public class EstablishmentRatingResource {
|
||||
@APIResponse(responseCode = "401", description = "Non authentifié")
|
||||
@APIResponse(responseCode = "404", description = "Note non trouvée")
|
||||
public Response updateRating(
|
||||
@Context ContainerRequestContext requestContext,
|
||||
@PathParam("establishmentId") String establishmentId,
|
||||
@Valid EstablishmentRatingRequestDTO requestDTO) {
|
||||
UUID authenticatedUserId = getAuthenticatedUserId(requestContext);
|
||||
UUID authenticatedUserId = securityService.getCurrentUserId();
|
||||
LOG.info("Mise à jour de la note pour l'établissement " + establishmentId + " par l'utilisateur " + authenticatedUserId);
|
||||
|
||||
try {
|
||||
@@ -136,10 +137,11 @@ public class EstablishmentRatingResource {
|
||||
|
||||
/**
|
||||
* Récupère les statistiques de notation d'un établissement.
|
||||
* Doit être déclaré avant les endpoints génériques GET pour la résolution correcte par JAX-RS.
|
||||
* Endpoint public.
|
||||
*/
|
||||
@GET
|
||||
@Path("/stats")
|
||||
@PermitAll
|
||||
@Operation(summary = "Récupérer les statistiques de notation",
|
||||
description = "Récupère les statistiques de notation d'un établissement (moyenne, total, distribution)")
|
||||
public Response getRatingStats(@PathParam("establishmentId") String establishmentId) {
|
||||
@@ -170,10 +172,11 @@ public class EstablishmentRatingResource {
|
||||
|
||||
/**
|
||||
* Récupère la note d'un utilisateur pour un établissement (via path parameter).
|
||||
* Endpoint alternatif pour compatibilité.
|
||||
* Endpoint public.
|
||||
*/
|
||||
@GET
|
||||
@Path("/users/{userId}")
|
||||
@PermitAll
|
||||
@Operation(summary = "Récupérer la note d'un utilisateur (path parameter)",
|
||||
description = "Récupère la note donnée par un utilisateur spécifique pour un établissement (via path parameter)")
|
||||
public Response getUserRatingByPath(
|
||||
@@ -209,10 +212,10 @@ public class EstablishmentRatingResource {
|
||||
|
||||
/**
|
||||
* Récupère la note d'un utilisateur pour un établissement (via query parameter).
|
||||
* Endpoint utilisé par le frontend Flutter.
|
||||
* Doit être déclaré en dernier car c'est l'endpoint le plus générique.
|
||||
* Endpoint public.
|
||||
*/
|
||||
@GET
|
||||
@PermitAll
|
||||
@Operation(summary = "Récupérer la note d'un utilisateur",
|
||||
description = "Récupère la note donnée par un utilisateur spécifique pour un établissement (via query parameter userId)")
|
||||
public Response getUserRatingByQuery(
|
||||
|
||||
Reference in New Issue
Block a user