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<ChatRoomTo> create(@RequestBody String name)
28 UUID chatRoomId = UUID.randomUUID();
30 .createChatRoom(chatRoomId, name)
31 .flatMap(chatRoom -> chatHome.putChatRoom(chatRoom))
32 .map(ChatRoomTo::from);
36 public Flux<ChatRoomTo> list()
40 .map(chatroom -> ChatRoomTo.from(chatroom));
43 @GetMapping("{chatroomId}/list")
44 public Flux<MessageTo> list(@PathVariable UUID chatroomId)
47 .getChatRoom(chatroomId)
48 .flatMapMany(chatroom -> chatroom
50 .map(MessageTo::from));
53 @GetMapping("{chatroomId}")
54 public Mono<ChatRoomTo> get(@PathVariable UUID chatroomId)
57 .getChatRoom(chatroomId)
58 .map(chatroom -> ChatRoomTo.from(chatroom));
61 @PutMapping("{chatroomId}/{username}/{messageId}")
62 public Mono<MessageTo> put(
63 @PathVariable UUID chatroomId,
64 @PathVariable String username,
65 @PathVariable Long messageId,
66 @RequestBody String text)
70 .getChatRoom(chatroomId)
71 .flatMap(chatroom -> put(chatroom, username, messageId, text));
74 public Mono<MessageTo> put(
86 .map(message -> MessageTo.from(message));
89 @GetMapping("{chatroomId}/{username}/{messageId}")
90 public Mono<MessageTo> get(
91 @PathVariable UUID chatroomId,
92 @PathVariable String username,
93 @PathVariable Long messageId)
97 .getChatRoom(chatroomId)
98 .flatMap(chatroom -> get(chatroom, username, messageId));
101 private Mono<MessageTo> get(
108 .getMessage(username, messageId)
109 .map(message -> MessageTo.from(message));
112 @GetMapping(path = "{chatroomId}/listen")
113 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatroomId)
116 .getChatRoom(chatroomId)
117 .flatMapMany(chatroom -> listen(chatroom));
120 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoom chatroom)
125 .map(message -> MessageTo.from(message))
129 .id(messageTo.getSerial().toString())
134 @PostMapping("/store")
137 storageStrategy.write(chatHome.getChatRooms());