import de.juplo.kafka.chat.backend.domain.ChatHome;
import de.juplo.kafka.chat.backend.domain.Chatroom;
+import de.juplo.kafka.chat.backend.persistence.StorageStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.time.Clock;
import java.time.LocalDateTime;
-import java.util.Collection;
+import java.util.Optional;
import java.util.UUID;
+import java.util.stream.Stream;
@RestController
{
private final ChatHome chatHome;
private final Clock clock;
+ private final StorageStrategy storageStrategy;
@PostMapping("create")
- public Chatroom create(@RequestBody String name)
+ public ChatroomTo create(@RequestBody String name)
{
- return chatHome.createChatroom(name);
+ return ChatroomTo.from(chatHome.createChatroom(name));
}
@GetMapping("list")
- public Collection<Chatroom> list()
+ public Stream<ChatroomTo> list()
{
- return chatHome.list();
+ return chatHome.list().map(chatroom -> ChatroomTo.from(chatroom));
}
@GetMapping("get/{chatroomId}")
- public Chatroom get(@PathVariable UUID chatroomId)
+ public Optional<ChatroomTo> get(@PathVariable UUID chatroomId)
{
- return chatHome.getChatroom(chatroomId);
+ return chatHome.getChatroom(chatroomId).map(chatroom -> ChatroomTo.from(chatroom));
}
@PutMapping("put/{chatroomId}/{username}/{messageId}")
@PathVariable Long messageId,
@RequestBody String text)
{
- Chatroom chatroom = chatHome.getChatroom(chatroomId);
+ return
+ chatHome
+ .getChatroom(chatroomId)
+ .map(chatroom -> put(chatroom, username, messageId, text))
+ .orElseThrow(() -> new UnknownChatroomException(chatroomId));
+ }
+
+ public Mono<MessageTo> put(
+ Chatroom chatroom,
+ String username,
+ Long messageId,
+ String text)
+ {
return
chatroom
.addMessage(
return
chatHome
.getChatroom(chatroomId)
+ .map(chatroom -> get(chatroom, username, messageId))
+ .orElseThrow(() -> new UnknownChatroomException(chatroomId));
+ }
+
+ private Mono<MessageTo> get(
+ Chatroom chatroom,
+ String username,
+ Long messageId)
+ {
+ return
+ chatroom
.getMessage(username, messageId)
.map(message -> MessageTo.from(message));
}
{
return chatHome
.getChatroom(chatroomId)
+ .map(chatroom -> listen(chatroom))
+ .orElseThrow(() -> new UnknownChatroomException(chatroomId));
+ }
+
+ private Flux<MessageTo> listen(Chatroom chatroom)
+ {
+ return chatroom
.listen()
.log()
.map(message -> MessageTo.from(message));
}
+
+ @PostMapping("/store")
+ public void store()
+ {
+ storageStrategy.writeChatrooms(Flux.fromStream(chatHome.list()));
+ }
}