diff --git a/src/lib.rs b/src/lib.rs index 60c0137..b222307 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,7 @@ pub struct AppState { pub db: Database, pub config: Config, pub webdav_scheduler: Option>, + pub source_scheduler: Option>, } /// Health check endpoint for monitoring diff --git a/src/main.rs b/src/main.rs index 9a062b8..2cf3c8f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -135,6 +135,7 @@ async fn main() -> Result<(), Box> { db: web_db, config: config.clone(), webdav_scheduler: None, // Will be set after creating scheduler + source_scheduler: None, // Will be set after creating scheduler }; let web_state = Arc::new(web_state); @@ -143,6 +144,7 @@ async fn main() -> Result<(), Box> { db: background_db, config: config.clone(), webdav_scheduler: None, + source_scheduler: None, }; let background_state = Arc::new(background_state); @@ -220,6 +222,7 @@ async fn main() -> Result<(), Box> { db: web_state.db.clone(), config: web_state.config.clone(), webdav_scheduler: Some(webdav_scheduler.clone()), + source_scheduler: Some(source_scheduler.clone()), }; let web_state = Arc::new(updated_web_state); diff --git a/src/routes/sources.rs b/src/routes/sources.rs index 9289259..501c84c 100644 --- a/src/routes/sources.rs +++ b/src/routes/sources.rs @@ -7,6 +7,7 @@ use axum::{ }; use std::sync::Arc; use uuid::Uuid; +use tracing::error; use crate::{ auth::AuthUser, @@ -262,26 +263,52 @@ async fn trigger_sync( .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; - // Trigger the appropriate sync based on source type - match source.source_type { - crate::models::SourceType::WebDAV => { - // Send a message to trigger WebDAV sync - if let Some(scheduler) = &state.webdav_scheduler { - scheduler.trigger_sync(source_id).await; - } - } - _ => { - // Other source types not implemented yet + // Trigger sync using the universal source scheduler + if let Some(scheduler) = &state.source_scheduler { + if let Err(e) = scheduler.trigger_sync(source_id).await { + error!("Failed to trigger sync for source {}: {}", source_id, e); state .db .update_source_status( source_id, crate::models::SourceStatus::Error, - Some("Source type not implemented".to_string()), + Some(format!("Failed to trigger sync: {}", e)), ) .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; - return Err(StatusCode::NOT_IMPLEMENTED); + return Err(StatusCode::INTERNAL_SERVER_ERROR); + } + } else { + // Fallback to WebDAV scheduler for backward compatibility + match source.source_type { + crate::models::SourceType::WebDAV => { + if let Some(webdav_scheduler) = &state.webdav_scheduler { + webdav_scheduler.trigger_sync(source_id).await; + } else { + state + .db + .update_source_status( + source_id, + crate::models::SourceStatus::Error, + Some("No scheduler available".to_string()), + ) + .await + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + return Err(StatusCode::INTERNAL_SERVER_ERROR); + } + } + _ => { + state + .db + .update_source_status( + source_id, + crate::models::SourceStatus::Error, + Some("Source type not supported".to_string()), + ) + .await + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + return Err(StatusCode::NOT_IMPLEMENTED); + } } }