From 46e8a63489fe4ca0505f1f0ab10cb00910673b1b Mon Sep 17 00:00:00 2001 From: Olivia Lee Date: Sun, 1 Dec 2024 00:40:55 -0800 Subject: [PATCH] allow deleting dangling thumbnails Previously attempting to delete an MXC that is only associated with dangling thumbnails would fail, because it assumes that every thumbnail must have a corresponding original in the db, and errors out if it can't find the original. This is incorrect because we create dangling thumbnails when requesting a remote thumbnail over federation when we don't have the original file. --- src/service/media.rs | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/service/media.rs b/src/service/media.rs index 836e8ef9..0d231c67 100644 --- a/src/service/media.rs +++ b/src/service/media.rs @@ -117,16 +117,11 @@ impl Service { /// Deletes a media object and all associated thumbnails. #[tracing::instrument(skip(self))] pub(crate) async fn delete(&self, mxc: OwnedMxcUri) -> Result<()> { - let (_, key) = self - .db - .search_file_metadata(mxc.clone(), 0, 0) - .inspect_err( - |error| warn!(%error, "Failed to find original media key"), - )? - .ok_or(Error::BadRequest(ErrorKind::NotFound, "Media not found"))?; + let mut any_files = false; - let thumbnails = self.db.search_thumbnails_metadata(mxc)?; + let thumbnails = self.db.search_thumbnails_metadata(mxc.clone())?; for (_, thumbnail_key) in thumbnails { + any_files = true; self.delete_by_key(thumbnail_key.clone()).await.inspect_err( |error| { warn!( @@ -140,11 +135,25 @@ impl Service { )?; } - self.delete_by_key(key).await.inspect_err( - |error| warn!(%error, "Failed to delete original media"), - )?; + if let Some((_, key)) = + self.db.search_file_metadata(mxc, 0, 0).inspect_err( + |error| warn!(%error, "Failed to find original media key"), + )? + { + any_files = true; + self.delete_by_key(key).await.inspect_err( + |error| warn!(%error, "Failed to delete original media"), + )?; + } - Ok(()) + if any_files { + Ok(()) + } else { + let error = + Error::BadRequest(ErrorKind::NotFound, "Media not found"); + warn!(%error, "Failed to delete media"); + Err(error) + } } /// Deletes a specific media key, which may or may not be a thumbnail.