Skip to main content

tuwunel_admin/media/
delete_list.rs

1use ruma::Mxc;
2use tuwunel_core::{Err, Result, info, trace, utils::math::Expected, warn};
3
4use crate::admin_command;
5
6#[admin_command]
7pub(super) async fn delete_list(&self) -> Result {
8	if self.body.len() < 2
9		|| !self.body[0].trim().starts_with("```")
10		|| self.body.last().unwrap_or(&"").trim() != "```"
11	{
12		return Err!("Expected code block in command body. Add --help for details.",);
13	}
14
15	let mut failed_parsed_mxcs: usize = 0;
16
17	let mxc_list = self
18		.body
19		.to_vec()
20		.drain(1..self.body.len().expected_sub(1))
21		.filter_map(|mxc_s| {
22			mxc_s
23				.try_into()
24				.inspect_err(|e| {
25					warn!("Failed to parse user-provided MXC URI: {e}");
26					failed_parsed_mxcs = failed_parsed_mxcs.saturating_add(1);
27				})
28				.ok()
29		})
30		.collect::<Vec<Mxc<'_>>>();
31
32	let mut mxc_deletion_count: usize = 0;
33
34	for mxc in &mxc_list {
35		trace!(%failed_parsed_mxcs, %mxc_deletion_count, "Deleting MXC {mxc} in bulk");
36		match self.services.media.delete(mxc).await {
37			| Ok(()) => {
38				info!("Successfully deleted {mxc} from filesystem and database");
39				mxc_deletion_count = mxc_deletion_count.saturating_add(1);
40			},
41			| Err(e) => {
42				warn!("Failed to delete {mxc}, ignoring error and skipping: {e}");
43				continue;
44			},
45		}
46	}
47
48	write!(
49		self,
50		"Finished bulk MXC deletion, deleted {mxc_deletion_count} total MXCs from our database \
51		 and the filesystem. {failed_parsed_mxcs} MXCs failed to be parsed from the database.",
52	)
53	.await
54}