Skip to main content

tuwunel_admin/media/
delete_all_from_server.rs

1use ruma::{Mxc, OwnedServerName};
2use tuwunel_core::{Err, Result, error, trace, warn};
3
4use crate::admin_command;
5
6#[admin_command]
7pub(super) async fn delete_all_from_server(
8	&self,
9	server_name: OwnedServerName,
10	yes_i_want_to_delete_local_media: bool,
11) -> Result {
12	if server_name == self.services.globals.server_name() && !yes_i_want_to_delete_local_media {
13		return Err!("This command only works for remote media by default.",);
14	}
15
16	let Ok(all_mxcs) = self
17		.services
18		.media
19		.get_all_mxcs()
20		.await
21		.inspect_err(|e| error!("Failed to get MXC URIs from our database: {e}"))
22	else {
23		return Err!("Failed to get MXC URIs from our database",);
24	};
25
26	let mut deleted_count: usize = 0;
27
28	for mxc in all_mxcs {
29		let Ok(mxc_server_name) = mxc.server_name().inspect_err(|e| {
30			warn!(
31				"Failed to parse MXC {mxc} server name from database, ignoring error and \
32				 skipping: {e}"
33			);
34		}) else {
35			continue;
36		};
37
38		if mxc_server_name != server_name {
39			trace!("skipping MXC URI {mxc}");
40			continue;
41		}
42
43		let mxc: Mxc<'_> = mxc.as_str().try_into()?;
44
45		match self.services.media.delete(&mxc).await {
46			| Ok(()) => {
47				deleted_count = deleted_count.saturating_add(1);
48			},
49			| Err(e) => {
50				warn!("Failed to delete {mxc}, ignoring error and skipping: {e}");
51			},
52		}
53	}
54
55	write!(self, "Deleted {deleted_count} total files.").await
56}