TMP
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / storage / mongodb / MongoDbStorageStrategy.java
1 package de.juplo.kafka.chat.backend.storage.mongodb;
2
3 import de.juplo.kafka.chat.backend.domain.ChatRoomInfo;
4 import de.juplo.kafka.chat.backend.domain.Message;
5 import de.juplo.kafka.chat.backend.implementation.StorageStrategy;
6 import lombok.RequiredArgsConstructor;
7 import lombok.extern.slf4j.Slf4j;
8 import reactor.core.publisher.Flux;
9
10 import java.util.UUID;
11 import java.util.logging.Level;
12
13
14 @RequiredArgsConstructor
15 @Slf4j
16 public class MongoDbStorageStrategy implements StorageStrategy
17 {
18   private final ChatRoomRepository chatRoomRepository;
19   private final MessageRepository messageRepository;
20   private final String loggingCategory = MongoDbStorageStrategy.class.getSimpleName();
21   private final Level loggingLevel;
22   private final boolean showOperatorLine;
23
24
25   @Override
26   public Flux<ChatRoomInfo> writeChatRoomInfo(Flux<ChatRoomInfo> chatRoomInfoFlux)
27   {
28     return chatRoomInfoFlux
29         .log(
30             loggingCategory,
31             loggingLevel,
32             showOperatorLine)
33         .map(ChatRoomTo::from)
34         .flatMap(chatRoomRepository::save)
35         .map(ChatRoomTo::toChatRoomInfo);
36   }
37
38   @Override
39   public Flux<ChatRoomInfo> readChatRoomInfo()
40   {
41     return chatRoomRepository
42         .findAll()
43         .log(
44             loggingCategory,
45             loggingLevel,
46             showOperatorLine)
47         .map(ChatRoomTo::toChatRoomInfo);
48   }
49
50   @Override
51   public Flux<Message> writeChatRoomData(UUID chatRoomId, Flux<Message> messageFlux)
52   {
53     return messageFlux
54         .log(
55             loggingCategory,
56             loggingLevel,
57             showOperatorLine)
58         .map(message -> MessageTo.from(chatRoomId, message))
59         .flatMap(messageRepository::save)
60         .map(MessageTo::toMessage);
61   }
62
63   @Override
64   public Flux<Message> readChatRoomData(UUID chatRoomId)
65   {
66     return messageRepository
67         .findByChatRoomIdOrderBySerialAsc(chatRoomId.toString())
68         .log(
69             loggingCategory,
70             loggingLevel,
71             showOperatorLine)
72         .map(MessageTo::toMessage);
73   }
74 }