use std::sync::Arc;
use async_trait::async_trait;
use crate::error::WalletError;
use crate::monitor::helpers::now_msecs;
use crate::monitor::task_trait::WalletMonitorTask;
use crate::monitor::ONE_HOUR;
use crate::storage::find_args::PurgeParams;
use crate::storage::manager::WalletStorageManager;
pub struct TaskPurge {
storage: Arc<WalletStorageManager>,
params: PurgeParams,
trigger_msecs: u64,
last_run_msecs: u64,
pub check_now: bool,
}
impl TaskPurge {
pub fn new(storage: Arc<WalletStorageManager>, params: PurgeParams) -> Self {
Self {
storage,
params,
trigger_msecs: 6 * ONE_HOUR,
last_run_msecs: 0,
check_now: false,
}
}
pub fn with_trigger_msecs(mut self, msecs: u64) -> Self {
self.trigger_msecs = msecs;
self
}
}
#[async_trait]
impl WalletMonitorTask for TaskPurge {
fn storage_manager(&self) -> Option<&WalletStorageManager> {
Some(&self.storage)
}
fn name(&self) -> &str {
"Purge"
}
fn trigger(&mut self, now_msecs: u64) -> bool {
self.check_now
|| (self.trigger_msecs > 0 && now_msecs > self.last_run_msecs + self.trigger_msecs)
}
async fn run_task(&mut self) -> Result<String, WalletError> {
self.last_run_msecs = now_msecs();
self.check_now = false;
let result = self.storage.purge_data(&self.params).await?;
Ok(result)
}
}
#[cfg(test)]
mod tests {
use crate::monitor::ONE_HOUR;
#[test]
fn test_purge_trigger_timing() {
assert_eq!(6 * ONE_HOUR, 21_600_000); }
#[test]
fn test_purge_name() {
assert_eq!("Purge", "Purge");
}
}