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.UUID;
16 @RequiredArgsConstructor
17 public class ChatBackendController
19 private final ChatHome chatHome;
20 private final StorageStrategy storageStrategy;
23 @PostMapping("create")
24 public Mono<ChatRoomTo> create(@RequestBody String name)
26 return chatHome.createChatroom(name).map(ChatRoomTo::from);
30 public Flux<ChatRoomTo> list()
32 return chatHome.getChatRooms().map(chatroom -> ChatRoomTo.from(chatroom));
35 @GetMapping("{chatroomId}/list")
36 public Flux<MessageTo> list(@PathVariable UUID chatroomId)
39 .getChatRoom(chatroomId)
40 .flatMapMany(chatroom -> chatroom
42 .map(MessageTo::from));
45 @GetMapping("{chatroomId}")
46 public Mono<ChatRoomTo> get(@PathVariable UUID chatroomId)
48 return chatHome.getChatRoom(chatroomId).map(chatroom -> ChatRoomTo.from(chatroom));
51 @PutMapping("{chatroomId}/{username}/{messageId}")
52 public Mono<MessageTo> put(
53 @PathVariable UUID chatroomId,
54 @PathVariable String username,
55 @PathVariable Long messageId,
56 @RequestBody String text)
60 .getChatRoom(chatroomId)
61 .flatMap(chatroom -> put(chatroom, username, messageId, text));
64 public Mono<MessageTo> put(
76 .map(message -> MessageTo.from(message));
79 @GetMapping("{chatroomId}/{username}/{messageId}")
80 public Mono<MessageTo> get(
81 @PathVariable UUID chatroomId,
82 @PathVariable String username,
83 @PathVariable Long messageId)
87 .getChatRoom(chatroomId)
88 .flatMap(chatroom -> get(chatroom, username, messageId));
91 private Mono<MessageTo> get(
98 .getMessage(username, messageId)
99 .map(message -> MessageTo.from(message));
102 @GetMapping(path = "{chatroomId}/listen")
103 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatroomId)
106 .getChatRoom(chatroomId)
107 .flatMapMany(chatroom -> listen(chatroom));
110 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoom chatroom)
115 .map(message -> MessageTo.from(message))
119 .id(messageTo.getSerial().toString())
124 @PostMapping("/store")
127 storageStrategy.write(chatHome.getChatRooms());