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<ChatRoomInfoTo> create(@RequestBody String name)
26 UUID chatRoomId = UUID.randomUUID();
28 .createChatRoom(chatRoomId, name)
29 .map(ChatRoomInfoTo::from);
33 public Flux<ChatRoomInfoTo> list()
37 .map(chatroom -> ChatRoomInfoTo.from(chatroom));
40 @GetMapping("{chatroomId}/list")
41 public Flux<MessageTo> list(@PathVariable UUID chatroomId)
44 .getChatRoom(chatroomId)
45 .flatMapMany(chatroom -> chatroom
47 .map(MessageTo::from));
50 @GetMapping("{chatroomId}")
51 public Mono<ChatRoomInfoTo> get(@PathVariable UUID chatroomId)
54 .getChatRoom(chatroomId)
55 .map(chatroom -> ChatRoomInfoTo.from(chatroom));
58 @PutMapping("{chatroomId}/{username}/{messageId}")
59 public Mono<MessageTo> put(
60 @PathVariable UUID chatroomId,
61 @PathVariable String username,
62 @PathVariable Long messageId,
63 @RequestBody String text)
67 .getChatRoom(chatroomId)
68 .flatMap(chatroom -> put(chatroom, username, messageId, text));
71 private Mono<MessageTo> put(
83 .map(message -> MessageTo.from(message));
86 @GetMapping("{chatroomId}/{username}/{messageId}")
87 public Mono<MessageTo> get(
88 @PathVariable UUID chatroomId,
89 @PathVariable String username,
90 @PathVariable Long messageId)
94 .getChatRoom(chatroomId)
95 .flatMap(chatroom -> get(chatroom, username, messageId));
98 private Mono<MessageTo> get(
105 .getMessage(username, messageId)
106 .map(message -> MessageTo.from(message));
109 @GetMapping(path = "{chatroomId}/listen")
110 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatroomId)
113 .getChatRoom(chatroomId)
114 .flatMapMany(chatroom -> listen(chatroom));
117 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoom chatroom)
122 .map(message -> MessageTo.from(message))
126 .id(messageTo.getSerial().toString())
131 @PostMapping("/store")
134 storageStrategy.write(chatHome.getChatRooms());