feat: Implemented and tested `MongoDbStorageStrategy`
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / ChatBackendConfiguration.java
1 package de.juplo.kafka.chat.backend;
2
3 import de.juplo.kafka.chat.backend.domain.ChatHome;
4 import com.fasterxml.jackson.databind.ObjectMapper;
5 import de.juplo.kafka.chat.backend.domain.ChatHomeService;
6 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatHomeService;
7 import de.juplo.kafka.chat.backend.persistence.storage.files.FilesStorageStrategy;
8 import de.juplo.kafka.chat.backend.persistence.StorageStrategy;
9 import de.juplo.kafka.chat.backend.persistence.inmemory.InMemoryChatRoomService;
10 import org.springframework.boot.context.properties.EnableConfigurationProperties;
11 import org.springframework.context.annotation.Bean;
12 import org.springframework.context.annotation.Configuration;
13 import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
14
15 import java.nio.file.Paths;
16 import java.time.Clock;
17
18
19 @Configuration
20 @EnableConfigurationProperties(ChatBackendProperties.class)
21 @EnableReactiveMongoRepositories
22 public class ChatBackendConfiguration
23 {
24   @Bean
25   public ChatHome chatHome(ChatHomeService chatHomeService)
26   {
27     return new ChatHome(chatHomeService);
28   }
29
30   @Bean
31   InMemoryChatHomeService chatHomeService(
32       StorageStrategy storageStrategy,
33       Clock clock,
34       ChatBackendProperties properties)
35   {
36     return new InMemoryChatHomeService(
37         storageStrategy.read(),
38         clock,
39         properties.getChatroomBufferSize());
40   }
41
42   @Bean
43   public StorageStrategy storageStrategy(
44       ChatBackendProperties properties,
45       Clock clock,
46       ObjectMapper mapper)
47   {
48     return new FilesStorageStrategy(
49         Paths.get(properties.getStorageDirectory()),
50         clock,
51         properties.getChatroomBufferSize(),
52         messageFlux -> new InMemoryChatRoomService(messageFlux),
53         mapper);
54   }
55
56   @Bean
57   public Clock clock()
58   {
59     return Clock.systemDefaultZone();
60   }
61 }