feat: migration complète vers WebSockets Next + Kafka pour temps réel

- Migration de Jakarta WebSocket vers Quarkus WebSockets Next
- Implémentation de l'architecture Kafka pour événements temps réel
- Ajout des DTOs d'événements (NotificationEvent, ChatMessageEvent, ReactionEvent, PresenceEvent)
- Création des bridges Kafka → WebSocket (NotificationKafkaBridge, ChatKafkaBridge, ReactionKafkaBridge)
- Mise à jour des services pour publier dans Kafka au lieu d'appeler directement WebSocket
- Suppression des classes obsolètes (ChatWebSocket, NotificationWebSocket)
- Correction de l'injection des paramètres path dans WebSockets Next (utilisation de connection.pathParam)
- Ajout des migrations DB pour bookings, promotions, business hours, amenities, reviews
- Mise à jour de la configuration application.properties pour Kafka et WebSockets Next
- Mise à jour .gitignore pour ignorer les fichiers de logs
This commit is contained in:
dahoud
2026-01-21 13:46:16 +00:00
parent 7dd0969799
commit 93c63fd600
78 changed files with 5019 additions and 1113 deletions

View File

@@ -1,11 +1,13 @@
package com.lions.dev.resource;
import com.lions.dev.dto.request.establishment.EstablishmentMediaRequestDTO;
import com.lions.dev.dto.response.establishment.EstablishmentMediaResponseDTO;
import com.lions.dev.entity.establishment.EstablishmentMedia;
import com.lions.dev.entity.establishment.MediaType;
import com.lions.dev.service.EstablishmentMediaService;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.Response;
import org.eclipse.microprofile.openapi.annotations.Operation;
@@ -62,6 +64,7 @@ public class EstablishmentMediaResource {
/**
* Upload un nouveau média pour un établissement.
* Accepte un body JSON avec les informations du média.
*/
@POST
@Transactional
@@ -69,36 +72,56 @@ public class EstablishmentMediaResource {
description = "Upload un nouveau média (photo ou vidéo) pour un établissement")
public Response uploadMedia(
@PathParam("establishmentId") String establishmentId,
@QueryParam("mediaUrl") String mediaUrl,
@QueryParam("mediaType") String mediaTypeStr,
@QueryParam("uploadedByUserId") String uploadedByUserIdStr,
@QueryParam("thumbnailUrl") String thumbnailUrl) {
@Valid EstablishmentMediaRequestDTO requestDTO,
@QueryParam("uploadedByUserId") String uploadedByUserIdStr) {
LOG.info("Upload d'un média pour l'établissement : " + establishmentId);
try {
UUID id = UUID.fromString(establishmentId);
UUID uploadedByUserId = UUID.fromString(uploadedByUserIdStr);
// Utiliser uploadedByUserId du query param ou du DTO
String userIdStr = uploadedByUserIdStr != null && !uploadedByUserIdStr.isEmpty()
? uploadedByUserIdStr
: requestDTO.getUploadedByUserId();
if (userIdStr == null || userIdStr.isEmpty()) {
LOG.error("uploadedByUserId est obligatoire");
return Response.status(Response.Status.BAD_REQUEST)
.entity("L'ID de l'utilisateur (uploadedByUserId) est obligatoire")
.build();
}
UUID uploadedByUserId = UUID.fromString(userIdStr);
// Valider le type de média
MediaType mediaType;
try {
mediaType = MediaType.valueOf(mediaTypeStr.toUpperCase());
mediaType = MediaType.valueOf(requestDTO.getMediaType().toUpperCase());
} catch (IllegalArgumentException e) {
return Response.status(Response.Status.BAD_REQUEST)
.entity("Type de média invalide. Utilisez PHOTO ou VIDEO")
.build();
}
EstablishmentMedia media = mediaService.uploadMedia(id, mediaUrl, mediaType, uploadedByUserId, thumbnailUrl);
// Appeler le service avec displayOrder
EstablishmentMedia media = mediaService.uploadMedia(
id,
requestDTO.getMediaUrl(),
mediaType,
uploadedByUserId,
requestDTO.getThumbnailUrl(),
requestDTO.getDisplayOrder() != null ? requestDTO.getDisplayOrder() : 0
);
EstablishmentMediaResponseDTO responseDTO = new EstablishmentMediaResponseDTO(media);
return Response.status(Response.Status.CREATED).entity(responseDTO).build();
} catch (IllegalArgumentException e) {
LOG.error("Paramètres invalides : " + e.getMessage());
LOG.error("Paramètres invalides : " + e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST)
.entity("Paramètres invalides : " + e.getMessage())
.build();
} catch (RuntimeException e) {
LOG.error("Erreur lors de l'upload du média : " + e.getMessage());
LOG.error("Erreur lors de l'upload du média : " + e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST)
.entity(e.getMessage())
.build();

View File

@@ -109,46 +109,9 @@ public class EstablishmentRatingResource {
}
}
/**
* Récupère la note d'un utilisateur pour un établissement.
*/
@GET
@Path("/users/{userId}")
@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")
public Response getUserRating(
@PathParam("establishmentId") String establishmentId,
@PathParam("userId") String userIdStr) {
LOG.info("Récupération de la note de l'utilisateur " + userIdStr + " pour l'établissement " + establishmentId);
try {
UUID id = UUID.fromString(establishmentId);
UUID userId = UUID.fromString(userIdStr);
EstablishmentRating rating = ratingService.getUserRating(id, userId);
if (rating == null) {
return Response.status(Response.Status.NOT_FOUND)
.entity("Note non trouvée")
.build();
}
EstablishmentRatingResponseDTO responseDTO = new EstablishmentRatingResponseDTO(rating);
return Response.ok(responseDTO).build();
} catch (IllegalArgumentException e) {
LOG.error("ID invalide : " + e.getMessage());
return Response.status(Response.Status.BAD_REQUEST)
.entity("ID invalide : " + e.getMessage())
.build();
} catch (Exception e) {
LOG.error("Erreur inattendue lors de la récupération de la note", e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("Erreur lors de la récupération de la note")
.build();
}
}
/**
* 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.
*/
@GET
@Path("/stats")
@@ -179,5 +142,92 @@ public class EstablishmentRatingResource {
.build();
}
}
/**
* Récupère la note d'un utilisateur pour un établissement (via path parameter).
* Endpoint alternatif pour compatibilité.
*/
@GET
@Path("/users/{userId}")
@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(
@PathParam("establishmentId") String establishmentId,
@PathParam("userId") String userIdStr) {
LOG.info("Récupération de la note de l'utilisateur " + userIdStr + " pour l'établissement " + establishmentId);
try {
UUID id = UUID.fromString(establishmentId);
UUID userId = UUID.fromString(userIdStr);
EstablishmentRating rating = ratingService.getUserRating(id, userId);
if (rating == null) {
return Response.status(Response.Status.NOT_FOUND)
.entity("Note non trouvée")
.build();
}
EstablishmentRatingResponseDTO responseDTO = new EstablishmentRatingResponseDTO(rating);
return Response.ok(responseDTO).build();
} catch (IllegalArgumentException e) {
LOG.error("ID invalide : " + e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST)
.entity("ID invalide : " + e.getMessage())
.build();
} catch (Exception e) {
LOG.error("Erreur inattendue lors de la récupération de la note", e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("Erreur lors de la récupération de la note")
.build();
}
}
/**
* 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.
*/
@GET
@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(
@PathParam("establishmentId") String establishmentId,
@QueryParam("userId") String userIdStr) {
LOG.info("Récupération de la note de l'utilisateur " + userIdStr + " pour l'établissement " + establishmentId);
// Si userId n'est pas fourni, retourner une erreur
if (userIdStr == null || userIdStr.isEmpty()) {
LOG.warn("userId manquant dans la requête");
return Response.status(Response.Status.BAD_REQUEST)
.entity("Le paramètre userId est requis")
.build();
}
try {
UUID id = UUID.fromString(establishmentId);
UUID userId = UUID.fromString(userIdStr);
EstablishmentRating rating = ratingService.getUserRating(id, userId);
if (rating == null) {
// Retourner 404 si la note n'existe pas
return Response.status(Response.Status.NOT_FOUND)
.entity("Note non trouvée")
.build();
}
EstablishmentRatingResponseDTO responseDTO = new EstablishmentRatingResponseDTO(rating);
return Response.ok(responseDTO).build();
} catch (IllegalArgumentException e) {
LOG.error("ID invalide : " + e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST)
.entity("ID invalide : " + e.getMessage())
.build();
} catch (Exception e) {
LOG.error("Erreur inattendue lors de la récupération de la note", e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("Erreur lors de la récupération de la note")
.build();
}
}
}

View File

@@ -76,14 +76,8 @@ public class EstablishmentResource {
establishment.setPostalCode(requestDTO.getPostalCode());
establishment.setDescription(requestDTO.getDescription());
establishment.setPhoneNumber(requestDTO.getPhoneNumber());
establishment.setEmail(requestDTO.getEmail());
establishment.setWebsite(requestDTO.getWebsite());
establishment.setImageUrl(requestDTO.getImageUrl());
establishment.setRating(requestDTO.getRating());
establishment.setPriceRange(requestDTO.getPriceRange());
establishment.setCapacity(requestDTO.getCapacity());
establishment.setAmenities(requestDTO.getAmenities());
establishment.setOpeningHours(requestDTO.getOpeningHours());
establishment.setLatitude(requestDTO.getLatitude());
establishment.setLongitude(requestDTO.getLongitude());
@@ -245,14 +239,8 @@ public class EstablishmentResource {
establishment.setPostalCode(requestDTO.getPostalCode());
establishment.setDescription(requestDTO.getDescription());
establishment.setPhoneNumber(requestDTO.getPhoneNumber());
establishment.setEmail(requestDTO.getEmail());
establishment.setWebsite(requestDTO.getWebsite());
establishment.setImageUrl(requestDTO.getImageUrl());
establishment.setRating(requestDTO.getRating());
establishment.setPriceRange(requestDTO.getPriceRange());
establishment.setCapacity(requestDTO.getCapacity());
establishment.setAmenities(requestDTO.getAmenities());
establishment.setOpeningHours(requestDTO.getOpeningHours());
establishment.setLatitude(requestDTO.getLatitude());
establishment.setLongitude(requestDTO.getLongitude());

View File

@@ -229,10 +229,12 @@ public class EventsResource {
@Path("/created-by-user-and-friends")
@Consumes("application/json")
@Produces("application/json")
@Operation(summary = "Récupérer les événements créés par un utilisateur et ses amis", description = "Retourne la liste des événements créés par un utilisateur spécifique et ses amis")
@Operation(summary = "Récupérer les événements créés par un utilisateur et ses amis", description = "Retourne la liste paginée des événements créés par un utilisateur spécifique et ses amis")
public Response getEventsCreatedByUserAndFriends(EventReadManyByIdRequestDTO requestDTO) {
UUID userId = requestDTO.getUserId();
LOG.info("[LOG] Récupération des événements pour l'utilisateur avec l'ID : " + userId + " et ses amis");
UUID userId = requestDTO.getId();
int page = requestDTO.getPage() != null ? requestDTO.getPage() : 0;
int size = requestDTO.getSize() != null ? requestDTO.getSize() : 10;
LOG.info("[LOG] Récupération des événements pour l'utilisateur avec l'ID : " + userId + " et ses amis (page: " + page + ", size: " + size + ")");
Users user = usersRepository.findById(userId);
if (user == null) {
LOG.warn("[LOG] Utilisateur non trouvé avec l'ID : " + userId);
@@ -247,8 +249,10 @@ public class EventsResource {
LOG.info("[LOG] IDs d'amis + utilisateur (taille: " + friendIds.size() + ") : " + friendIds);
// Rechercher les événements créés par l'utilisateur et ses amis
List<Events> events = eventsRepository.find("creator.id IN ?1", friendIds).list();
// Rechercher les événements créés par l'utilisateur et ses amis avec pagination
List<Events> events = eventsRepository.find("creator.id IN ?1 ORDER BY startDate DESC", friendIds)
.page(page, size)
.list();
LOG.info("[LOG] Nombre d'événements récupérés dans la requête : " + events.size());
// ✅ Retourner avec reactionsCount et isFavorite pour l'utilisateur actuel
@@ -443,14 +447,17 @@ public class EventsResource {
@Operation(
summary = "Récupérer les événements auxquels un utilisateur est inscrit",
description = "Retourne la liste des événements auxquels un utilisateur spécifique est inscrit")
public Response getEventsByUser(@PathParam("userId") UUID userId) {
LOG.info("[LOG] Récupération des événements pour l'utilisateur avec l'ID : " + userId);
public Response getEventsByUser(
@PathParam("userId") UUID userId,
@QueryParam("page") @DefaultValue("0") int page,
@QueryParam("size") @DefaultValue("10") int size) {
LOG.info("[LOG] Récupération des événements pour l'utilisateur avec l'ID : " + userId + " (page: " + page + ", size: " + size + ")");
Users user = usersRepository.findById(userId);
if (user == null) {
LOG.warn("[LOG] Utilisateur non trouvé avec l'ID : " + userId);
return Response.status(Response.Status.NOT_FOUND).entity("Utilisateur non trouvé.").build();
}
List<Events> events = eventService.findEventsByUser(user);
List<Events> events = eventService.findEventsByUser(user, page, size);
if (events.isEmpty()) {
LOG.warn("[LOG] Aucun événement trouvé pour l'utilisateur avec l'ID : " + userId);
return Response.status(Response.Status.NOT_FOUND).entity("Aucun événement trouvé.").build();
@@ -1011,7 +1018,7 @@ public class EventsResource {
public Response getEventsByFriends(
@PathParam("userId") UUID userId,
@QueryParam("page") @DefaultValue("0") int page,
@QueryParam("size") @DefaultValue("20") int size) {
@QueryParam("size") @DefaultValue("10") int size) {
LOG.info("[LOG] Récupération des événements des amis pour l'utilisateur ID : " + userId);
try {

View File

@@ -91,6 +91,7 @@ public class FileUploadResource {
// Construire la réponse JSON
Map<String, Object> response = new HashMap<>();
response.put("url", fileUrl);
response.put("fileName", finalFileName); // ✅ Ajout du fileName dans la réponse (DRY/WOU)
if (thumbnailUrl != null) {
response.put("thumbnailUrl", thumbnailUrl);
}
@@ -105,7 +106,7 @@ public class FileUploadResource {
}
}
LOG.infof("Upload réussi, URL: %s", fileUrl);
LOG.infof("Upload réussi, URL: %s, FileName: %s", fileUrl, finalFileName);
return Response.status(Response.Status.CREATED)
.entity(response)

View File

@@ -80,7 +80,7 @@ public class NotificationResource {
public Response getNotificationsByUserIdWithPagination(
@PathParam("userId") UUID userId,
@QueryParam("page") @DefaultValue("0") int page,
@QueryParam("size") @DefaultValue("20") int size) {
@QueryParam("size") @DefaultValue("10") int size) {
LOG.info("[LOG] Récupération paginée des notifications pour l'utilisateur ID : " + userId);
try {

View File

@@ -11,6 +11,7 @@ import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import org.eclipse.microprofile.openapi.annotations.Operation;
@@ -49,7 +50,7 @@ public class SocialPostResource {
description = "Retourne une liste paginée de tous les posts sociaux, triés par date de création décroissante")
public Response getAllPosts(
@QueryParam("page") @DefaultValue("0") int page,
@QueryParam("size") @DefaultValue("20") int size) {
@QueryParam("size") @DefaultValue("10") int size) {
LOG.info("[LOG] Récupération de tous les posts (page: " + page + ", size: " + size + ")");
try {
@@ -110,12 +111,12 @@ public class SocialPostResource {
summary = "Créer un nouveau post",
description = "Crée un nouveau post social et retourne ses détails")
public Response createPost(@Valid SocialPostCreateRequestDTO requestDTO) {
LOG.info("[LOG] Création d'un nouveau post par l'utilisateur ID : " + requestDTO.getUserId());
LOG.info("[LOG] Création d'un nouveau post par l'utilisateur ID : " + requestDTO.getCreatorId());
try {
SocialPost post = socialPostService.createPost(
requestDTO.getContent(),
requestDTO.getUserId(),
requestDTO.getCreatorId(),
requestDTO.getImageUrl()
);
SocialPostResponseDTO responseDTO = new SocialPostResponseDTO(post);
@@ -244,11 +245,19 @@ public class SocialPostResource {
@Operation(
summary = "Liker un post",
description = "Incrémente le compteur de likes d'un post")
public Response likePost(@PathParam("id") UUID postId) {
LOG.info("[LOG] Like du post ID : " + postId);
public Response likePost(
@PathParam("id") UUID postId,
@QueryParam("userId") UUID userId) {
LOG.info("[LOG] Like du post ID : " + postId + " par utilisateur : " + userId);
if (userId == null) {
return Response.status(Response.Status.BAD_REQUEST)
.entity("{\"message\": \"userId est requis.\"}")
.build();
}
try {
SocialPost post = socialPostService.likePost(postId);
SocialPost post = socialPostService.likePost(postId, userId);
SocialPostResponseDTO responseDTO = new SocialPostResponseDTO(post);
return Response.ok(responseDTO).build();
} catch (IllegalArgumentException e) {
@@ -273,14 +282,30 @@ public class SocialPostResource {
@POST
@Path("/{id}/comment")
@Transactional
@Consumes(MediaType.APPLICATION_JSON)
@Operation(
summary = "Commenter un post",
description = "Incrémente le compteur de commentaires d'un post")
public Response addComment(@PathParam("id") UUID postId) {
LOG.info("[LOG] Ajout de commentaire au post ID : " + postId);
description = "Ajoute un commentaire à un post")
public Response addComment(
@PathParam("id") UUID postId,
@QueryParam("userId") UUID userId,
String requestBody) {
LOG.info("[LOG] Ajout de commentaire au post ID : " + postId + " par utilisateur : " + userId);
if (userId == null) {
return Response.status(Response.Status.BAD_REQUEST)
.entity("{\"message\": \"userId est requis.\"}")
.build();
}
try {
SocialPost post = socialPostService.addComment(postId);
// Parser le body pour obtenir le contenu du commentaire
com.fasterxml.jackson.databind.ObjectMapper mapper =
new com.fasterxml.jackson.databind.ObjectMapper();
Map<String, Object> body = mapper.readValue(requestBody, Map.class);
String commentContent = (String) body.getOrDefault("content", "");
SocialPost post = socialPostService.addComment(postId, userId, commentContent);
SocialPostResponseDTO responseDTO = new SocialPostResponseDTO(post);
return Response.ok(responseDTO).build();
} catch (IllegalArgumentException e) {
@@ -308,11 +333,19 @@ public class SocialPostResource {
@Operation(
summary = "Partager un post",
description = "Incrémente le compteur de partages d'un post")
public Response sharePost(@PathParam("id") UUID postId) {
LOG.info("[LOG] Partage du post ID : " + postId);
public Response sharePost(
@PathParam("id") UUID postId,
@QueryParam("userId") UUID userId) {
LOG.info("[LOG] Partage du post ID : " + postId + " par utilisateur : " + userId);
if (userId == null) {
return Response.status(Response.Status.BAD_REQUEST)
.entity("{\"message\": \"userId est requis.\"}")
.build();
}
try {
SocialPost post = socialPostService.sharePost(postId);
SocialPost post = socialPostService.sharePost(postId, userId);
SocialPostResponseDTO responseDTO = new SocialPostResponseDTO(post);
return Response.ok(responseDTO).build();
} catch (IllegalArgumentException e) {
@@ -373,7 +406,7 @@ public class SocialPostResource {
public Response getPostsByFriends(
@PathParam("userId") UUID userId,
@QueryParam("page") @DefaultValue("0") int page,
@QueryParam("size") @DefaultValue("20") int size) {
@QueryParam("size") @DefaultValue("10") int size) {
LOG.info("[LOG] Récupération des posts des amis pour l'utilisateur ID : " + userId);
try {

View File

@@ -45,12 +45,15 @@ public class StoryResource {
@GET
@Operation(
summary = "Récupérer toutes les stories actives",
description = "Retourne une liste de toutes les stories actives (non expirées), triées par date de création décroissante")
public Response getAllActiveStories(@QueryParam("viewerId") UUID viewerId) {
LOG.info("[LOG] Récupération de toutes les stories actives");
description = "Retourne une liste paginée de toutes les stories actives (non expirées), triées par date de création décroissante")
public Response getAllActiveStories(
@QueryParam("viewerId") UUID viewerId,
@QueryParam("page") @DefaultValue("0") int page,
@QueryParam("size") @DefaultValue("10") int size) {
LOG.info("[LOG] Récupération de toutes les stories actives (page: " + page + ", size: " + size + ")");
try {
List<Story> stories = storyService.getAllActiveStories();
List<Story> stories = storyService.getAllActiveStories(page, size);
List<StoryResponseDTO> responseDTOs = stories.stream()
.map(story -> viewerId != null ? new StoryResponseDTO(story, viewerId) : new StoryResponseDTO(story))
.collect(Collectors.toList());
@@ -109,12 +112,16 @@ public class StoryResource {
@Path("/user/{userId}")
@Operation(
summary = "Récupérer les stories d'un utilisateur",
description = "Retourne toutes les stories actives d'un utilisateur spécifique")
public Response getStoriesByUserId(@PathParam("userId") UUID userId, @QueryParam("viewerId") UUID viewerId) {
LOG.info("[LOG] Récupération des stories pour l'utilisateur ID : " + userId);
description = "Retourne une liste paginée des stories actives d'un utilisateur spécifique")
public Response getStoriesByUserId(
@PathParam("userId") UUID userId,
@QueryParam("viewerId") UUID viewerId,
@QueryParam("page") @DefaultValue("0") int page,
@QueryParam("size") @DefaultValue("10") int size) {
LOG.info("[LOG] Récupération des stories pour l'utilisateur ID : " + userId + " (page: " + page + ", size: " + size + ")");
try {
List<Story> stories = storyService.getActiveStoriesByUserId(userId);
List<Story> stories = storyService.getActiveStoriesByUserId(userId, page, size);
List<StoryResponseDTO> responseDTOs = stories.stream()
.map(story -> viewerId != null ? new StoryResponseDTO(story, viewerId) : new StoryResponseDTO(story))
.collect(Collectors.toList());
@@ -140,11 +147,11 @@ public class StoryResource {
summary = "Créer une nouvelle story",
description = "Crée une nouvelle story et retourne ses détails")
public Response createStory(@Valid StoryCreateRequestDTO requestDTO) {
LOG.info("[LOG] Création d'une nouvelle story par l'utilisateur ID : " + requestDTO.getUserId());
LOG.info("[LOG] Création d'une nouvelle story par l'utilisateur ID : " + requestDTO.getCreatorId());
try {
Story story = storyService.createStory(
requestDTO.getUserId(),
requestDTO.getCreatorId(),
requestDTO.getMediaType(),
requestDTO.getMediaUrl(),
requestDTO.getThumbnailUrl(),

View File

@@ -60,7 +60,7 @@ public class UsersResource {
}
/**
* Endpoint pour authentifier un utilisateur.
* Endpoint pour authentifier un utilisateur (v2.0).
*
* @param userAuthenticateRequestDTO Le DTO contenant les informations d'authentification.
* @return Une réponse HTTP indiquant si l'authentification a réussi ou échoué.
@@ -73,10 +73,18 @@ public class UsersResource {
public Response authenticateUser(@Valid @NotNull UserAuthenticateRequestDTO userAuthenticateRequestDTO) {
LOG.info("Tentative d'authentification pour l'utilisateur avec l'email : " + userAuthenticateRequestDTO.getEmail());
Users user = userService.authenticateUser(userAuthenticateRequestDTO.getEmail(), userAuthenticateRequestDTO.getMotDePasse());
// v2.0 - Utiliser getPassword() qui gère la compatibilité v1.0 et v2.0
Users user = userService.authenticateUser(userAuthenticateRequestDTO.getEmail(), userAuthenticateRequestDTO.getPassword());
LOG.info("Authentification réussie pour l'utilisateur : " + user.getEmail());
UserAuthenticateResponseDTO responseDTO = new UserAuthenticateResponseDTO(user.getId(), user.getPrenoms(), user.getNom(), user.getEmail(), user.getRole());
// v2.0 - Utiliser les nouveaux noms de champs
UserAuthenticateResponseDTO responseDTO = new UserAuthenticateResponseDTO(
user.getId(),
user.getFirstName(), // v2.0
user.getLastName(), // v2.0
user.getEmail(),
user.getRole()
);
responseDTO.logResponseDetails();
return Response.ok(responseDTO).build();
}