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.domain.UnknownChatroomException;
6 import de.juplo.kafka.chat.backend.persistence.StorageStrategy;
7 import lombok.RequiredArgsConstructor;
8 import org.springframework.http.codec.ServerSentEvent;
9 import org.springframework.web.bind.annotation.*;
10 import reactor.core.publisher.Flux;
11 import reactor.core.publisher.Mono;
13 import java.util.Optional;
14 import java.util.UUID;
15 import java.util.stream.Stream;
19 @RequiredArgsConstructor
20 public class ChatBackendController
22 private final ChatHome chatHome;
23 private final StorageStrategy storageStrategy;
26 @PostMapping("create")
27 public ChatRoomTo create(@RequestBody String name)
29 return ChatRoomTo.from(chatHome.createChatroom(name));
33 public Stream<ChatRoomTo> list()
35 return chatHome.list().map(chatroom -> ChatRoomTo.from(chatroom));
38 @GetMapping("list/{chatroomId}")
39 public Flux<MessageTo> list(@PathVariable UUID chatroomId)
42 .getChatroom(chatroomId)
43 .map(chatroom -> chatroom
45 .map(MessageTo::from))
49 @GetMapping("get/{chatroomId}")
50 public Optional<ChatRoomTo> get(@PathVariable UUID chatroomId)
52 return chatHome.getChatroom(chatroomId).map(chatroom -> ChatRoomTo.from(chatroom));
55 @PutMapping("put/{chatroomId}/{username}/{messageId}")
56 public Mono<MessageTo> put(
57 @PathVariable UUID chatroomId,
58 @PathVariable String username,
59 @PathVariable Long messageId,
60 @RequestBody String text)
64 .getChatroom(chatroomId)
65 .map(chatroom -> put(chatroom, username, messageId, text))
66 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
69 public Mono<MessageTo> put(
81 .switchIfEmpty(chatroom.getMessage(username, messageId))
82 .map(message -> MessageTo.from(message));
85 @GetMapping("get/{chatroomId}/{username}/{messageId}")
86 public Mono<MessageTo> get(
87 @PathVariable UUID chatroomId,
88 @PathVariable String username,
89 @PathVariable Long messageId)
93 .getChatroom(chatroomId)
94 .map(chatroom -> get(chatroom, username, messageId))
95 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
98 private Mono<MessageTo> get(
105 .getMessage(username, messageId)
106 .map(message -> MessageTo.from(message));
109 @GetMapping(path = "listen/{chatroomId}")
110 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatroomId)
113 .getChatroom(chatroomId)
114 .map(chatroom -> listen(chatroom))
115 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
118 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoom chatroom)
123 .map(message -> MessageTo.from(message))
127 .id(messageTo.getSerial().toString())
132 @PostMapping("/store")
135 storageStrategy.writeChatrooms(Flux.fromStream(chatHome.list()));