feat: Added a POST-mapping to force the storing of the data
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / api / ChatBackendController.java
index d613092..4aaf4f5 100644 (file)
@@ -1,6 +1,8 @@
-package de.juplo.kafka.chatroom.api;
+package de.juplo.kafka.chat.backend.api;
 
-import de.juplo.kafka.chatroom.domain.Chatroom;
+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.*;
@@ -9,38 +11,36 @@ import reactor.core.publisher.Mono;
 
 import java.time.Clock;
 import java.time.LocalDateTime;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.Optional;
 import java.util.UUID;
+import java.util.stream.Stream;
 
 
 @RestController
 @RequiredArgsConstructor
-public class ChatroomController
+public class ChatBackendController
 {
-  private final Map<UUID, Chatroom> chatrooms = new HashMap<>();
+  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)
   {
-    Chatroom chatroom = new Chatroom(UUID.randomUUID(), name);
-    chatrooms.put(chatroom.getId(), chatroom);
-    return chatroom;
+    return ChatroomTo.from(chatHome.createChatroom(name));
   }
 
   @GetMapping("list")
-  public Collection<Chatroom> list()
+  public Stream<ChatroomTo> list()
   {
-    return chatrooms.values();
+    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 chatrooms.get(chatroomId);
+    return chatHome.getChatroom(chatroomId).map(chatroom -> ChatroomTo.from(chatroom));
   }
 
   @PutMapping("put/{chatroomId}/{username}/{messageId}")
@@ -50,7 +50,19 @@ public class ChatroomController
       @PathVariable Long messageId,
       @RequestBody String text)
   {
-    Chatroom chatroom = chatrooms.get(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(
@@ -69,8 +81,19 @@ public class ChatroomController
       @PathVariable Long messageId)
   {
     return
-        chatrooms
-            .get(chatroomId)
+        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));
   }
@@ -80,10 +103,23 @@ public class ChatroomController
       produces = MediaType.TEXT_EVENT_STREAM_VALUE)
   public Flux<MessageTo> listen(@PathVariable UUID chatroomId)
   {
-    return chatrooms
-        .get(chatroomId)
+    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()));
+  }
 }