Refactoring - Bonne version améliorée

This commit is contained in:
dahoud
2026-02-05 14:14:45 +00:00
parent a515963a4a
commit dd4dbe111e
56 changed files with 4274 additions and 2142 deletions

View File

@@ -6,9 +6,10 @@ import com.lions.dev.dto.response.chat.MessageResponseDTO;
import com.lions.dev.entity.chat.Conversation;
import com.lions.dev.entity.chat.Message;
import com.lions.dev.entity.users.Users;
import com.lions.dev.repository.UsersRepository;
import com.lions.dev.service.MessageService;
import com.lions.dev.service.UsersService;
import jakarta.inject.Inject;
import jakarta.validation.Valid;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
@@ -29,6 +30,9 @@ import java.util.stream.Collectors;
* - Récupérer les messages d'une conversation
* - Marquer les messages comme lus
* - Supprimer des messages et conversations
*
* La couche resource ne fait pas d'accès direct au repository : elle délègue au service
* et laisse le GlobalExceptionHandler gérer les exceptions métier.
*/
@Path("/messages")
@Produces(MediaType.APPLICATION_JSON)
@@ -42,90 +46,40 @@ public class MessageResource {
MessageService messageService;
@Inject
UsersRepository usersRepository;
UsersService usersService;
/**
* Envoie un nouveau message.
*
* @param request Le DTO contenant les informations du message
* @return Le message créé
*/
@POST
@Operation(summary = "Envoyer un message", description = "Envoie un nouveau message à un utilisateur")
public Response sendMessage(SendMessageRequestDTO request) {
public Response sendMessage(@Valid SendMessageRequestDTO request) {
LOG.info("[LOG] Réception d'une demande d'envoi de message");
try {
// Validation
if (!request.isValid()) {
return Response.status(Response.Status.BAD_REQUEST)
.entity("{\"message\": \"Données invalides\"}")
.build();
}
Message message = messageService.sendMessage(
request.getSenderId(),
request.getRecipientId(),
request.getContent(),
request.getMessageType(),
request.getMediaUrl()
);
// Envoyer le message
Message message = messageService.sendMessage(
request.getSenderId(),
request.getRecipientId(),
request.getContent(),
request.getMessageType(),
request.getMediaUrl()
);
MessageResponseDTO response = new MessageResponseDTO(message);
return Response.status(Response.Status.CREATED).entity(response).build();
} catch (Exception e) {
LOG.error("[ERROR] Erreur lors de l'envoi du message : " + e.getMessage(), e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("{\"message\": \"Erreur lors de l'envoi du message\"}")
.build();
}
MessageResponseDTO response = new MessageResponseDTO(message);
return Response.status(Response.Status.CREATED).entity(response).build();
}
/**
* Récupère toutes les conversations d'un utilisateur.
*
* @param userId L'ID de l'utilisateur
* @return Liste des conversations
*/
@GET
@Path("/conversations/{userId}")
@Operation(summary = "Récupérer les conversations", description = "Récupère toutes les conversations d'un utilisateur")
public Response getUserConversations(@PathParam("userId") UUID userId) {
LOG.info("[LOG] Récupération des conversations pour l'utilisateur ID : " + userId);
try {
Users user = usersRepository.findById(userId);
if (user == null) {
return Response.status(Response.Status.NOT_FOUND)
.entity("{\"message\": \"Utilisateur non trouvé\"}")
.build();
}
Users user = usersService.getUserById(userId);
List<Conversation> conversations = messageService.getUserConversations(userId);
List<ConversationResponseDTO> response = conversations.stream()
.map(conv -> new ConversationResponseDTO(conv, user))
.collect(Collectors.toList());
List<Conversation> conversations = messageService.getUserConversations(userId);
List<ConversationResponseDTO> response = conversations.stream()
.map(conv -> new ConversationResponseDTO(conv, user))
.collect(Collectors.toList());
return Response.ok(response).build();
} catch (Exception e) {
LOG.error("[ERROR] Erreur lors de la récupération des conversations : " + e.getMessage(), e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("{\"message\": \"Erreur lors de la récupération des conversations\"}")
.build();
}
return Response.ok(response).build();
}
/**
* Récupère les messages d'une conversation.
*
* @param conversationId L'ID de la conversation
* @param page Le numéro de la page (défaut: 0)
* @param size La taille de la page (défaut: 50)
* @return Liste des messages
*/
@GET
@Path("/conversation/{conversationId}")
@Operation(summary = "Récupérer les messages", description = "Récupère les messages d'une conversation avec pagination")
@@ -135,29 +89,14 @@ public class MessageResource {
@QueryParam("size") @DefaultValue("50") int size) {
LOG.info("[LOG] Récupération des messages pour la conversation ID : " + conversationId);
try {
List<Message> messages = messageService.getConversationMessages(conversationId, page, size);
List<MessageResponseDTO> response = messages.stream()
.map(MessageResponseDTO::new)
.collect(Collectors.toList());
List<Message> messages = messageService.getConversationMessages(conversationId, page, size);
List<MessageResponseDTO> response = messages.stream()
.map(MessageResponseDTO::new)
.collect(Collectors.toList());
return Response.ok(response).build();
} catch (Exception e) {
LOG.error("[ERROR] Erreur lors de la récupération des messages : " + e.getMessage(), e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("{\"message\": \"Erreur lors de la récupération des messages\"}")
.build();
}
return Response.ok(response).build();
}
/**
* Récupère une conversation entre deux utilisateurs.
*
* @param user1Id L'ID du premier utilisateur
* @param user2Id L'ID du deuxième utilisateur
* @return La conversation
*/
@GET
@Path("/conversation/between/{user1Id}/{user2Id}")
@Operation(summary = "Récupérer une conversation", description = "Récupère la conversation entre deux utilisateurs")
@@ -166,65 +105,24 @@ public class MessageResource {
@PathParam("user2Id") UUID user2Id) {
LOG.info("[LOG] Recherche de conversation entre " + user1Id + " et " + user2Id);
try {
Users user1 = usersRepository.findById(user1Id);
if (user1 == null) {
return Response.status(Response.Status.NOT_FOUND)
.entity("{\"message\": \"Utilisateur non trouvé\"}")
.build();
}
Users user1 = usersService.getUserById(user1Id);
Conversation conversation = messageService.getConversationBetweenUsers(user1Id, user2Id);
ConversationResponseDTO response = new ConversationResponseDTO(conversation, user1);
Conversation conversation = messageService.getConversationBetweenUsers(user1Id, user2Id);
if (conversation == null) {
return Response.status(Response.Status.NOT_FOUND)
.entity("{\"message\": \"Conversation non trouvée\"}")
.build();
}
ConversationResponseDTO response = new ConversationResponseDTO(conversation, user1);
return Response.ok(response).build();
} catch (Exception e) {
LOG.error("[ERROR] Erreur lors de la récupération de la conversation : " + e.getMessage(), e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("{\"message\": \"Erreur lors de la récupération de la conversation\"}")
.build();
}
return Response.ok(response).build();
}
/**
* Marque un message comme lu.
*
* @param messageId L'ID du message
* @return Le message mis à jour
*/
@PUT
@Path("/{messageId}/read")
@Operation(summary = "Marquer comme lu", description = "Marque un message comme lu")
public Response markMessageAsRead(@PathParam("messageId") UUID messageId) {
LOG.info("[LOG] Marquage du message comme lu : " + messageId);
try {
Message message = messageService.markMessageAsRead(messageId);
MessageResponseDTO response = new MessageResponseDTO(message);
return Response.ok(response).build();
} catch (Exception e) {
LOG.error("[ERROR] Erreur lors du marquage du message : " + e.getMessage(), e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("{\"message\": \"Erreur lors du marquage du message\"}")
.build();
}
Message message = messageService.markMessageAsRead(messageId);
MessageResponseDTO response = new MessageResponseDTO(message);
return Response.ok(response).build();
}
/**
* Marque tous les messages d'une conversation comme lus.
*
* @param conversationId L'ID de la conversation
* @param userId L'ID de l'utilisateur
* @return Le nombre de messages marqués comme lus
*/
@PUT
@Path("/conversation/{conversationId}/read/{userId}")
@Operation(summary = "Marquer tout comme lu", description = "Marque tous les messages d'une conversation comme lus")
@@ -233,100 +131,50 @@ public class MessageResource {
@PathParam("userId") UUID userId) {
LOG.info("[LOG] Marquage de tous les messages comme lus pour la conversation " + conversationId);
try {
int count = messageService.markAllMessagesAsRead(conversationId, userId);
return Response.ok("{\"messagesMarkedAsRead\": " + count + "}").build();
} catch (Exception e) {
LOG.error("[ERROR] Erreur lors du marquage des messages : " + e.getMessage(), e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("{\"message\": \"Erreur lors du marquage des messages\"}")
.build();
}
int count = messageService.markAllMessagesAsRead(conversationId, userId);
return Response.ok("{\"messagesMarkedAsRead\": " + count + "}").build();
}
/**
* Récupère le nombre total de messages non lus pour un utilisateur.
*
* @param userId L'ID de l'utilisateur
* @return Le nombre de messages non lus
*/
@GET
@Path("/unread/count/{userId}")
@Operation(summary = "Compter les non lus", description = "Compte le nombre total de messages non lus")
public Response getTotalUnreadCount(@PathParam("userId") UUID userId) {
LOG.info("[LOG] Récupération du nombre de messages non lus pour l'utilisateur " + userId);
try {
long count = messageService.getTotalUnreadCount(userId);
return Response.ok("{\"unreadCount\": " + count + "}").build();
} catch (Exception e) {
LOG.error("[ERROR] Erreur lors du comptage des messages non lus : " + e.getMessage(), e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("{\"message\": \"Erreur lors du comptage\"}")
.build();
}
long count = messageService.getTotalUnreadCount(userId);
return Response.ok("{\"unreadCount\": " + count + "}").build();
}
/**
* Supprime un message.
*
* @param messageId L'ID du message
* @return Confirmation de suppression
*/
@DELETE
@Path("/{messageId}")
@Operation(summary = "Supprimer un message", description = "Supprime un message")
public Response deleteMessage(@PathParam("messageId") UUID messageId) {
LOG.info("[LOG] Suppression du message ID : " + messageId);
try {
boolean deleted = messageService.deleteMessage(messageId);
boolean deleted = messageService.deleteMessage(messageId);
if (deleted) {
return Response.ok("{\"message\": \"Message supprimé avec succès\"}").build();
} else {
return Response.status(Response.Status.NOT_FOUND)
.entity("{\"message\": \"Message non trouvé\"}")
.build();
}
} catch (Exception e) {
LOG.error("[ERROR] Erreur lors de la suppression du message : " + e.getMessage(), e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("{\"message\": \"Erreur lors de la suppression\"}")
if (deleted) {
return Response.ok("{\"message\": \"Message supprimé avec succès\"}").build();
} else {
return Response.status(Response.Status.NOT_FOUND)
.entity("{\"message\": \"Message non trouvé\"}")
.build();
}
}
/**
* Supprime une conversation.
*
* @param conversationId L'ID de la conversation
* @return Confirmation de suppression
*/
@DELETE
@Path("/conversation/{conversationId}")
@Operation(summary = "Supprimer une conversation", description = "Supprime une conversation et tous ses messages")
public Response deleteConversation(@PathParam("conversationId") UUID conversationId) {
LOG.info("[LOG] Suppression de la conversation ID : " + conversationId);
try {
boolean deleted = messageService.deleteConversation(conversationId);
boolean deleted = messageService.deleteConversation(conversationId);
if (deleted) {
return Response.ok("{\"message\": \"Conversation supprimée avec succès\"}").build();
} else {
return Response.status(Response.Status.NOT_FOUND)
.entity("{\"message\": \"Conversation non trouvée\"}")
.build();
}
} catch (Exception e) {
LOG.error("[ERROR] Erreur lors de la suppression de la conversation : " + e.getMessage(), e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("{\"message\": \"Erreur lors de la suppression\"}")
if (deleted) {
return Response.ok("{\"message\": \"Conversation supprimée avec succès\"}").build();
} else {
return Response.status(Response.Status.NOT_FOUND)
.entity("{\"message\": \"Conversation non trouvée\"}")
.build();
}
}