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