From f0f81db99b67850026b0debb97051554af771838 Mon Sep 17 00:00:00 2001 From: Olivia Lee Date: Sun, 1 Dec 2024 14:59:38 -0800 Subject: [PATCH] return Option from media::data::search_file_metadata This is useful to easily distinguish missing files from corrupted keys. All existing usage sites have been modified so there is no behavior change in this commit. --- src/database/key_value/media.rs | 14 +++++++------- src/service/media.rs | 23 +++++++++++++++-------- src/service/media/data.rs | 2 +- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/database/key_value/media.rs b/src/database/key_value/media.rs index 1e7866d5..8f7ca2d7 100644 --- a/src/database/key_value/media.rs +++ b/src/database/key_value/media.rs @@ -1,4 +1,4 @@ -use ruma::{api::client::error::ErrorKind, OwnedMxcUri}; +use ruma::OwnedMxcUri; use crate::{ database::KeyValueDatabase, @@ -158,21 +158,21 @@ impl service::media::Data for KeyValueDatabase { mxc: OwnedMxcUri, width: u32, height: u32, - ) -> Result<(FileMeta, MediaFileKey)> { + ) -> Result> { let mut prefix = mxc.as_bytes().to_vec(); prefix.push(0xFF); prefix.extend_from_slice(&width.to_be_bytes()); prefix.extend_from_slice(&height.to_be_bytes()); prefix.push(0xFF); - let (key, _) = - self.mediaid_file.scan_prefix(prefix).next().ok_or( - Error::BadRequest(ErrorKind::NotFound, "Media not found"), - )?; + let Some((key, _)) = self.mediaid_file.scan_prefix(prefix).next() + else { + return Ok(None); + }; let key = MediaFileKey::new(key); let parts = MediaFileKeyParts::try_from(&key)?; - Ok((parts.meta, key)) + Ok(Some((parts.meta, key))) } fn delete_file_metadata(&self, key: MediaFileKey) -> Result<()> { diff --git a/src/service/media.rs b/src/service/media.rs index f5dfda4d..74cc0f12 100644 --- a/src/service/media.rs +++ b/src/service/media.rs @@ -1,14 +1,17 @@ use std::io::Cursor; use image::imageops::FilterType; -use ruma::{http_headers::ContentDisposition, OwnedMxcUri}; +use ruma::{ + api::client::error::ErrorKind, http_headers::ContentDisposition, + OwnedMxcUri, +}; use tokio::{ fs::{self, File}, io::{AsyncReadExt, AsyncWriteExt}, }; use tracing::{debug, warn}; -use crate::{services, utils, Result}; +use crate::{services, utils, Error, Result}; mod data; @@ -96,7 +99,7 @@ impl Service { &self, mxc: OwnedMxcUri, ) -> Result)>> { - if let Ok((meta, key)) = self.db.search_file_metadata(mxc, 0, 0) { + if let Ok(Some((meta, key))) = self.db.search_file_metadata(mxc, 0, 0) { let path = services().globals.get_media_file(&key); let mut file_data = Vec::new(); let Ok(mut file) = File::open(path).await else { @@ -114,10 +117,13 @@ 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( + 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 thumbnails = self.db.search_thumbnails_metadata(mxc)?; for (_, thumbnail_key) in thumbnails { @@ -292,7 +298,7 @@ impl Service { let (width, height, crop) = Self::thumbnail_properties(width, height).unwrap_or((0, 0, false)); - if let Ok((meta, key)) = + if let Ok(Some((meta, key))) = self.db.search_file_metadata(mxc.clone(), width, height) { debug!("Using saved thumbnail"); @@ -303,7 +309,8 @@ impl Service { return Ok(Some((meta, file.clone()))); } - let Ok((meta, key)) = self.db.search_file_metadata(mxc.clone(), 0, 0) + let Ok(Some((meta, key))) = + self.db.search_file_metadata(mxc.clone(), 0, 0) else { debug!("Original image not found, can't generate thumbnail"); return Ok(None); diff --git a/src/service/media/data.rs b/src/service/media/data.rs index 139032dc..01b2ceb1 100644 --- a/src/service/media/data.rs +++ b/src/service/media/data.rs @@ -17,7 +17,7 @@ pub(crate) trait Data: Send + Sync { mxc: OwnedMxcUri, width: u32, height: u32, - ) -> Result<(FileMeta, MediaFileKey)>; + ) -> Result>; fn delete_file_metadata(&self, key: MediaFileKey) -> Result<()>;