feat: Introduced `ChatHome` that gives multiple `Chatroom`s a home
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / api / ChatBackendController.java
1 package de.juplo.kafka.chat.backend.api;
2
3 import de.juplo.kafka.chat.backend.domain.ChatHome;
4 import de.juplo.kafka.chat.backend.domain.Chatroom;
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.LocalDateTime;
13 import java.util.Collection;
14 import java.util.UUID;
15
16
17 @RestController
18 @RequiredArgsConstructor
19 public class ChatBackendController
20 {
21   private final ChatHome chatHome;
22   private final Clock clock;
23
24
25   @PostMapping("create")
26   public Chatroom create(@RequestBody String name)
27   {
28     return chatHome.createChatroom(name);
29   }
30
31   @GetMapping("list")
32   public Collection<Chatroom> list()
33   {
34     return chatHome.list();
35   }
36
37   @GetMapping("get/{chatroomId}")
38   public Chatroom get(@PathVariable UUID chatroomId)
39   {
40     return chatHome.getChatroom(chatroomId);
41   }
42
43   @PutMapping("put/{chatroomId}/{username}/{messageId}")
44   public Mono<MessageTo> put(
45       @PathVariable UUID chatroomId,
46       @PathVariable String username,
47       @PathVariable Long messageId,
48       @RequestBody String text)
49   {
50     Chatroom chatroom = chatHome.getChatroom(chatroomId);
51     return
52         chatroom
53             .addMessage(
54                 messageId,
55                 LocalDateTime.now(clock),
56                 username,
57                 text)
58             .switchIfEmpty(chatroom.getMessage(username, messageId))
59             .map(message -> MessageTo.from(message));
60   }
61
62   @GetMapping("get/{chatroomId}/{username}/{messageId}")
63   public Mono<MessageTo> get(
64       @PathVariable UUID chatroomId,
65       @PathVariable String username,
66       @PathVariable Long messageId)
67   {
68     return
69         chatHome
70             .getChatroom(chatroomId)
71             .getMessage(username, messageId)
72             .map(message -> MessageTo.from(message));
73   }
74
75   @GetMapping(
76       path = "listen/{chatroomId}",
77       produces = MediaType.TEXT_EVENT_STREAM_VALUE)
78   public Flux<MessageTo> listen(@PathVariable UUID chatroomId)
79   {
80     return chatHome
81         .getChatroom(chatroomId)
82         .listen()
83         .log()
84         .map(message -> MessageTo.from(message));
85   }
86 }