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.Optional;
15 import java.util.UUID;
16 import java.util.stream.Stream;
20 @RequiredArgsConstructor
21 public class ChatBackendController
23 private final ChatHome chatHome;
24 private final Clock clock;
27 @PostMapping("create")
28 public ChatroomTo create(@RequestBody String name)
30 return ChatroomTo.from(chatHome.createChatroom(name));
34 public Stream<ChatroomTo> list()
36 return chatHome.list().map(chatroom -> ChatroomTo.from(chatroom));
39 @GetMapping("get/{chatroomId}")
40 public Optional<ChatroomTo> get(@PathVariable UUID chatroomId)
42 return chatHome.getChatroom(chatroomId).map(chatroom -> ChatroomTo.from(chatroom));
45 @PutMapping("put/{chatroomId}/{username}/{messageId}")
46 public Mono<MessageTo> put(
47 @PathVariable UUID chatroomId,
48 @PathVariable String username,
49 @PathVariable Long messageId,
50 @RequestBody String text)
54 .getChatroom(chatroomId)
55 .map(chatroom -> put(chatroom, username, messageId, text))
56 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
59 public Mono<MessageTo> put(
69 LocalDateTime.now(clock),
72 .switchIfEmpty(chatroom.getMessage(username, messageId))
73 .map(message -> MessageTo.from(message));
76 @GetMapping("get/{chatroomId}/{username}/{messageId}")
77 public Mono<MessageTo> get(
78 @PathVariable UUID chatroomId,
79 @PathVariable String username,
80 @PathVariable Long messageId)
84 .getChatroom(chatroomId)
85 .map(chatroom -> get(chatroom, username, messageId))
86 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
89 private Mono<MessageTo> get(
96 .getMessage(username, messageId)
97 .map(message -> MessageTo.from(message));
101 path = "listen/{chatroomId}",
102 produces = MediaType.TEXT_EVENT_STREAM_VALUE)
103 public Flux<MessageTo> listen(@PathVariable UUID chatroomId)
106 .getChatroom(chatroomId)
107 .map(chatroom -> listen(chatroom))
108 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
111 private Flux<MessageTo> listen(Chatroom chatroom)
116 .map(message -> MessageTo.from(message));