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:
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user