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;
16 @RequiredArgsConstructor
17 public class ChatBackendController
19 private final ChatHomeService chatHomeService;
20 private final StorageStrategy storageStrategy;
23 @PostMapping("create")
24 public Mono<ChatRoomInfoTo> create(@RequestBody String name)
26 UUID chatRoomId = UUID.randomUUID();
27 return chatHomeService
28 .createChatRoom(chatRoomId, name)
29 .map(ChatRoomInfoTo::from);
33 public Flux<ChatRoomInfoTo> list()
35 return chatHomeService
37 .map(chatroomInfo -> ChatRoomInfoTo.from(chatroomInfo));
40 @GetMapping("{chatRoomId}/list")
41 public Flux<MessageTo> list(@PathVariable UUID chatRoomId)
43 return chatHomeService
44 .getChatRoomData(chatRoomId)
45 .flatMapMany(chatRoomData -> chatRoomData
47 .map(MessageTo::from));
50 @GetMapping("{chatRoomId}")
51 public Mono<ChatRoomInfoTo> get(@PathVariable UUID chatRoomId)
53 return chatHomeService
54 .getChatRoomInfo(chatRoomId)
55 .map(chatRoomInfo -> ChatRoomInfoTo.from(chatRoomInfo));
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 .getChatRoomData(chatRoomId)
68 .flatMap(chatRoomData -> put(chatRoomData, username, messageId, text));
71 private Mono<MessageTo> put(
72 ChatRoomData chatRoomData,
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 .getChatRoomData(chatRoomId)
95 .flatMap(chatRoomData -> get(chatRoomData, username, messageId));
98 private Mono<MessageTo> get(
99 ChatRoomData chatRoomData,
105 .getMessage(username, messageId)
106 .map(message -> MessageTo.from(message));
109 @GetMapping(path = "{chatRoomId}/listen")
110 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatRoomId)
112 return chatHomeService
113 .getChatRoomData(chatRoomId)
114 .flatMapMany(chatRoomData -> listen(chatRoomData));
117 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoomData chatRoomData)
122 .map(message -> MessageTo.from(message))
126 .id(messageTo.getSerial().toString())
131 @GetMapping("/shards")
132 public Mono<String[]> getShardOwners()
134 return chatHomeService.getShardOwners();
137 @PostMapping("/store")
140 storageStrategy.write(chatHomeService).subscribe();