tuwunel_admin/query/
room_state_cache.rs1use clap::Subcommand;
2use futures::StreamExt;
3use ruma::{OwnedRoomId, OwnedServerName, OwnedUserId};
4use tuwunel_core::Result;
5
6use crate::Context;
7
8#[derive(Debug, Subcommand)]
9pub(crate) enum RoomStateCacheCommand {
10 ServerInRoom {
11 server: OwnedServerName,
12 room_id: OwnedRoomId,
13 },
14
15 RoomServers {
16 room_id: OwnedRoomId,
17 },
18
19 ServerRooms {
20 server: OwnedServerName,
21 },
22
23 RoomMembers {
24 room_id: OwnedRoomId,
25 },
26
27 LocalUsersInRoom {
28 room_id: OwnedRoomId,
29 },
30
31 ActiveLocalUsersInRoom {
32 room_id: OwnedRoomId,
33 },
34
35 RoomJoinedCount {
36 room_id: OwnedRoomId,
37 },
38
39 RoomInvitedCount {
40 room_id: OwnedRoomId,
41 },
42
43 RoomUserOnceJoined {
44 room_id: OwnedRoomId,
45 },
46
47 RoomMembersInvited {
48 room_id: OwnedRoomId,
49 },
50
51 GetInviteCount {
52 room_id: OwnedRoomId,
53 user_id: OwnedUserId,
54 },
55
56 GetLeftCount {
57 room_id: OwnedRoomId,
58 user_id: OwnedUserId,
59 },
60
61 RoomsJoined {
62 user_id: OwnedUserId,
63 },
64
65 RoomsLeft {
66 user_id: OwnedUserId,
67 },
68
69 RoomsInvited {
70 user_id: OwnedUserId,
71 },
72
73 InviteState {
74 user_id: OwnedUserId,
75 room_id: OwnedRoomId,
76 },
77
78 UserMemberships {
79 user_id: OwnedUserId,
80 },
81}
82
83pub(super) async fn process(subcommand: RoomStateCacheCommand, context: &Context<'_>) -> Result {
84 let services = context.services;
85
86 match subcommand {
87 | RoomStateCacheCommand::ServerInRoom { server, room_id } => {
88 let timer = tokio::time::Instant::now();
89 let result = services
90 .state_cache
91 .server_in_room(&server, &room_id)
92 .await;
93 let query_time = timer.elapsed();
94
95 context
96 .write_str(&format!(
97 "Query completed in {query_time:?}:\n\n```rs\n{result:#?}\n```"
98 ))
99 .await
100 },
101 | RoomStateCacheCommand::RoomServers { room_id } => {
102 let timer = tokio::time::Instant::now();
103 let results: Vec<_> = services
104 .state_cache
105 .room_servers(&room_id)
106 .map(ToOwned::to_owned)
107 .collect()
108 .await;
109 let query_time = timer.elapsed();
110
111 context
112 .write_str(&format!(
113 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
114 ))
115 .await
116 },
117 | RoomStateCacheCommand::ServerRooms { server } => {
118 let timer = tokio::time::Instant::now();
119 let results: Vec<_> = services
120 .state_cache
121 .server_rooms(&server)
122 .map(ToOwned::to_owned)
123 .collect()
124 .await;
125 let query_time = timer.elapsed();
126
127 context
128 .write_str(&format!(
129 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
130 ))
131 .await
132 },
133 | RoomStateCacheCommand::RoomMembers { room_id } => {
134 let timer = tokio::time::Instant::now();
135 let results: Vec<_> = services
136 .state_cache
137 .room_members(&room_id)
138 .map(ToOwned::to_owned)
139 .collect()
140 .await;
141 let query_time = timer.elapsed();
142
143 context
144 .write_str(&format!(
145 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
146 ))
147 .await
148 },
149 | RoomStateCacheCommand::LocalUsersInRoom { room_id } => {
150 let timer = tokio::time::Instant::now();
151 let results: Vec<_> = services
152 .state_cache
153 .local_users_in_room(&room_id)
154 .map(ToOwned::to_owned)
155 .collect()
156 .await;
157 let query_time = timer.elapsed();
158
159 context
160 .write_str(&format!(
161 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
162 ))
163 .await
164 },
165 | RoomStateCacheCommand::ActiveLocalUsersInRoom { room_id } => {
166 let timer = tokio::time::Instant::now();
167 let results: Vec<_> = services
168 .state_cache
169 .active_local_users_in_room(&room_id)
170 .map(ToOwned::to_owned)
171 .collect()
172 .await;
173 let query_time = timer.elapsed();
174
175 context
176 .write_str(&format!(
177 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
178 ))
179 .await
180 },
181 | RoomStateCacheCommand::RoomJoinedCount { room_id } => {
182 let timer = tokio::time::Instant::now();
183 let results = services
184 .state_cache
185 .room_joined_count(&room_id)
186 .await;
187 let query_time = timer.elapsed();
188
189 context
190 .write_str(&format!(
191 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
192 ))
193 .await
194 },
195 | RoomStateCacheCommand::RoomInvitedCount { room_id } => {
196 let timer = tokio::time::Instant::now();
197 let results = services
198 .state_cache
199 .room_invited_count(&room_id)
200 .await;
201 let query_time = timer.elapsed();
202
203 context
204 .write_str(&format!(
205 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
206 ))
207 .await
208 },
209 | RoomStateCacheCommand::RoomUserOnceJoined { room_id } => {
210 let timer = tokio::time::Instant::now();
211 let results: Vec<_> = services
212 .state_cache
213 .room_useroncejoined(&room_id)
214 .map(ToOwned::to_owned)
215 .collect()
216 .await;
217 let query_time = timer.elapsed();
218
219 context
220 .write_str(&format!(
221 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
222 ))
223 .await
224 },
225 | RoomStateCacheCommand::RoomMembersInvited { room_id } => {
226 let timer = tokio::time::Instant::now();
227 let results: Vec<_> = services
228 .state_cache
229 .room_members_invited(&room_id)
230 .map(ToOwned::to_owned)
231 .collect()
232 .await;
233 let query_time = timer.elapsed();
234
235 context
236 .write_str(&format!(
237 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
238 ))
239 .await
240 },
241 | RoomStateCacheCommand::GetInviteCount { room_id, user_id } => {
242 let timer = tokio::time::Instant::now();
243 let results = services
244 .state_cache
245 .get_invite_count(&room_id, &user_id)
246 .await;
247 let query_time = timer.elapsed();
248
249 context
250 .write_str(&format!(
251 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
252 ))
253 .await
254 },
255 | RoomStateCacheCommand::GetLeftCount { room_id, user_id } => {
256 let timer = tokio::time::Instant::now();
257 let results = services
258 .state_cache
259 .get_left_count(&room_id, &user_id)
260 .await;
261 let query_time = timer.elapsed();
262
263 context
264 .write_str(&format!(
265 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
266 ))
267 .await
268 },
269 | RoomStateCacheCommand::RoomsJoined { user_id } => {
270 let timer = tokio::time::Instant::now();
271 let results: Vec<_> = services
272 .state_cache
273 .rooms_joined(&user_id)
274 .map(ToOwned::to_owned)
275 .collect()
276 .await;
277 let query_time = timer.elapsed();
278
279 context
280 .write_str(&format!(
281 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
282 ))
283 .await
284 },
285 | RoomStateCacheCommand::RoomsInvited { user_id } => {
286 let timer = tokio::time::Instant::now();
287 let results: Vec<_> = services
288 .state_cache
289 .rooms_invited_state(&user_id)
290 .collect()
291 .await;
292 let query_time = timer.elapsed();
293
294 context
295 .write_str(&format!(
296 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
297 ))
298 .await
299 },
300 | RoomStateCacheCommand::RoomsLeft { user_id } => {
301 let timer = tokio::time::Instant::now();
302 let results: Vec<_> = services
303 .state_cache
304 .rooms_left_state(&user_id)
305 .collect()
306 .await;
307 let query_time = timer.elapsed();
308
309 context
310 .write_str(&format!(
311 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
312 ))
313 .await
314 },
315 | RoomStateCacheCommand::InviteState { user_id, room_id } => {
316 let timer = tokio::time::Instant::now();
317 let results = services
318 .state_cache
319 .invite_state(&user_id, &room_id)
320 .await;
321 let query_time = timer.elapsed();
322
323 context
324 .write_str(&format!(
325 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
326 ))
327 .await
328 },
329 | RoomStateCacheCommand::UserMemberships { user_id } => {
330 let timer = tokio::time::Instant::now();
331 let results = services
332 .state_cache
333 .all_user_memberships(&user_id)
334 .map(|(membership, room_id)| (membership, room_id.to_owned()))
335 .collect::<Vec<_>>()
336 .await;
337 let query_time = timer.elapsed();
338
339 context
340 .write_str(&format!(
341 "Query completed in {query_time:?}:\n\n```rs\n{results:#?}\n```"
342 ))
343 .await
344 },
345 }
346}