use anyhow::Result; use diesel::prelude::*; use std::fs; use uuidv7::Uuid; pub mod api; pub mod config; pub mod db; pub use config::CONFIG; pub const ASCII_LOGO: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/assets/logo.txt")); pub fn init() { println!("{}\n", ASCII_LOGO); log::info!("Initializing config from environment variables"); let _ = *CONFIG; log::info!("Config: {:?}", *CONFIG); } pub fn prune_single(entry: &str) -> Result<()> { let path = format!("{}/{}", CONFIG.data_dir, entry); log::info!("Pruning: {}", path); if fs::metadata(&path).is_ok() { fs::remove_file(&path).or_else(|_| fs::remove_dir_all(&path))?; log::info!("File or directory deleted successfully: {}", path); } else { log::warn!("File or directory does not exist: {}", path); } Ok(()) } pub fn prune_many(ids: &[String]) -> Result<()> { ids.iter().try_for_each(|s| prune_single(s))?; Ok(()) } pub fn prune(db_conn: &mut db::Connection) -> Result<()> { log::info!("Pruning deactivated directories"); let ids: Vec = db::schema::directories::table .select(db::schema::directories::id) .filter(db::schema::directories::active.eq(false)) .load(db_conn)?; prune_many(&ids.iter().map(|id| id.to_string()).collect::>())?; diesel::delete(db::schema::directories::table.filter(db::schema::directories::id.eq_any(ids))) .execute(db_conn)?; log::info!("Pruning done"); Ok(()) } pub fn prune_job() { const NAME: &str = "prune"; log::info!("Starting cron job: {}", NAME); let db_conn = &mut match db::POOL.get() { Ok(x) => x, Err(e) => { log::error!("{}: {:?}", NAME, e); return; } }; if let Err(e) = prune(db_conn) { log::error!("{}: {:?}", NAME, e); } }