WIP - Ein Versuch (vielleicht Unsinn)
[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.ShardingStrategy;
6 import de.juplo.kafka.chat.backend.implementation.StorageStrategy;
7 import lombok.RequiredArgsConstructor;
8 import lombok.extern.slf4j.Slf4j;
9 import reactor.core.publisher.Flux;
10
11 import java.util.UUID;
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 ShardingStrategy shardingStrategy;
21
22
23   @Override
24   public void writeChatRoomInfo(Flux<ChatRoomInfo> chatRoomInfoFlux)
25   {
26     chatRoomInfoFlux
27         .map(ChatRoomTo::from)
28         .flatMap(chatroomTo -> chatRoomRepository.save(chatroomTo));
29   }
30
31   @Override
32   public Flux<ChatRoomInfo> readChatRoomInfo()
33   {
34     return chatRoomRepository.findAll()
35         .map(chatRoomTo ->
36         {
37           UUID chatRoomId = UUID.fromString(chatRoomTo.getId());
38           return new ChatRoomInfo(chatRoomId, chatRoomTo.getName(), null);
39         });
40   }
41
42   @Override
43   public void writeChatRoomData(
44       UUID chatRoomId,
45       Flux<Message> messageFlux,
46       SuccessCallback successCallback,
47       FailureCallback failureCallback)
48   {
49     messageFlux
50         .map(message -> MessageTo.from(chatRoomId, message))
51         .flatMap(messageTo -> messageRepository.save(messageTo))
52         .doOnComplete(() -> successCallback.accept(chatRoomId))
53         .doOnError(throwable -> failureCallback.accept(chatRoomId, throwable))
54         .subscribe();
55   }
56
57   @Override
58   public Flux<Message> readChatRoomData(UUID chatRoomId)
59   {
60     return messageRepository.findByChatRoomIdOrderBySerialAsc(chatRoomId.toString())
61         .map(messageTo -> messageTo.toMessage());
62   }
63 }