feat: Implemented an endpoint to get the details of a chatroom
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chatroom / api / ChatroomController.java
1 package de.juplo.kafka.chatroom.api;
2
3 import de.juplo.kafka.chatroom.domain.Chatroom;
4 import de.juplo.kafka.chatroom.domain.Message;
5 import lombok.RequiredArgsConstructor;
6 import org.springframework.http.MediaType;
7 import org.springframework.web.bind.annotation.*;
8 import reactor.core.publisher.Flux;
9 import reactor.core.publisher.Mono;
10
11 import java.time.Clock;
12 import java.time.Duration;
13 import java.time.LocalDateTime;
14 import java.time.LocalTime;
15 import java.util.Collection;
16 import java.util.HashMap;
17 import java.util.Map;
18 import java.util.UUID;
19
20
21 @RestController
22 @RequiredArgsConstructor
23 public class ChatroomController
24 {
25   private final Map<UUID, Chatroom> chatrooms = new HashMap<>();
26   private final Clock clock;
27
28
29   @PostMapping("create")
30   public Chatroom create(@RequestBody String name)
31   {
32     Chatroom chatroom = new Chatroom(UUID.randomUUID(), name);
33     chatrooms.put(chatroom.getId(), chatroom);
34     return chatroom;
35   }
36
37   @GetMapping("list")
38   public Collection<Chatroom> list()
39   {
40     return chatrooms.values();
41   }
42
43   @GetMapping("get/{chatroomId}")
44   public Chatroom get(@PathVariable UUID chatroomId)
45   {
46     return chatrooms.get(chatroomId);
47   }
48
49   @PutMapping("post/{chatroomId}/{username}/{messageId}")
50   public Mono<MessageTo> post(
51       @PathVariable UUID chatroomId,
52       @PathVariable String username,
53       @PathVariable UUID messageId,
54       @RequestBody String text)
55   {
56     return
57         chatrooms
58             .get(chatroomId)
59             .addMessage(
60                 messageId,
61                 LocalDateTime.now(clock),
62                 username,
63                 text)
64             .map(message -> MessageTo.from(message));
65   }
66
67   @GetMapping(
68       path = "listen/{chatroomId}",
69       produces = MediaType.TEXT_EVENT_STREAM_VALUE)
70   public Flux<Message> listen(@PathVariable UUID chatroomId)
71   {
72     return chatrooms.get(chatroomId).listen();
73   }
74 }