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 de.juplo.kafka.chat.backend.persistence.StorageStrategy;
6 import lombok.RequiredArgsConstructor;
7 import org.springframework.http.codec.ServerSentEvent;
8 import org.springframework.web.bind.annotation.*;
9 import reactor.core.publisher.Flux;
10 import reactor.core.publisher.Mono;
12 import java.time.Clock;
13 import java.time.LocalDateTime;
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;
25 private final StorageStrategy storageStrategy;
28 @PostMapping("create")
29 public ChatroomTo create(@RequestBody String name)
31 return ChatroomTo.from(chatHome.createChatroom(name));
35 public Stream<ChatroomTo> list()
37 return chatHome.list().map(chatroom -> ChatroomTo.from(chatroom));
40 @GetMapping("list/{chatroomId}")
41 public Flux<MessageTo> list(@PathVariable UUID chatroomId)
44 .getChatroom(chatroomId)
45 .map(chatroom -> chatroom
47 .map(MessageTo::from))
51 @GetMapping("get/{chatroomId}")
52 public Optional<ChatroomTo> get(@PathVariable UUID chatroomId)
54 return chatHome.getChatroom(chatroomId).map(chatroom -> ChatroomTo.from(chatroom));
57 @PutMapping("put/{chatroomId}/{username}/{messageId}")
58 public Mono<MessageTo> put(
59 @PathVariable UUID chatroomId,
60 @PathVariable String username,
61 @PathVariable Long messageId,
62 @RequestBody String text)
66 .getChatroom(chatroomId)
67 .map(chatroom -> put(chatroom, username, messageId, text))
68 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
71 public Mono<MessageTo> put(
81 LocalDateTime.now(clock),
84 .switchIfEmpty(chatroom.getMessage(username, messageId))
85 .map(message -> MessageTo.from(message));
88 @GetMapping("get/{chatroomId}/{username}/{messageId}")
89 public Mono<MessageTo> get(
90 @PathVariable UUID chatroomId,
91 @PathVariable String username,
92 @PathVariable Long messageId)
96 .getChatroom(chatroomId)
97 .map(chatroom -> get(chatroom, username, messageId))
98 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
101 private Mono<MessageTo> get(
108 .getMessage(username, messageId)
109 .map(message -> MessageTo.from(message));
112 @GetMapping(path = "listen/{chatroomId}")
113 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatroomId)
116 .getChatroom(chatroomId)
117 .map(chatroom -> listen(chatroom))
118 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
121 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoom chatroom)
126 .map(message -> MessageTo.from(message))
130 .id(messageTo.getSerial().toString())
135 @PostMapping("/store")
138 storageStrategy.writeChatrooms(Flux.fromStream(chatHome.list()));