From ac8d16ba59758f9aba9a7f8ceb432ebda7be0885 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sat, 15 Nov 2025 12:41:32 +0100 Subject: [PATCH] feat: Update configuration handling and add debug logging for thumbnail processing --- .gitignore | 1 + Cargo.lock | 264 +++++++++++++++++++++-- libertas_core/Cargo.toml | 2 +- libertas_core/src/config.rs | 35 +-- libertas_worker/src/plugins/thumbnail.rs | 3 + 5 files changed, 279 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 337bc2f..016dd36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ target/ .sqlx/ media_library/ +thumbnail_library/ .ai/ .env \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index d31733c..3044055 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,6 +135,12 @@ dependencies = [ "password-hash", ] +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + [[package]] name = "arrayvec" version = "0.7.6" @@ -544,12 +550,61 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "config" +version = "0.15.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30fa8254caad766fc03cb0ccae691e14bf3bd72bfff27f72802ce729551b3d6" +dependencies = [ + "async-trait", + "convert_case", + "json5", + "pathdiff", + "ron", + "rust-ini", + "serde-untagged", + "serde_core", + "serde_json", + "toml 0.9.8", + "winnow", + "yaml-rust2", +] + [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -738,6 +793,15 @@ dependencies = [ "syn", ] +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + [[package]] name = "dotenvy" version = "0.15.7" @@ -822,15 +886,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "envy" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965" -dependencies = [ - "serde", -] - [[package]] name = "equator" version = "0.4.2" @@ -857,6 +912,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "etcetera" version = "0.8.0" @@ -1170,6 +1236,12 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" @@ -1586,6 +1658,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "jsonwebtoken" version = "10.1.0" @@ -1669,8 +1752,8 @@ dependencies = [ "async-trait", "bytes", "chrono", + "config", "dotenvy", - "envy", "futures", "nom-exif", "serde", @@ -2118,6 +2201,16 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + [[package]] name = "p256" version = "0.13.2" @@ -2188,6 +2281,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "pem" version = "3.0.6" @@ -2213,6 +2312,49 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "pest" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" +dependencies = [ + "pest", + "sha2", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -2577,6 +2719,20 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ron" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd490c5b18261893f14449cbd28cb9c0b637aebf161cd77900bfdedaff21ec32" +dependencies = [ + "bitflags", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + [[package]] name = "rsa" version = "0.9.8" @@ -2597,6 +2753,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rust-ini" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + [[package]] name = "rustc_version" version = "0.4.1" @@ -2761,6 +2927,18 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -2834,6 +3012,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3247,7 +3434,7 @@ dependencies = [ "cfg-expr", "heck", "pkg-config", - "toml", + "toml 0.8.23", "version-compare", ] @@ -3351,6 +3538,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinystr" version = "0.8.2" @@ -3466,11 +3662,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", - "serde_spanned", + "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_edit 0.22.27", ] +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", + "toml_parser", + "winnow", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -3497,7 +3706,7 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", - "serde_spanned", + "serde_spanned 0.6.9", "toml_datetime 0.6.11", "winnow", ] @@ -3649,12 +3858,24 @@ dependencies = [ "tokio", ] +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "unicase" version = "2.8.1" @@ -3688,6 +3909,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "untrusted" version = "0.9.0" @@ -4198,6 +4425,17 @@ dependencies = [ "thiserror 2.0.17", ] +[[package]] +name = "yaml-rust2" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + [[package]] name = "yoke" version = "0.8.1" diff --git a/libertas_core/Cargo.toml b/libertas_core/Cargo.toml index 529bb6f..b2a29a7 100644 --- a/libertas_core/Cargo.toml +++ b/libertas_core/Cargo.toml @@ -14,4 +14,4 @@ uuid = {version = "1.18.1", features = ["v4", "serde"] } serde = { version = "1.0.228", features = ["derive"] } nom-exif = { version = "2.5.4", features = ["serde", "async", "tokio"] } dotenvy = "0.15.7" -envy = "0.4.2" +config = "0.15.19" diff --git a/libertas_core/src/config.rs b/libertas_core/src/config.rs index e354b4f..d7a7755 100644 --- a/libertas_core/src/config.rs +++ b/libertas_core/src/config.rs @@ -2,27 +2,28 @@ use serde::Deserialize; use crate::error::{CoreError, CoreResult}; -#[derive(Deserialize, Clone)] +#[derive(Deserialize, Clone, Debug)] #[serde(rename_all = "lowercase")] pub enum DatabaseType { Postgres, Sqlite, } -#[derive(Deserialize, Clone)] +#[derive(Deserialize, Clone, Debug)] pub struct DatabaseConfig { pub db_type: DatabaseType, pub url: String, } -#[derive(Deserialize, Clone)] + +#[derive(Deserialize, Clone, Debug)] #[serde(rename_all = "lowercase")] pub enum ThumbnailFormat { Jpeg, Webp, } -#[derive(Deserialize, Clone)] +#[derive(Deserialize, Clone, Debug)] pub struct ThumbnailConfig { pub format: ThumbnailFormat, pub quality: u8, @@ -31,7 +32,7 @@ pub struct ThumbnailConfig { pub library_path: String, } -#[derive(Deserialize, Clone)] +#[derive(Deserialize, Clone, Debug)] pub struct Config { pub database_url: String, pub database_db_type: DatabaseType, @@ -49,7 +50,6 @@ pub struct Config { #[serde(default = "default_allowed_sort_columns")] pub allowed_sort_columns: Vec, - #[serde(flatten)] pub thumbnail_config: Option, } @@ -59,7 +59,7 @@ fn default_allowed_sort_columns() -> Vec { vec!["created_at".to_string(), "original_filename".to_string()] } -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct AppConfig { pub database: DatabaseConfig, pub server_address: String, @@ -73,14 +73,25 @@ pub struct AppConfig { } pub fn load_config() -> CoreResult { - // Load the .env file at that specific path - let env_path = dotenvy::dotenv() + let env_path = dotenvy::dotenv() .map_err(|e| CoreError::Config(format!("Failed to load .env file: {}", e)))?; - println!("Loaded config from {}", env_path.display()); - let config = envy::from_env::() - .map_err(|e| CoreError::Config(format!("Failed to load config from env: {}", e)))?; + let config = config::Config::builder() + .add_source(config::Environment::default() + .with_list_parse_key("allowed_sort_columns") + .list_separator(",") + .try_parsing(true) + .separator("__") + ) + .build() + .map_err(|e| CoreError::Config(format!("Failed to build config: {}", e)))?; + + let config: Config = config + .try_deserialize() + .map_err(|e| CoreError::Config(format!("Failed to deserialize config: {}", e)))?; + println!("Built config from environment variables. Contents: {:?}", config); + Ok(AppConfig { database: DatabaseConfig { diff --git a/libertas_worker/src/plugins/thumbnail.rs b/libertas_worker/src/plugins/thumbnail.rs index 639f94e..dfbba06 100644 --- a/libertas_worker/src/plugins/thumbnail.rs +++ b/libertas_worker/src/plugins/thumbnail.rs @@ -14,6 +14,9 @@ impl MediaProcessorPlugin for ThumbnailPlugin { async fn process(&self, media: &Media, context: &PluginContext) -> CoreResult { let config = &context.config.thumbnail_config; + + println!("Thumbnail config: {:?}", config); + if config.is_none() { return Ok(PluginData { message: "Thumbnail generation is disabled in config.".to_string(),