feat(backend): add periodic rescans (#82)
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
Tomáš Mládek 2024-06-30 22:09:57 +02:00
parent 1bb2c3afd9
commit 94464c6cd8

View file

@ -217,6 +217,10 @@ struct ServeArgs {
/// Allowed host/domain name the API can serve. /// Allowed host/domain name the API can serve.
#[arg(long, env = "UPEND_ALLOW_HOST")] #[arg(long, env = "UPEND_ALLOW_HOST")]
allow_host: Vec<String>, allow_host: Vec<String>,
/// Periodic update interval (in minutes).
#[arg(long, env = "UPEND_UPDATE_INTERVAL", default_value_t = 720)]
update_interval: i64,
} }
#[actix_web::main] #[actix_web::main]
@ -465,7 +469,7 @@ async fn main() -> Result<()> {
let state = routes::State { let state = routes::State {
upend: upend.clone(), upend: upend.clone(),
store, store: store.clone(),
job_container: job_container.clone(), job_container: job_container.clone(),
preview_store, preview_store,
preview_thread_pool, preview_thread_pool,
@ -513,6 +517,9 @@ async fn main() -> Result<()> {
if !args.no_initial_update && (!open_result.new || args.rescan_mode.is_some()) { if !args.no_initial_update && (!open_result.new || args.rescan_mode.is_some()) {
info!("Running update..."); info!("Running update...");
let upend = upend.clone();
let store = store.clone();
let job_container = job_container.clone();
block_background::<_, _, anyhow::Error>(move || { block_background::<_, _, anyhow::Error>(move || {
let connection: upend_db::UpEndConnection = upend.connection()?; let connection: upend_db::UpEndConnection = upend.connection()?;
@ -529,7 +536,7 @@ async fn main() -> Result<()> {
.unwrap_or_default() .unwrap_or_default()
}; };
let _ = state.store.update( let _ = store.update(
&upend, &upend,
job_container.clone(), job_container.clone(),
upend_db::stores::UpdateOptions { upend_db::stores::UpdateOptions {
@ -540,7 +547,7 @@ async fn main() -> Result<()> {
); );
let _ = extractors::extract_all( let _ = extractors::extract_all(
upend, upend,
state.store, store,
job_container, job_container,
OperationContext::default(), 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")] #[cfg(feature = "desktop")]
{ {
if browser_enabled { if browser_enabled {