feat(backend): Séparer les demandes d'amitié envoyées et reçues

- 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
This commit is contained in:
dahoud
2026-01-07 16:33:14 +00:00
parent 2f33b09753
commit 4d6a5630fc
4 changed files with 235 additions and 18 deletions

View File

@@ -1,58 +0,0 @@
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"
networks:
- afterwork-network
volumes:
- db_data:/var/lib/postgresql/data
# Service pour l'application Quarkus
app:
build:
context: .
dockerfile: src/main/docker/Dockerfile.jvm
container_name: afterwork-quarkus
environment:
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
DB_HOST: db
DB_PORT: 5432
DB_NAME: ${DB_NAME}
JAVA_OPTS_APPEND: "-Dquarkus.http.host=0.0.0.0"
ports:
- "8080:8080"
depends_on:
- db
networks:
- afterwork-network
# Service pour Swagger UI
swagger-ui:
image: swaggerapi/swagger-ui
container_name: afterwork-swagger-ui
environment:
SWAGGER_JSON: http://app:8080/openapi
ports:
- "8081:8080"
depends_on:
- app
networks:
- afterwork-network
networks:
afterwork-network:
driver: bridge
volumes:
db_data:
driver: local

View File

@@ -95,4 +95,44 @@ public class FriendshipRepository implements PanacheRepositoryBase<Friendship, U
logger.infof("Nombre de relations récupérées pour l'utilisateur %s avec le statut %s : %d", user.getId(), status, friendships.size());
return friendships;
}
/**
* Récupérer les demandes d'amitié envoyées par un utilisateur (où l'utilisateur est l'expéditeur).
*
* @param user L'utilisateur qui a envoyé 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é envoyées.
*/
public List<Friendship> 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<Friendship> 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<Friendship> 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<Friendship> 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;
}
}

View File

@@ -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<FriendshipReadStatusResponseDTO> 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<FriendshipReadStatusResponseDTO> 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<FriendshipReadStatusResponseDTO> 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.
*

View File

@@ -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<FriendshipReadStatusResponseDTO> 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<Friendship> 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<FriendshipReadStatusResponseDTO> 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<Friendship> 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();
}
}