tuwunel_admin/media/
delete_list.rs1use 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}