refactor: Refined packaging (renamed packages and classes)
[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.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.LocalDateTime;
12 import java.util.Collection;
13 import java.util.HashMap;
14 import java.util.Map;
15 import java.util.UUID;
16
17
18 @RestController
19 @RequiredArgsConstructor
20 public class ChatBackendController
21 {
22   private final Map<UUID, Chatroom> chatrooms = new HashMap<>();
23   private final Clock clock;
24
25
26   @PostMapping("create")
27   public Chatroom create(@RequestBody String name)
28   {
29     Chatroom chatroom = new Chatroom(UUID.randomUUID(), name);
30     chatrooms.put(chatroom.getId(), chatroom);
31     return chatroom;
32   }
33
34   @GetMapping("list")
35   public Collection<Chatroom> list()
36   {
37     return chatrooms.values();
38   }
39
40   @GetMapping("get/{chatroomId}")
41   public Chatroom get(@PathVariable UUID chatroomId)
42   {
43     return chatrooms.get(chatroomId);
44   }
45
46   @PutMapping("put/{chatroomId}/{username}/{messageId}")
47   public Mono<MessageTo> put(
48       @PathVariable UUID chatroomId,
49       @PathVariable String username,
50       @PathVariable Long messageId,
51       @RequestBody String text)
52   {
53     Chatroom chatroom = chatrooms.get(chatroomId);
54     return
55         chatroom
56             .addMessage(
57                 messageId,
58                 LocalDateTime.now(clock),
59                 username,
60                 text)
61             .switchIfEmpty(chatroom.getMessage(username, messageId))
62             .map(message -> MessageTo.from(message));
63   }
64
65   @GetMapping("get/{chatroomId}/{username}/{messageId}")
66   public Mono<MessageTo> get(
67       @PathVariable UUID chatroomId,
68       @PathVariable String username,
69       @PathVariable Long messageId)
70   {
71     return
72         chatrooms
73             .get(chatroomId)
74             .getMessage(username, messageId)
75             .map(message -> MessageTo.from(message));
76   }
77
78   @GetMapping(
79       path = "listen/{chatroomId}",
80       produces = MediaType.TEXT_EVENT_STREAM_VALUE)
81   public Flux<MessageTo> listen(@PathVariable UUID chatroomId)
82   {
83     return chatrooms
84         .get(chatroomId)
85         .listen()
86         .log()
87         .map(message -> MessageTo.from(message));
88   }
89 }