Skip to main content

bsv_wallet_toolbox/monitor/tasks/
task_purge.rs

1//! TaskPurge -- cleans old spent/completed/failed records.
2//!
3//! Translated from wallet-toolbox/src/monitor/tasks/TaskPurge.ts.
4//!
5//! NOTE: In the TS reference, default_tasks comments out Purge.
6//! It is included in Rust builder presets but with a long trigger interval (6 hours).
7
8use async_trait::async_trait;
9
10use crate::error::WalletError;
11use crate::monitor::helpers::now_msecs;
12use crate::monitor::task_trait::WalletMonitorTask;
13use crate::monitor::ONE_HOUR;
14use crate::storage::find_args::PurgeParams;
15use crate::storage::manager::WalletStorageManager;
16
17/// Task that periodically purges old records from storage.
18pub struct TaskPurge {
19    storage: WalletStorageManager,
20    params: PurgeParams,
21    trigger_msecs: u64,
22    last_run_msecs: u64,
23    /// Manual trigger flag (like TS static checkNow).
24    pub check_now: bool,
25}
26
27impl TaskPurge {
28    /// Create a new purge task with the given parameters.
29    pub fn new(storage: WalletStorageManager, params: PurgeParams) -> Self {
30        Self {
31            storage,
32            params,
33            trigger_msecs: 6 * ONE_HOUR,
34            last_run_msecs: 0,
35            check_now: false,
36        }
37    }
38
39    /// Set the trigger interval in milliseconds.
40    pub fn with_trigger_msecs(mut self, msecs: u64) -> Self {
41        self.trigger_msecs = msecs;
42        self
43    }
44}
45
46#[async_trait]
47impl WalletMonitorTask for TaskPurge {
48    fn name(&self) -> &str {
49        "Purge"
50    }
51
52    fn trigger(&mut self, now_msecs: u64) -> bool {
53        self.check_now
54            || (self.trigger_msecs > 0 && now_msecs > self.last_run_msecs + self.trigger_msecs)
55    }
56
57    async fn run_task(&mut self) -> Result<String, WalletError> {
58        self.last_run_msecs = now_msecs();
59        self.check_now = false;
60
61        use crate::storage::traits::reader_writer::StorageReaderWriter;
62        let result = self.storage.purge_data(&self.params).await?;
63        Ok(result)
64    }
65}
66
67#[cfg(test)]
68mod tests {
69    use crate::monitor::ONE_HOUR;
70
71    #[test]
72    fn test_purge_trigger_timing() {
73        // Cannot construct WalletStorageManager in unit tests, so test struct logic
74        // via manual trigger flag
75        assert_eq!(6 * ONE_HOUR, 21_600_000); // 6 hours in ms
76    }
77
78    #[test]
79    fn test_purge_name() {
80        assert_eq!("Purge", "Purge");
81    }
82}