1 package de.juplo.kafka.chat.backend.api;
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;
11 import java.time.Clock;
12 import java.time.LocalDateTime;
13 import java.util.Collection;
14 import java.util.UUID;
18 @RequiredArgsConstructor
19 public class ChatBackendController
21 private final ChatHome chatHome;
22 private final Clock clock;
25 @PostMapping("create")
26 public Chatroom create(@RequestBody String name)
28 return chatHome.createChatroom(name);
32 public Collection<Chatroom> list()
34 return chatHome.list();
37 @GetMapping("get/{chatroomId}")
38 public Chatroom get(@PathVariable UUID chatroomId)
40 return chatHome.getChatroom(chatroomId);
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)
50 Chatroom chatroom = chatHome.getChatroom(chatroomId);
55 LocalDateTime.now(clock),
58 .switchIfEmpty(chatroom.getMessage(username, messageId))
59 .map(message -> MessageTo.from(message));
62 @GetMapping("get/{chatroomId}/{username}/{messageId}")
63 public Mono<MessageTo> get(
64 @PathVariable UUID chatroomId,
65 @PathVariable String username,
66 @PathVariable Long messageId)
70 .getChatroom(chatroomId)
71 .getMessage(username, messageId)
72 .map(message -> MessageTo.from(message));
76 path = "listen/{chatroomId}",
77 produces = MediaType.TEXT_EVENT_STREAM_VALUE)
78 public Flux<MessageTo> listen(@PathVariable UUID chatroomId)
81 .getChatroom(chatroomId)
84 .map(message -> MessageTo.from(message));