diff --git a/pom.xml b/pom.xml index de78097..0f0d447 100644 --- a/pom.xml +++ b/pom.xml @@ -108,6 +108,15 @@ spring-boot-maven-plugin ${spring-boot.version} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + hse.java.practice.chatstomp.ChatStompApplication + + diff --git a/src/main/java/hse/java/practice/chatstomp/controller/ChatController.java b/src/main/java/hse/java/practice/chatstomp/controller/ChatController.java new file mode 100644 index 0000000..43143be --- /dev/null +++ b/src/main/java/hse/java/practice/chatstomp/controller/ChatController.java @@ -0,0 +1,42 @@ +package hse.java.practice.chatstomp.controller; +import hse.java.practice.chatstomp.model.ChatMessage; + +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +@Controller +public class ChatController { + + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss"); + private final List history = new CopyOnWriteArrayList<>(); // потокобезопасный список + + @GetMapping("/") + public String index() { + return "chat"; + } + + @MessageMapping("/send") // когда придет соо вызови этот метод + @SendTo("/topic/messages") // отправь всем кто подписан + public ChatMessage sendMessage(@Payload ChatMessage msg) { + String timestamp = LocalDateTime.now().format(formatter); + ChatMessage message = new ChatMessage(msg.sender(), msg.text(), timestamp); + history.add(message); + return message; + } + + @GetMapping("/history") + @ResponseBody + public List getHistory() { + return history; + } + +} diff --git a/src/main/java/hse/java/practice/chatstomp/model/ChatMessage.java b/src/main/java/hse/java/practice/chatstomp/model/ChatMessage.java new file mode 100644 index 0000000..df18af0 --- /dev/null +++ b/src/main/java/hse/java/practice/chatstomp/model/ChatMessage.java @@ -0,0 +1,3 @@ +package hse.java.practice.chatstomp.model; + +public record ChatMessage(String sender, String text, String timestamp) {} diff --git a/src/test/java/hse/java/chatstomp/ChatStompEdgeCasesTest.java b/src/test/java/hse/java/chatstomp/ChatStompEdgeCasesTest.java index f1f3c52..30a0772 100644 --- a/src/test/java/hse/java/chatstomp/ChatStompEdgeCasesTest.java +++ b/src/test/java/hse/java/chatstomp/ChatStompEdgeCasesTest.java @@ -111,7 +111,9 @@ void multipleMessagesFromOneClient() throws Exception { session.subscribe("/topic/messages", mapHandler(queue)); session.send("/app/send", Map.of("sender", "A", "text", "m1")); + Thread.sleep(100); session.send("/app/send", Map.of("sender", "A", "text", "m2")); + Thread.sleep(100); session.send("/app/send", Map.of("sender", "A", "text", "m3")); List received = new ArrayList<>();