use mediarepo_core::bromine::ipc::context::Context; use mediarepo_core::content_descriptor::decode_content_descriptor; use mediarepo_core::error::{RepoError, RepoResult}; use mediarepo_core::mediarepo_api::types::identifier::FileIdentifier; use mediarepo_core::mediarepo_api::types::repo::SizeType; use mediarepo_core::type_keys::{RepoPathKey, SettingsKey}; use mediarepo_core::utils::get_folder_size; use mediarepo_logic::dao::repo::Repo; use mediarepo_logic::dao::DaoProvider; use mediarepo_logic::dto::FileDto; use mediarepo_logic::type_keys::RepoKey; use std::sync::Arc; use tokio::fs; pub async fn get_repo_from_context(ctx: &Context) -> Arc { let data = ctx.data.read().await; let repo = data.get::().unwrap(); Arc::clone(repo) } pub async fn file_by_identifier(identifier: FileIdentifier, repo: &Repo) -> RepoResult { let file = match identifier { FileIdentifier::ID(id) => repo.file().by_id(id).await, FileIdentifier::CD(cd) => repo.file().by_cd(decode_content_descriptor(cd)?).await, }?; file.ok_or_else(|| RepoError::from("File not found")) } pub async fn cd_by_identifier(identifier: FileIdentifier, repo: &Repo) -> RepoResult> { match identifier { FileIdentifier::ID(id) => { let file = repo .file() .by_id(id) .await? .ok_or_else(|| "Thumbnail not found")?; Ok(file.cd().to_owned()) } FileIdentifier::CD(cd) => decode_content_descriptor(cd), } } pub async fn calculate_size(size_type: &SizeType, ctx: &Context) -> RepoResult { let repo = get_repo_from_context(ctx).await; let (repo_path, settings) = { let data = ctx.data.read().await; ( data.get::().unwrap().clone(), data.get::().unwrap().clone(), ) }; let size = match &size_type { SizeType::Total => get_folder_size(repo_path).await?, SizeType::FileFolder => repo.get_main_store_size().await?, SizeType::ThumbFolder => repo.get_thumb_store_size().await?, SizeType::DatabaseFile => { let db_path = settings.paths.db_file_path(&repo_path); let database_metadata = fs::metadata(db_path).await?; database_metadata.len() } }; Ok(size) }