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 String loggingCategory = ChatBackendController.class.getSimpleName();
22 private final Level loggingLevel;
23 private final boolean showOperatorLine;
26 public ChatBackendController(
27 ChatHomeService chatHomeService,
28 StorageStrategy storageStrategy,
29 ChatBackendProperties properties)
31 this.chatHomeService = chatHomeService;
32 this.storageStrategy = storageStrategy;
33 this.loggingLevel = properties.getProjectreactor().getLoggingLevel();
34 this.showOperatorLine = properties.getProjectreactor().isShowOperatorLine();
38 @PostMapping("create")
39 public Mono<ChatRoomInfoTo> create(@RequestBody String name)
41 UUID chatRoomId = UUID.randomUUID();
42 return chatHomeService
43 .createChatRoom(chatRoomId, name)
44 .map(ChatRoomInfoTo::from);
48 public Flux<ChatRoomInfoTo> list()
50 return chatHomeService
52 .map(chatroomInfo -> ChatRoomInfoTo.from(chatroomInfo));
55 @GetMapping("{chatRoomId}/list")
56 public Flux<MessageTo> list(@PathVariable UUID chatRoomId)
58 return chatHomeService
59 .getChatRoomData(chatRoomId)
60 .flatMapMany(chatRoomData -> chatRoomData
62 .map(MessageTo::from));
65 @GetMapping("{chatRoomId}")
66 public Mono<ChatRoomInfoTo> get(@PathVariable UUID chatRoomId)
68 return chatHomeService
69 .getChatRoomInfo(chatRoomId)
70 .map(chatRoomInfo -> ChatRoomInfoTo.from(chatRoomInfo));
73 @PutMapping("{chatRoomId}/{username}/{messageId}")
74 public Mono<MessageTo> put(
75 @PathVariable UUID chatRoomId,
76 @PathVariable String username,
77 @PathVariable Long messageId,
78 @RequestBody String text)
82 .getChatRoomData(chatRoomId)
83 .flatMap(chatRoomData -> put(chatRoomData, username, messageId, text));
86 private Mono<MessageTo> put(
87 ChatRoomData chatRoomData,
98 .map(message -> MessageTo.from(message));
101 @GetMapping("{chatRoomId}/{username}/{messageId}")
102 public Mono<MessageTo> get(
103 @PathVariable UUID chatRoomId,
104 @PathVariable String username,
105 @PathVariable Long messageId)
109 .getChatRoomData(chatRoomId)
110 .flatMap(chatRoomData -> get(chatRoomData, username, messageId));
113 private Mono<MessageTo> get(
114 ChatRoomData chatRoomData,
120 .getMessage(username, messageId)
121 .map(message -> MessageTo.from(message));
124 @GetMapping(path = "{chatRoomId}/listen")
125 public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatRoomId)
127 return chatHomeService
128 .getChatRoomData(chatRoomId)
129 .flatMapMany(chatRoomData -> listen(chatRoomData));
132 private Flux<ServerSentEvent<MessageTo>> listen(ChatRoomData chatRoomData)
140 .map(message -> MessageTo.from(message))
144 .id(messageTo.getSerial().toString())
149 @GetMapping("/shards")
150 public Mono<String[]> getShardOwners()
152 return chatHomeService.getShardOwners();
155 @PostMapping("/store")
159 .write(chatHomeService)