Skip to main content

tuwunel_admin/room/
prune_empty.rs

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