mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-17 15:51:23 +01:00
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.
This commit is contained in:
parent
861016ce0f
commit
f0f81db99b
3 changed files with 23 additions and 16 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
use ruma::{api::client::error::ErrorKind, OwnedMxcUri};
|
use ruma::OwnedMxcUri;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
database::KeyValueDatabase,
|
database::KeyValueDatabase,
|
||||||
|
|
@ -158,21 +158,21 @@ impl service::media::Data for KeyValueDatabase {
|
||||||
mxc: OwnedMxcUri,
|
mxc: OwnedMxcUri,
|
||||||
width: u32,
|
width: u32,
|
||||||
height: u32,
|
height: u32,
|
||||||
) -> Result<(FileMeta, MediaFileKey)> {
|
) -> Result<Option<(FileMeta, MediaFileKey)>> {
|
||||||
let mut prefix = mxc.as_bytes().to_vec();
|
let mut prefix = mxc.as_bytes().to_vec();
|
||||||
prefix.push(0xFF);
|
prefix.push(0xFF);
|
||||||
prefix.extend_from_slice(&width.to_be_bytes());
|
prefix.extend_from_slice(&width.to_be_bytes());
|
||||||
prefix.extend_from_slice(&height.to_be_bytes());
|
prefix.extend_from_slice(&height.to_be_bytes());
|
||||||
prefix.push(0xFF);
|
prefix.push(0xFF);
|
||||||
|
|
||||||
let (key, _) =
|
let Some((key, _)) = self.mediaid_file.scan_prefix(prefix).next()
|
||||||
self.mediaid_file.scan_prefix(prefix).next().ok_or(
|
else {
|
||||||
Error::BadRequest(ErrorKind::NotFound, "Media not found"),
|
return Ok(None);
|
||||||
)?;
|
};
|
||||||
|
|
||||||
let key = MediaFileKey::new(key);
|
let key = MediaFileKey::new(key);
|
||||||
let parts = MediaFileKeyParts::try_from(&key)?;
|
let parts = MediaFileKeyParts::try_from(&key)?;
|
||||||
Ok((parts.meta, key))
|
Ok(Some((parts.meta, key)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn delete_file_metadata(&self, key: MediaFileKey) -> Result<()> {
|
fn delete_file_metadata(&self, key: MediaFileKey) -> Result<()> {
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,17 @@
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
|
|
||||||
use image::imageops::FilterType;
|
use image::imageops::FilterType;
|
||||||
use ruma::{http_headers::ContentDisposition, OwnedMxcUri};
|
use ruma::{
|
||||||
|
api::client::error::ErrorKind, http_headers::ContentDisposition,
|
||||||
|
OwnedMxcUri,
|
||||||
|
};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
fs::{self, File},
|
fs::{self, File},
|
||||||
io::{AsyncReadExt, AsyncWriteExt},
|
io::{AsyncReadExt, AsyncWriteExt},
|
||||||
};
|
};
|
||||||
use tracing::{debug, warn};
|
use tracing::{debug, warn};
|
||||||
|
|
||||||
use crate::{services, utils, Result};
|
use crate::{services, utils, Error, Result};
|
||||||
|
|
||||||
mod data;
|
mod data;
|
||||||
|
|
||||||
|
|
@ -96,7 +99,7 @@ impl Service {
|
||||||
&self,
|
&self,
|
||||||
mxc: OwnedMxcUri,
|
mxc: OwnedMxcUri,
|
||||||
) -> Result<Option<(FileMeta, Vec<u8>)>> {
|
) -> Result<Option<(FileMeta, Vec<u8>)>> {
|
||||||
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 path = services().globals.get_media_file(&key);
|
||||||
let mut file_data = Vec::new();
|
let mut file_data = Vec::new();
|
||||||
let Ok(mut file) = File::open(path).await else {
|
let Ok(mut file) = File::open(path).await else {
|
||||||
|
|
@ -114,10 +117,13 @@ impl Service {
|
||||||
/// Deletes a media object and all associated thumbnails.
|
/// Deletes a media object and all associated thumbnails.
|
||||||
#[tracing::instrument(skip(self))]
|
#[tracing::instrument(skip(self))]
|
||||||
pub(crate) async fn delete(&self, mxc: OwnedMxcUri) -> Result<()> {
|
pub(crate) async fn delete(&self, mxc: OwnedMxcUri) -> Result<()> {
|
||||||
let (_, key) =
|
let (_, key) = self
|
||||||
self.db.search_file_metadata(mxc.clone(), 0, 0).inspect_err(
|
.db
|
||||||
|
.search_file_metadata(mxc.clone(), 0, 0)
|
||||||
|
.inspect_err(
|
||||||
|error| warn!(%error, "Failed to find original media key"),
|
|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)?;
|
let thumbnails = self.db.search_thumbnails_metadata(mxc)?;
|
||||||
for (_, thumbnail_key) in thumbnails {
|
for (_, thumbnail_key) in thumbnails {
|
||||||
|
|
@ -292,7 +298,7 @@ impl Service {
|
||||||
let (width, height, crop) =
|
let (width, height, crop) =
|
||||||
Self::thumbnail_properties(width, height).unwrap_or((0, 0, false));
|
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)
|
self.db.search_file_metadata(mxc.clone(), width, height)
|
||||||
{
|
{
|
||||||
debug!("Using saved thumbnail");
|
debug!("Using saved thumbnail");
|
||||||
|
|
@ -303,7 +309,8 @@ impl Service {
|
||||||
return Ok(Some((meta, file.clone())));
|
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 {
|
else {
|
||||||
debug!("Original image not found, can't generate thumbnail");
|
debug!("Original image not found, can't generate thumbnail");
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ pub(crate) trait Data: Send + Sync {
|
||||||
mxc: OwnedMxcUri,
|
mxc: OwnedMxcUri,
|
||||||
width: u32,
|
width: u32,
|
||||||
height: u32,
|
height: u32,
|
||||||
) -> Result<(FileMeta, MediaFileKey)>;
|
) -> Result<Option<(FileMeta, MediaFileKey)>>;
|
||||||
|
|
||||||
fn delete_file_metadata(&self, key: MediaFileKey) -> Result<()>;
|
fn delete_file_metadata(&self, key: MediaFileKey) -> Result<()>;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue