tuwunel_admin/room/
prune_empty.rs1use futures::{FutureExt, StreamExt};
2use tuwunel_core::{Result, utils::FutureBoolExt};
3
4use crate::admin_command;
5
6#[admin_command]
7pub(super) async fn room_prune_empty(&self, force: bool) -> Result {
8 let rooms = self
9 .services
10 .metadata
11 .iter_ids()
12 .filter(|room_id| {
13 let has_no_local_users = self
14 .services
15 .state_cache
16 .local_users_in_room(room_id)
17 .boxed()
18 .into_future()
19 .map(|(next, ..)| next.is_none())
20 .boxed();
21
22 let has_no_local_invites = self
23 .services
24 .state_cache
25 .local_users_invited_to_room(room_id)
26 .boxed()
27 .into_future()
28 .map(|(next, ..)| next.is_none())
29 .boxed();
30
31 has_no_local_users.and(has_no_local_invites)
32 })
33 .map(ToOwned::to_owned)
34 .collect::<Vec<_>>()
35 .await;
36
37 for room_id in &rooms {
38 let state_lock = self.services.state.mutex.lock(room_id).await;
39
40 self.services
41 .delete
42 .delete_room(room_id, force, state_lock)
43 .await?;
44 }
45
46 let rooms_len = rooms.len();
47
48 write!(self, "Successfully deleted {rooms_len} rooms from our database.").await?;
49
50 Ok(())
51}