1 package de.juplo.kafka.chat.backend.api;
3 import de.juplo.kafka.chat.backend.domain.Chatroom;
4 import lombok.RequiredArgsConstructor;
5 import org.springframework.http.MediaType;
6 import org.springframework.web.bind.annotation.*;
7 import reactor.core.publisher.Flux;
8 import reactor.core.publisher.Mono;
10 import java.time.Clock;
11 import java.time.LocalDateTime;
12 import java.util.Collection;
13 import java.util.HashMap;
15 import java.util.UUID;
19 @RequiredArgsConstructor
20 public class ChatBackendController
22 private final Map<UUID, Chatroom> chatrooms = new HashMap<>();
23 private final Clock clock;
26 @PostMapping("create")
27 public Chatroom create(@RequestBody String name)
29 Chatroom chatroom = new Chatroom(UUID.randomUUID(), name);
30 chatrooms.put(chatroom.getId(), chatroom);
35 public Collection<Chatroom> list()
37 return chatrooms.values();
40 @GetMapping("get/{chatroomId}")
41 public Chatroom get(@PathVariable UUID chatroomId)
43 return chatrooms.get(chatroomId);
46 @PutMapping("put/{chatroomId}/{username}/{messageId}")
47 public Mono<MessageTo> put(
48 @PathVariable UUID chatroomId,
49 @PathVariable String username,
50 @PathVariable Long messageId,
51 @RequestBody String text)
53 Chatroom chatroom = chatrooms.get(chatroomId);
58 LocalDateTime.now(clock),
61 .switchIfEmpty(chatroom.getMessage(username, messageId))
62 .map(message -> MessageTo.from(message));
65 @GetMapping("get/{chatroomId}/{username}/{messageId}")
66 public Mono<MessageTo> get(
67 @PathVariable UUID chatroomId,
68 @PathVariable String username,
69 @PathVariable Long messageId)
74 .getMessage(username, messageId)
75 .map(message -> MessageTo.from(message));
79 path = "listen/{chatroomId}",
80 produces = MediaType.TEXT_EVENT_STREAM_VALUE)
81 public Flux<MessageTo> listen(@PathVariable UUID chatroomId)
87 .map(message -> MessageTo.from(message));