1 package de.juplo.kafka.chat.backend.api;
3 import de.juplo.kafka.chat.backend.domain.ChatHome;
4 import de.juplo.kafka.chat.backend.domain.Chatroom;
5 import lombok.RequiredArgsConstructor;
6 import org.springframework.http.MediaType;
7 import org.springframework.web.bind.annotation.*;
8 import reactor.core.publisher.Flux;
9 import reactor.core.publisher.Mono;
11 import java.time.Clock;
12 import java.time.LocalDateTime;
13 import java.util.Collection;
14 import java.util.Optional;
15 import java.util.UUID;
19 @RequiredArgsConstructor
20 public class ChatBackendController
22 private final ChatHome chatHome;
23 private final Clock clock;
26 @PostMapping("create")
27 public Chatroom create(@RequestBody String name)
29 return chatHome.createChatroom(name);
33 public Collection<Chatroom> list()
35 return chatHome.list();
38 @GetMapping("get/{chatroomId}")
39 public Optional<Chatroom> get(@PathVariable UUID chatroomId)
41 return chatHome.getChatroom(chatroomId);
44 @PutMapping("put/{chatroomId}/{username}/{messageId}")
45 public Mono<MessageTo> put(
46 @PathVariable UUID chatroomId,
47 @PathVariable String username,
48 @PathVariable Long messageId,
49 @RequestBody String text)
53 .getChatroom(chatroomId)
54 .map(chatroom -> put(chatroom, username, messageId, text))
55 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
58 public Mono<MessageTo> put(
68 LocalDateTime.now(clock),
71 .switchIfEmpty(chatroom.getMessage(username, messageId))
72 .map(message -> MessageTo.from(message));
75 @GetMapping("get/{chatroomId}/{username}/{messageId}")
76 public Mono<MessageTo> get(
77 @PathVariable UUID chatroomId,
78 @PathVariable String username,
79 @PathVariable Long messageId)
83 .getChatroom(chatroomId)
84 .map(chatroom -> get(chatroom, username, messageId))
85 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
88 private Mono<MessageTo> get(
95 .getMessage(username, messageId)
96 .map(message -> MessageTo.from(message));
100 path = "listen/{chatroomId}",
101 produces = MediaType.TEXT_EVENT_STREAM_VALUE)
102 public Flux<MessageTo> listen(@PathVariable UUID chatroomId)
105 .getChatroom(chatroomId)
106 .map(chatroom -> listen(chatroom))
107 .orElseThrow(() -> new UnknownChatroomException(chatroomId));
110 private Flux<MessageTo> listen(Chatroom chatroom)
115 .map(message -> MessageTo.from(message));