1 package de.juplo.kafka.chat.backend.api;
3 import de.juplo.kafka.chat.backend.domain.ChatHomeService;
4 import de.juplo.kafka.chat.backend.domain.ChatRoomData;
5 import de.juplo.kafka.chat.backend.implementation.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;
13 import java.util.logging.Level;
17 @RequiredArgsConstructor
18 public class ChatBackendController
20 private final ChatHomeService chatHomeService;
21 private final StorageStrategy storageStrategy;
24 @PostMapping("create")
25 public Mono<ChatRoomInfoTo> create(@RequestBody String name)
27 UUID chatRoomId = UUID.randomUUID();
28 return chatHomeService
29 .createChatRoom(chatRoomId, name)
30 .map(ChatRoomInfoTo::from);
34 public Flux<ChatRoomInfoTo> list()
36 return chatHomeService
38 .map(chatroomInfo -> ChatRoomInfoTo.from(chatroomInfo));
41 @GetMapping("{chatRoomId}/list")
42 public Flux<MessageTo> list(@PathVariable UUID chatRoomId)
44 return chatHomeService
45 .getChatRoomData(chatRoomId)
46 .flatMapMany(chatRoomData -> chatRoomData
48 .map(MessageTo::from));
51 @GetMapping("{chatRoomId}")
52 public Mono<ChatRoomInfoTo> get(@PathVariable UUID chatRoomId)
54 return chatHomeService
55 .getChatRoomInfo(chatRoomId)
56 .map(chatRoomInfo -> ChatRoomInfoTo.from(chatRoomInfo));
59 @PutMapping("{chatRoomId}/{username}/{messageId}")
60 public Mono<MessageTo> put(
61 @PathVariable UUID chatRoomId,
62 @PathVariable String username,
63 @PathVariable Long messageId,
64 @RequestBody String text)
68 .getChatRoomData(chatRoomId)
69 .flatMap(chatRoomData -> put(chatRoomData, username, messageId, text));
72 private Mono<MessageTo> put(
73 ChatRoomData chatRoomData,
84 .map(message -> MessageTo.from(message));
87 @GetMapping("{chatRoomId}/{username}/{messageId}")
88 public Mono<MessageTo> get(
89 @PathVariable UUID chatRoomId,
90 @PathVariable String username,
91 @PathVariable Long messageId)
95 .getChatRoomData(chatRoomId)
96 .flatMap(chatRoomData -> get(chatRoomData, username, messageId));
99 private Mono<MessageTo> get(
100 ChatRoomData chatRoomData,
106 .getMessage(username, messageId)
107 .map(message -> MessageTo.from(message));
110 @GetMapping(path = "{chatRoomId}/listen")
111 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatRoomId)
113 return chatHomeService
114 .getChatRoomData(chatRoomId)
115 .flatMapMany(chatRoomData -> listen(chatRoomData));
118 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoomData chatRoomData)
123 ChatBackendController.class.getSimpleName(),
126 .map(message -> MessageTo.from(message))
130 .id(messageTo.getSerial().toString())
135 @GetMapping("/shards")
136 public Mono<String[]> getShardOwners()
138 return chatHomeService.getShardOwners();
141 @PostMapping("/store")
145 .write(chatHomeService)