diff --git a/cli/src/main.rs b/cli/src/main.rs index ae05a63..2b72fd9 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -217,6 +217,10 @@ struct ServeArgs { /// Allowed host/domain name the API can serve. #[arg(long, env = "UPEND_ALLOW_HOST")] allow_host: Vec, + + /// Periodic update interval (in minutes). + #[arg(long, env = "UPEND_UPDATE_INTERVAL", default_value_t = 720)] + update_interval: i64, } #[actix_web::main] @@ -465,7 +469,7 @@ async fn main() -> Result<()> { let state = routes::State { upend: upend.clone(), - store, + store: store.clone(), job_container: job_container.clone(), preview_store, preview_thread_pool, @@ -513,6 +517,9 @@ async fn main() -> Result<()> { if !args.no_initial_update && (!open_result.new || args.rescan_mode.is_some()) { info!("Running update..."); + let upend = upend.clone(); + let store = store.clone(); + let job_container = job_container.clone(); block_background::<_, _, anyhow::Error>(move || { let connection: upend_db::UpEndConnection = upend.connection()?; @@ -529,7 +536,7 @@ async fn main() -> Result<()> { .unwrap_or_default() }; - let _ = state.store.update( + let _ = store.update( &upend, job_container.clone(), upend_db::stores::UpdateOptions { @@ -540,7 +547,7 @@ async fn main() -> Result<()> { ); let _ = extractors::extract_all( upend, - state.store, + store, job_container, OperationContext::default(), ); @@ -548,6 +555,39 @@ async fn main() -> Result<()> { }); } + if args.update_interval > 0 { + let _thread = std::thread::spawn(move || { + loop { + debug!("Waiting for {} minutes before next update...", args.update_interval); + std::thread::sleep(std::time::Duration::from_secs(60 * args.update_interval as u64)); + let upend = upend.clone(); + let store = store.clone(); + let job_container = job_container.clone(); + let _ = block_background::<_, _, anyhow::Error>(move || { + info!("Running periodic vault update."); + let connection = upend.connection()?; + let tree_mode = connection.get_vault_options()?.blob_mode.unwrap_or_default(); + let _ = store.update( + &upend, + job_container.clone(), + upend_db::stores::UpdateOptions { + initial: false, + tree_mode, + }, + OperationContext::default(), + ); + let _ = extractors::extract_all( + upend, + store, + job_container, + OperationContext::default(), + ); + Ok(()) + }); + } + }); + } + #[cfg(feature = "desktop")] { if browser_enabled {