1 package de.juplo.kafka.chat.backend.api;
3 import de.juplo.kafka.chat.backend.ChatBackendProperties;
4 import de.juplo.kafka.chat.backend.domain.ChatHomeService;
5 import de.juplo.kafka.chat.backend.domain.ChatRoomData;
6 import de.juplo.kafka.chat.backend.implementation.StorageStrategy;
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 public class ChatBackendController
19 private final ChatHomeService chatHomeService;
20 private final StorageStrategy storageStrategy;
21 private final Level loggingLevel;
22 private final boolean showOperatorLine;
25 public ChatBackendController(
26 ChatHomeService chatHomeService,
27 StorageStrategy storageStrategy,
28 ChatBackendProperties properties)
30 this.chatHomeService = chatHomeService;
31 this.storageStrategy = storageStrategy;
32 this.loggingLevel = properties.getProjectreactor().getLoggingLevel();
33 this.showOperatorLine = properties.getProjectreactor().isShowOperatorLine();
37 @PostMapping("create")
38 public Mono<ChatRoomInfoTo> create(@RequestBody String name)
40 UUID chatRoomId = UUID.randomUUID();
41 return chatHomeService
42 .createChatRoom(chatRoomId, name)
43 .map(ChatRoomInfoTo::from);
47 public Flux<ChatRoomInfoTo> list()
49 return chatHomeService
51 .map(chatroomInfo -> ChatRoomInfoTo.from(chatroomInfo));
54 @GetMapping("{chatRoomId}/list")
55 public Flux<MessageTo> list(@PathVariable UUID chatRoomId)
57 return chatHomeService
58 .getChatRoomData(chatRoomId)
59 .flatMapMany(chatRoomData -> chatRoomData
61 .map(MessageTo::from));
64 @GetMapping("{chatRoomId}")
65 public Mono<ChatRoomInfoTo> get(@PathVariable UUID chatRoomId)
67 return chatHomeService
68 .getChatRoomInfo(chatRoomId)
69 .map(chatRoomInfo -> ChatRoomInfoTo.from(chatRoomInfo));
72 @PutMapping("{chatRoomId}/{username}/{messageId}")
73 public Mono<MessageTo> put(
74 @PathVariable UUID chatRoomId,
75 @PathVariable String username,
76 @PathVariable Long messageId,
77 @RequestBody String text)
81 .getChatRoomData(chatRoomId)
82 .flatMap(chatRoomData -> put(chatRoomData, username, messageId, text));
85 private Mono<MessageTo> put(
86 ChatRoomData chatRoomData,
97 .map(message -> MessageTo.from(message));
100 @GetMapping("{chatRoomId}/{username}/{messageId}")
101 public Mono<MessageTo> get(
102 @PathVariable UUID chatRoomId,
103 @PathVariable String username,
104 @PathVariable Long messageId)
108 .getChatRoomData(chatRoomId)
109 .flatMap(chatRoomData -> get(chatRoomData, username, messageId));
112 private Mono<MessageTo> get(
113 ChatRoomData chatRoomData,
119 .getMessage(username, messageId)
120 .map(message -> MessageTo.from(message));
123 @GetMapping(path = "{chatRoomId}/listen")
124 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatRoomId)
126 return chatHomeService
127 .getChatRoomData(chatRoomId)
128 .flatMapMany(chatRoomData -> listen(chatRoomData));
131 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoomData chatRoomData)
136 ChatBackendController.class.getSimpleName(),
139 .map(message -> MessageTo.from(message))
143 .id(messageTo.getSerial().toString())
148 @GetMapping("/shards")
149 public Mono<String[]> getShardOwners()
151 return chatHomeService.getShardOwners();
154 @PostMapping("/store")
158 .write(chatHomeService)