From 4d6a5630fc9e8af4ed990b43a21e9af64b24a196 Mon Sep 17 00:00:00 2001 From: dahoud Date: Wed, 7 Jan 2026 16:33:14 +0000 Subject: [PATCH] =?UTF-8?q?feat(backend):=20S=C3=A9parer=20les=20demandes?= =?UTF-8?q?=20d'amiti=C3=A9=20envoy=C3=A9es=20et=20re=C3=A7ues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ajout de méthodes dans FriendshipRepository pour récupérer séparément les demandes envoyées (findSentRequestsByUser) et reçues (findReceivedRequestsByUser) - Ajout de méthodes dans FriendshipService pour lister les demandes envoyées (listSentFriendRequests) et reçues (listReceivedFriendRequests) - Ajout de deux nouveaux endpoints REST: - GET /friends/sent/{userId} : récupère les demandes envoyées par un utilisateur - GET /friends/received/{userId} : récupère les demandes reçues par un utilisateur - Permet une meilleure séparation logique entre les demandes que l'utilisateur a envoyées et celles qu'il a reçues --- .../docker-compose.yml => docker-compose.yml | 30 ++-- .../dev/repository/FriendshipRepository.java | 40 +++++ .../dev/resource/FriendshipResource.java | 141 ++++++++++++++++++ .../lions/dev/service/FriendshipService.java | 42 ++++++ 4 files changed, 235 insertions(+), 18 deletions(-) rename src/main/docker/docker-compose.yml => docker-compose.yml (60%) diff --git a/src/main/docker/docker-compose.yml b/docker-compose.yml similarity index 60% rename from src/main/docker/docker-compose.yml rename to docker-compose.yml index 200b4ae..7efb6e1 100644 --- a/src/main/docker/docker-compose.yml +++ b/docker-compose.yml @@ -1,33 +1,26 @@ -version: '3.8' - services: - # Service pour la base de données PostgreSQL db: image: postgres:13 container_name: afterwork_db environment: - POSTGRES_USER: ${DB_USERNAME} - POSTGRES_PASSWORD: ${DB_PASSWORD} - POSTGRES_DB: ${DB_NAME} - ports: - - "5432:5432" + POSTGRES_USER: "${DB_USERNAME}" + POSTGRES_PASSWORD: "${DB_PASSWORD}" + POSTGRES_DB: "${DB_NAME}" networks: - afterwork-network volumes: - db_data:/var/lib/postgresql/data + restart: unless-stopped - # Service pour l'application Quarkus app: - build: - context: . - dockerfile: src/main/docker/Dockerfile.jvm + image: dahoudg/gbane/afterwork-quarkus:latest container_name: afterwork-quarkus environment: - DB_USERNAME: ${DB_USERNAME} - DB_PASSWORD: ${DB_PASSWORD} - DB_HOST: db - DB_PORT: 5432 - DB_NAME: ${DB_NAME} + DB_USERNAME: "${DB_USERNAME}" + DB_PASSWORD: "${DB_PASSWORD}" + DB_HOST: "${DB_HOST}" + DB_PORT: "${DB_PORT}" + DB_NAME: "${DB_NAME}" JAVA_OPTS_APPEND: "-Dquarkus.http.host=0.0.0.0" ports: - "8080:8080" @@ -35,8 +28,8 @@ services: - db networks: - afterwork-network + restart: unless-stopped - # Service pour Swagger UI swagger-ui: image: swaggerapi/swagger-ui container_name: afterwork-swagger-ui @@ -48,6 +41,7 @@ services: - app networks: - afterwork-network + restart: unless-stopped networks: afterwork-network: diff --git a/src/main/java/com/lions/dev/repository/FriendshipRepository.java b/src/main/java/com/lions/dev/repository/FriendshipRepository.java index 7f24780..c5df74e 100644 --- a/src/main/java/com/lions/dev/repository/FriendshipRepository.java +++ b/src/main/java/com/lions/dev/repository/FriendshipRepository.java @@ -95,4 +95,44 @@ public class FriendshipRepository implements PanacheRepositoryBase findSentRequestsByUser(Users user, FriendshipStatus status, int page, int size) { + logger.infof("Récupération des demandes d'amitié envoyées par l'utilisateur %s avec le statut %s, page %d, taille %d", user.getId(), status, page, size); + + List friendships = find("user = ?1 AND status = ?2", user, status) + .page(page, size) + .list(); + + logger.infof("Nombre de demandes envoyées récupérées pour l'utilisateur %s : %d", user.getId(), friendships.size()); + return friendships; + } + + /** + * Récupérer les demandes d'amitié reçues par un utilisateur (où l'utilisateur est le destinataire). + * + * @param user L'utilisateur qui a reçu les demandes. + * @param status Le statut des relations d'amitié à filtrer (PENDING, etc.). + * @param page Le numéro de la page à récupérer. + * @param size La taille de la page (nombre d'éléments). + * @return Une liste paginée de relations d'amitié reçues. + */ + public List findReceivedRequestsByUser(Users user, FriendshipStatus status, int page, int size) { + logger.infof("Récupération des demandes d'amitié reçues par l'utilisateur %s avec le statut %s, page %d, taille %d", user.getId(), status, page, size); + + List friendships = find("friend = ?1 AND status = ?2", user, status) + .page(page, size) + .list(); + + logger.infof("Nombre de demandes reçues récupérées pour l'utilisateur %s : %d", user.getId(), friendships.size()); + return friendships; + } } diff --git a/src/main/java/com/lions/dev/resource/FriendshipResource.java b/src/main/java/com/lions/dev/resource/FriendshipResource.java index 6e89765..1e837a3 100644 --- a/src/main/java/com/lions/dev/resource/FriendshipResource.java +++ b/src/main/java/com/lions/dev/resource/FriendshipResource.java @@ -6,6 +6,7 @@ import com.lions.dev.dto.request.friends.FriendshipReadStatusRequestDTO; import com.lions.dev.dto.response.friends.FriendshipCreateOneResponseDTO; import com.lions.dev.dto.response.friends.FriendshipReadFriendDetailsResponseDTO; import com.lions.dev.dto.response.friends.FriendshipReadStatusResponseDTO; +import com.lions.dev.entity.friends.FriendshipStatus; import com.lions.dev.exception.UserNotFoundException; import com.lions.dev.service.FriendshipService; import jakarta.inject.Inject; @@ -252,6 +253,54 @@ public class FriendshipResource { } } + /** + * Récupérer les demandes d'amitié en attente pour un utilisateur. + * + * @param userId L'ID de l'utilisateur + * @param page Numéro de la page pour la pagination + * @param size Nombre d'éléments par page + * @return Liste des demandes d'amitié en attente + */ + @GET + @Path("/pending/{userId}") + @Operation( + summary = "Récupérer les demandes d'amitié en attente", + description = "Retourne la liste des demandes d'amitié en attente pour un utilisateur") + @APIResponses({ + @APIResponse( + responseCode = "200", + description = "Demandes d'amitié récupérées", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = FriendshipReadStatusResponseDTO.class))), + @APIResponse(responseCode = "404", description = "Utilisateur non trouvé"), + @APIResponse( + responseCode = "500", + description = "Erreur lors de la récupération des demandes d'amitié") + }) + public Response getPendingFriendRequests( + @PathParam("userId") UUID userId, + @QueryParam("page") @DefaultValue("0") int page, + @QueryParam("size") @DefaultValue("10") int size) { + logger.info("[LOG] Récupération des demandes d'amitié en attente pour l'utilisateur : " + userId); + + try { + FriendshipReadStatusRequestDTO request = new FriendshipReadStatusRequestDTO( + userId, FriendshipStatus.PENDING, page + 1, size); + List friendships = + friendshipService.listFriendRequestsByStatus(request); + logger.info("[LOG] " + friendships.size() + " demandes d'amitié en attente récupérées avec succès."); + return Response.ok(friendships).build(); + } catch (Exception e) { + logger.error( + "[ERROR] Erreur lors de la récupération des demandes d'amitié : " + e.getMessage(), e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("{\"message\": \"Erreur lors de la récupération des demandes d'amitié.\"}") + .build(); + } + } + /** * Récupérer les demandes d'amitié avec un statut spécifique. * @@ -294,6 +343,98 @@ public class FriendshipResource { } } + /** + * Récupérer les demandes d'amitié envoyées par un utilisateur. + * + * @param userId ID de l'utilisateur. + * @param page Numéro de la page pour la pagination. + * @param size Nombre d'éléments par page. + * @return Liste des demandes d'amitié envoyées. + */ + @GET + @Path("/sent/{userId}") + @Operation( + summary = "Récupérer les demandes d'amitié envoyées", + description = "Retourne la liste des demandes d'amitié envoyées par un utilisateur") + @APIResponses({ + @APIResponse( + responseCode = "200", + description = "Demandes d'amitié envoyées récupérées", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = FriendshipReadStatusResponseDTO.class))), + @APIResponse(responseCode = "404", description = "Utilisateur non trouvé"), + @APIResponse( + responseCode = "500", + description = "Erreur lors de la récupération des demandes d'amitié envoyées") + }) + public Response getSentFriendRequests( + @PathParam("userId") UUID userId, + @QueryParam("page") @DefaultValue("0") int page, + @QueryParam("size") @DefaultValue("10") int size) { + logger.info("[LOG] Récupération des demandes d'amitié envoyées pour l'utilisateur : " + userId); + + try { + List friendships = + friendshipService.listSentFriendRequests(userId, page + 1, size); + logger.info("[LOG] " + friendships.size() + " demandes d'amitié envoyées récupérées avec succès."); + return Response.ok(friendships).build(); + } catch (Exception e) { + logger.error( + "[ERROR] Erreur lors de la récupération des demandes d'amitié envoyées : " + e.getMessage(), e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("{\"message\": \"Erreur lors de la récupération des demandes d'amitié envoyées.\"}") + .build(); + } + } + + /** + * Récupérer les demandes d'amitié reçues par un utilisateur. + * + * @param userId ID de l'utilisateur. + * @param page Numéro de la page pour la pagination. + * @param size Nombre d'éléments par page. + * @return Liste des demandes d'amitié reçues. + */ + @GET + @Path("/received/{userId}") + @Operation( + summary = "Récupérer les demandes d'amitié reçues", + description = "Retourne la liste des demandes d'amitié reçues par un utilisateur") + @APIResponses({ + @APIResponse( + responseCode = "200", + description = "Demandes d'amitié reçues récupérées", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = FriendshipReadStatusResponseDTO.class))), + @APIResponse(responseCode = "404", description = "Utilisateur non trouvé"), + @APIResponse( + responseCode = "500", + description = "Erreur lors de la récupération des demandes d'amitié reçues") + }) + public Response getReceivedFriendRequests( + @PathParam("userId") UUID userId, + @QueryParam("page") @DefaultValue("0") int page, + @QueryParam("size") @DefaultValue("10") int size) { + logger.info("[LOG] Récupération des demandes d'amitié reçues pour l'utilisateur : " + userId); + + try { + List friendships = + friendshipService.listReceivedFriendRequests(userId, page + 1, size); + logger.info("[LOG] " + friendships.size() + " demandes d'amitié reçues récupérées avec succès."); + return Response.ok(friendships).build(); + } catch (Exception e) { + logger.error( + "[ERROR] Erreur lors de la récupération des demandes d'amitié reçues : " + e.getMessage(), e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("{\"message\": \"Erreur lors de la récupération des demandes d'amitié reçues.\"}") + .build(); + } + } + /** * Récupère les détails complets d'un ami. * diff --git a/src/main/java/com/lions/dev/service/FriendshipService.java b/src/main/java/com/lions/dev/service/FriendshipService.java index ac9589f..929cc36 100644 --- a/src/main/java/com/lions/dev/service/FriendshipService.java +++ b/src/main/java/com/lions/dev/service/FriendshipService.java @@ -255,4 +255,46 @@ public class FriendshipService { return friendships.stream().map(FriendshipReadStatusResponseDTO::new).toList(); } + + /** + * Récupérer les demandes d'amitié envoyées par un utilisateur. + * + * @param userId ID de l'utilisateur. + * @param page Numéro de la page. + * @param size Taille de la page. + * @return Liste des demandes d'amitié envoyées. + */ + public List listSentFriendRequests(UUID userId, int page, int size) { + Users user = usersRepository.findById(userId); + if (user == null) { + logger.error("[ERROR] Utilisateur non trouvé."); + throw new UserNotFoundException("Utilisateur introuvable."); + } + + List friendships = friendshipRepository.findSentRequestsByUser(user, FriendshipStatus.PENDING, page - 1, size); + logger.info("[LOG] " + friendships.size() + " demandes d'amitié envoyées récupérées."); + + return friendships.stream().map(FriendshipReadStatusResponseDTO::new).toList(); + } + + /** + * Récupérer les demandes d'amitié reçues par un utilisateur. + * + * @param userId ID de l'utilisateur. + * @param page Numéro de la page. + * @param size Taille de la page. + * @return Liste des demandes d'amitié reçues. + */ + public List listReceivedFriendRequests(UUID userId, int page, int size) { + Users user = usersRepository.findById(userId); + if (user == null) { + logger.error("[ERROR] Utilisateur non trouvé."); + throw new UserNotFoundException("Utilisateur introuvable."); + } + + List friendships = friendshipRepository.findReceivedRequestsByUser(user, FriendshipStatus.PENDING, page - 1, size); + logger.info("[LOG] " + friendships.size() + " demandes d'amitié reçues récupérées."); + + return friendships.stream().map(FriendshipReadStatusResponseDTO::new).toList(); + } }