From d48f4ada157de3d92fff2f3766dabb396f05e328 Mon Sep 17 00:00:00 2001 From: RiadKCM Date: Thu, 16 Jan 2025 12:18:50 +0100 Subject: [PATCH] adding web socket --- app/build.gradle | 3 +++ .../backend/config/WebSocketConfig.java | 25 +++++++++++++++++++ .../backend/controller/MessageController.java | 16 +++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/fr/parisnanterre/greentrip/backend/config/WebSocketConfig.java diff --git a/app/build.gradle b/app/build.gradle index 0b356ee..e0d0dcb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -78,6 +78,9 @@ dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter', version: '3.3.5' implementation group: 'org.springframework.security', name: 'spring-security-core', version: '6.3.3' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '3.3.3' + // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-websocket', version: '3.4.1' + // JSON Web Token libraries implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5' diff --git a/app/src/main/java/fr/parisnanterre/greentrip/backend/config/WebSocketConfig.java b/app/src/main/java/fr/parisnanterre/greentrip/backend/config/WebSocketConfig.java new file mode 100644 index 0000000..857b8e0 --- /dev/null +++ b/app/src/main/java/fr/parisnanterre/greentrip/backend/config/WebSocketConfig.java @@ -0,0 +1,25 @@ +package fr.parisnanterre.greentrip.backend.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // Le préfixe pour les messages envoyés + registry.enableSimpleBroker("/topic"); + // Le préfixe pour les messages destinés au client + registry.setApplicationDestinationPrefixes("/app"); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/ws").withSockJS(); // point d'entrée WebSocket + } +} diff --git a/app/src/main/java/fr/parisnanterre/greentrip/backend/controller/MessageController.java b/app/src/main/java/fr/parisnanterre/greentrip/backend/controller/MessageController.java index acfec7e..9fe1efc 100644 --- a/app/src/main/java/fr/parisnanterre/greentrip/backend/controller/MessageController.java +++ b/app/src/main/java/fr/parisnanterre/greentrip/backend/controller/MessageController.java @@ -1,13 +1,13 @@ package fr.parisnanterre.greentrip.backend.controller; import fr.parisnanterre.greentrip.backend.entity.Message; -import fr.parisnanterre.greentrip.backend.entity.Role; import fr.parisnanterre.greentrip.backend.entity.User; import fr.parisnanterre.greentrip.backend.service.MessageService; import fr.parisnanterre.greentrip.backend.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; @@ -23,6 +23,9 @@ public class MessageController { @Autowired private UserService userService; + @Autowired + private SimpMessagingTemplate messagingTemplate; + // Envoi d'un message @PostMapping public ResponseEntity sendMessage(@RequestBody Message message) { @@ -37,6 +40,13 @@ public ResponseEntity sendMessage(@RequestBody Message message) { // Appel du service pour envoyer le message Message savedMessage = messageService.sendMessageFromAdminToUser(message); + + // Publier le message aux clients via WebSocket pour chaque destinataire + for (User receiver : message.getReceivers()) { + // Publier le message sur un topic spécifique à chaque utilisateur + messagingTemplate.convertAndSend("/topic/messages/" + receiver.getId(), savedMessage); + } + return ResponseEntity.ok(savedMessage); } catch (Exception ex) { ex.printStackTrace(); @@ -67,6 +77,10 @@ public ResponseEntity> getConversationWithAdmins(@PathVariable Lon public ResponseEntity sendMessageFromUser(@RequestBody Message message) { try { Message savedMessage = messageService.sendMessageFromUserToAdmins(message); + + // Publier le message aux admins via WebSocket + messagingTemplate.convertAndSend("/topic/messages/admins", savedMessage); + return ResponseEntity.ok(savedMessage); } catch (Exception e) { e.printStackTrace();