From be2d70739109e770311c4a8d53c00b1d036a7e6c Mon Sep 17 00:00:00 2001 From: Rowan Lewis Date: Tue, 13 Mar 2018 23:17:01 +0100 Subject: [PATCH] Replaced played_cleanup function with a function that accepts a closure. --- hammond-data/src/utils.rs | 62 +++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/hammond-data/src/utils.rs b/hammond-data/src/utils.rs index 29138f1..af2adc6 100644 --- a/hammond-data/src/utils.rs +++ b/hammond-data/src/utils.rs @@ -13,6 +13,7 @@ use xdg_dirs::DL_DIR; use std::fs; use std::path::Path; +use std::sync::Arc; /// Scan downloaded `episode` entries that might have broken `local_uri`s and /// set them to `None`. @@ -38,26 +39,31 @@ fn download_checker() -> Result<(), DataError> { Ok(()) } -/// Delete watched `episodes` that have exceded their liftime after played. -fn played_cleaner() -> Result<(), DataError> { +fn delete_expired_played_episodes() -> Result<(), DataError> { + let expiry = Utc::now().timestamp() as i32; + + expiry -= 172_800; + + delete_played_episodes(|ep| ep.played().is_some() && ep.played().unwrap() > expiry) +} + +fn delete_all_played_episodes() -> Result<(), DataError> { + delete_played_episodes(|ep| ep.played().is_some()) +} + +fn delete_played_episodes(filter: F) -> Result<(), DataError> where F: FnOnce(&EpisodeCleanerQuery) -> bool + Send + Sync { let mut episodes = dbqueries::get_played_cleaner_episodes()?; - let now_utc = Utc::now().timestamp() as i32; episodes .par_iter_mut() - .filter(|ep| ep.local_uri().is_some() && ep.played().is_some()) + .filter(|ep| ep.local_uri().is_some() && filter(ep)) .for_each(|ep| { - // TODO: expose a config and a user set option. - // Chnage the test too when exposed - let limit = ep.played().unwrap() + 172_800; // add 2days in seconds - if now_utc > limit { - if let Err(err) = delete_local_content(ep) { - error!("Error while trying to delete file: {:?}", ep.local_uri()); - error!("{}", err); - } else { - info!("Episode {:?} was deleted succesfully.", ep.local_uri()); - }; - } + if let Err(err) = delete_local_content(ep) { + error!("Error while trying to delete file: {:?}", ep.local_uri()); + error!("{}", err); + } else { + info!("Episode {:?} was deleted succesfully.", ep.local_uri()); + }; }); Ok(()) } @@ -95,7 +101,7 @@ fn delete_local_content(ep: &mut EpisodeCleanerQuery) -> Result<(), DataError> { pub fn checkup() -> Result<(), DataError> { info!("Running database checks."); download_checker()?; - played_cleaner()?; + delete_expired_played_episodes()?; info!("Checks completed."); Ok(()) } @@ -258,37 +264,49 @@ mod tests { } #[test] - fn test_played_cleaner_expired() { + fn test_delete_expired_played_episodes_some() { let _tmp_dir = helper_db(); let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap(); let now_utc = Utc::now().timestamp() as i32; - // let limit = now_utc - 172_800; let epoch = now_utc - 200_000; episode.set_played(Some(epoch)); episode.save().unwrap(); let valid_path = episode.local_uri().unwrap().to_owned(); // This should delete the file - played_cleaner().unwrap(); + delete_expired_played_episodes().unwrap(); assert_eq!(Path::new(&valid_path).exists(), false); } #[test] - fn test_played_cleaner_none() { + fn test_delete_expired_played_episodes_none() { let _tmp_dir = helper_db(); let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap(); let now_utc = Utc::now().timestamp() as i32; - // limit = 172_800; let epoch = now_utc - 20_000; episode.set_played(Some(epoch)); episode.save().unwrap(); let valid_path = episode.local_uri().unwrap().to_owned(); // This should not delete the file - played_cleaner().unwrap(); + delete_expired_played_episodes().unwrap(); assert_eq!(Path::new(&valid_path).exists(), true); } + #[test] + fn test_delete_all_played_episodes() { + let _tmp_dir = helper_db(); + let mut episode = dbqueries::get_episode_from_pk("foo_bar", 0).unwrap(); + let now_utc = Utc::now().timestamp() as i32; + episode.set_played(Some(now_utc)); + episode.save().unwrap(); + let valid_path = episode.local_uri().unwrap().to_owned(); + + // This should delete the file + delete_all_played_episodes().unwrap(); + assert_eq!(Path::new(&valid_path).exists(), false); + } + #[test] fn test_url_cleaner() { let good_url = "http://traffic.megaphone.fm/FL8608731318.mp3";