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.util.Optional;
13 import java.util.UUID;
14 import java.util.stream.Stream;
18 @RequiredArgsConstructor
19 public class ChatBackendController
21 private final ChatHome chatHome;
22 private final StorageStrategy storageStrategy;
25 @PostMapping("create")
26 public ChatRoomTo create(@RequestBody String name)
28 return ChatRoomTo.from(chatHome.createChatroom(name));
32 public Stream<ChatRoomTo> list()
34 return chatHome.list().map(chatroom -> ChatRoomTo.from(chatroom));
37 @GetMapping("list/{chatroomId}")
38 public Flux<MessageTo> list(@PathVariable UUID chatroomId)
41 .getChatroom(chatroomId)
42 .map(chatroom -> chatroom
44 .map(MessageTo::from))
48 @GetMapping("get/{chatroomId}")
49 public Optional<ChatRoomTo> get(@PathVariable UUID chatroomId)
51 return chatHome.getChatroom(chatroomId).map(chatroom -> ChatRoomTo.from(chatroom));
54 @PutMapping("put/{chatroomId}/{username}/{messageId}")
55 public Mono<MessageTo> put(
56 @PathVariable UUID chatroomId,
57 @PathVariable String username,
58 @PathVariable Long messageId,
59 @RequestBody String text)
63 .getChatroom(chatroomId)
64 .map(chatroom -> put(chatroom, username, messageId, text))
65 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
68 public Mono<MessageTo> put(
80 .switchIfEmpty(chatroom.getMessage(username, messageId))
81 .map(message -> MessageTo.from(message));
84 @GetMapping("get/{chatroomId}/{username}/{messageId}")
85 public Mono<MessageTo> get(
86 @PathVariable UUID chatroomId,
87 @PathVariable String username,
88 @PathVariable Long messageId)
92 .getChatroom(chatroomId)
93 .map(chatroom -> get(chatroom, username, messageId))
94 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
97 private Mono<MessageTo> get(
104 .getMessage(username, messageId)
105 .map(message -> MessageTo.from(message));
108 @GetMapping(path = "listen/{chatroomId}")
109 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatroomId)
112 .getChatroom(chatroomId)
113 .map(chatroom -> listen(chatroom))
114 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
117 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoom chatroom)
122 .map(message -> MessageTo.from(message))
126 .id(messageTo.getSerial().toString())
131 @PostMapping("/store")
134 storageStrategy.writeChatrooms(Flux.fromStream(chatHome.list()));