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.ChatRoomFactory;
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.UUID;
17 @RequiredArgsConstructor
18 public class ChatBackendController
20 private final ChatHome chatHome;
21 private final ChatRoomFactory factory;
22 private final StorageStrategy storageStrategy;
25 @PostMapping("create")
26 public Mono<ChatRoomInfoTo> create(@RequestBody String name)
28 UUID chatRoomId = UUID.randomUUID();
30 .createChatRoom(chatRoomId, name)
31 .map(ChatRoomInfoTo::from);
35 public Flux<ChatRoomInfoTo> list()
39 .map(chatroom -> ChatRoomInfoTo.from(chatroom));
42 @GetMapping("{chatroomId}/list")
43 public Flux<MessageTo> list(@PathVariable UUID chatroomId)
46 .getChatRoom(chatroomId)
47 .flatMapMany(chatroom -> chatroom
49 .map(MessageTo::from));
52 @GetMapping("{chatroomId}")
53 public Mono<ChatRoomInfoTo> get(@PathVariable UUID chatroomId)
56 .getChatRoom(chatroomId)
57 .map(chatroom -> ChatRoomInfoTo.from(chatroom));
60 @PutMapping("{chatroomId}/{username}/{messageId}")
61 public Mono<MessageTo> put(
62 @PathVariable UUID chatroomId,
63 @PathVariable String username,
64 @PathVariable Long messageId,
65 @RequestBody String text)
69 .getChatRoom(chatroomId)
70 .flatMap(chatroom -> put(chatroom, username, messageId, text));
73 private Mono<MessageTo> put(
85 .map(message -> MessageTo.from(message));
88 @GetMapping("{chatroomId}/{username}/{messageId}")
89 public Mono<MessageTo> get(
90 @PathVariable UUID chatroomId,
91 @PathVariable String username,
92 @PathVariable Long messageId)
96 .getChatRoom(chatroomId)
97 .flatMap(chatroom -> get(chatroom, username, messageId));
100 private Mono<MessageTo> get(
107 .getMessage(username, messageId)
108 .map(message -> MessageTo.from(message));
111 @GetMapping(path = "{chatroomId}/listen")
112 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatroomId)
115 .getChatRoom(chatroomId)
116 .flatMapMany(chatroom -> listen(chatroom));
119 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoom chatroom)
124 .map(message -> MessageTo.from(message))
128 .id(messageTo.getSerial().toString())
133 @PostMapping("/store")
136 storageStrategy.write(chatHome.getChatRooms());