feat: The chats are stored as local json-files
[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.ChatroomFactory;
6 import de.juplo.kafka.chat.backend.domain.Message;
7 import de.juplo.kafka.chat.backend.persistence.InMemoryChatroomFactory;
8 import de.juplo.kafka.chat.backend.persistence.InMemoryPersistenceStrategy;
9 import de.juplo.kafka.chat.backend.persistence.LocalJsonFilesStorageStrategy;
10 import de.juplo.kafka.chat.backend.persistence.StorageStrategy;
11 import org.springframework.boot.context.properties.EnableConfigurationProperties;
12 import org.springframework.context.annotation.Bean;
13 import org.springframework.context.annotation.Configuration;
14
15 import java.nio.file.Paths;
16 import java.time.Clock;
17 import java.util.LinkedHashMap;
18
19
20 @Configuration
21 @EnableConfigurationProperties(ChatBackendProperties.class)
22 public class ChatBackendConfiguration
23 {
24   @Bean
25   public ChatHome chatHome(
26       ChatroomFactory chatroomFactory,
27       StorageStrategy storageStrategy)
28   {
29     return new ChatHome(
30         storageStrategy.readChatrooms().collectMap(chatroom -> chatroom.getId()).block(),
31         chatroomFactory);
32   }
33
34   @Bean
35   public StorageStrategy storageStrategy(
36       ChatBackendProperties properties,
37       ObjectMapper mapper,
38       ChatroomFactory chatroomFactory)
39   {
40     return new LocalJsonFilesStorageStrategy(
41         Paths.get(properties.getDatadir()),
42         mapper,
43         chatroomFactory);
44   }
45
46   @Bean
47   ChatroomFactory chatroomFactory(InMemoryPersistenceStrategy persistenceStrategy)
48   {
49     return new InMemoryChatroomFactory(persistenceStrategy);
50   }
51
52   @Bean
53   InMemoryPersistenceStrategy persistenceStrategy()
54   {
55     return new InMemoryPersistenceStrategy(new LinkedHashMap<>());
56   }
57
58   @Bean
59   public Clock clock()
60   {
61     return Clock.systemDefaultZone();
62   }
63 }