WIP
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / api / ChatBackendController.java
1 package de.juplo.kafka.chat.backend.api;
2
3 import de.juplo.kafka.chat.backend.domain.ChatHome;
4 import de.juplo.kafka.chat.backend.domain.ChatRoom;
5 import de.juplo.kafka.chat.backend.domain.ChatRoomFactory;
6 import de.juplo.kafka.chat.backend.persistence.StorageStrategy;
7 import lombok.RequiredArgsConstructor;
8 import org.springframework.http.codec.ServerSentEvent;
9 import org.springframework.web.bind.annotation.*;
10 import reactor.core.publisher.Flux;
11 import reactor.core.publisher.Mono;
12
13 import java.util.UUID;
14
15
16 @RestController
17 @RequiredArgsConstructor
18 public class ChatBackendController
19 {
20   private final ChatHome chatHome;
21   private final ChatRoomFactory factory;
22   private final StorageStrategy storageStrategy;
23
24
25   @PostMapping("create")
26   public Mono<ChatRoomInfoTo> create(@RequestBody String name)
27   {
28     UUID chatRoomId = UUID.randomUUID();
29     return factory
30         .createChatRoom(chatRoomId, name)
31         .map(ChatRoomInfoTo::from);
32   }
33
34   @GetMapping("list")
35   public Flux<ChatRoomInfoTo> list()
36   {
37     return chatHome
38         .getChatRooms()
39         .map(chatroom -> ChatRoomInfoTo.from(chatroom));
40   }
41
42   @GetMapping("{chatroomId}/list")
43   public Flux<MessageTo> list(@PathVariable UUID chatroomId)
44   {
45     return chatHome
46         .getChatRoom(chatroomId)
47         .flatMapMany(chatroom -> chatroom
48             .getMessages()
49             .map(MessageTo::from));
50   }
51
52   @GetMapping("{chatroomId}")
53   public Mono<ChatRoomInfoTo> get(@PathVariable UUID chatroomId)
54   {
55     return chatHome
56         .getChatRoom(chatroomId)
57         .map(chatroom -> ChatRoomInfoTo.from(chatroom));
58   }
59
60   @PutMapping("{chatroomId}/{username}/{messageId}")
61   public Mono<MessageTo> put(
62       @PathVariable UUID chatroomId,
63       @PathVariable String username,
64       @PathVariable Long messageId,
65       @RequestBody String text)
66   {
67     return
68         chatHome
69             .getChatRoom(chatroomId)
70             .flatMap(chatroom -> put(chatroom, username, messageId, text));
71   }
72
73   private Mono<MessageTo> put(
74       ChatRoom chatroom,
75       String username,
76       Long messageId,
77       String text)
78   {
79     return
80         chatroom
81             .addMessage(
82                 messageId,
83                 username,
84                 text)
85             .map(message -> MessageTo.from(message));
86   }
87
88   @GetMapping("{chatroomId}/{username}/{messageId}")
89   public Mono<MessageTo> get(
90       @PathVariable UUID chatroomId,
91       @PathVariable String username,
92       @PathVariable Long messageId)
93   {
94     return
95         chatHome
96             .getChatRoom(chatroomId)
97             .flatMap(chatroom -> get(chatroom, username, messageId));
98   }
99
100   private Mono<MessageTo> get(
101       ChatRoom chatroom,
102       String username,
103       Long messageId)
104   {
105     return
106         chatroom
107             .getMessage(username, messageId)
108             .map(message -> MessageTo.from(message));
109   }
110
111   @GetMapping(path = "{chatroomId}/listen")
112   public Flux<ServerSentEvent<MessageTo>> listen(@PathVariable UUID chatroomId)
113   {
114     return chatHome
115         .getChatRoom(chatroomId)
116         .flatMapMany(chatroom -> listen(chatroom));
117   }
118
119   private Flux<ServerSentEvent<MessageTo>> listen(ChatRoom chatroom)
120   {
121     return chatroom
122         .listen()
123         .log()
124         .map(message -> MessageTo.from(message))
125         .map(messageTo ->
126             ServerSentEvent
127                 .builder(messageTo)
128                 .id(messageTo.getSerial().toString())
129                 .event("message")
130                 .build());
131   }
132
133   @PostMapping("/store")
134   public void store()
135   {
136     storageStrategy.write(chatHome.getChatRooms());
137   }
138 }