Skip to main content

tuwunel_admin/query/
room_state_cache.rs

1use 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}