1#![allow(clippy::print_stdout)]
4
5use crate::Result;
6use crate::services::TombstoneService;
7use crate::storage::get_user_data_dir;
8use crate::storage::persistence::FilesystemBackend;
9use std::sync::Arc;
10use std::time::Duration;
11
12pub fn execute(dry_run: bool, purge: bool, older_than_days: u64) -> Result<()> {
18 let data_dir = get_user_data_dir()?;
20 let persistence = Arc::new(FilesystemBackend::new(data_dir.join("memories")))
21 as Arc<dyn crate::storage::traits::PersistenceBackend>;
22 let tombstone_service = TombstoneService::new(persistence.clone());
23
24 if dry_run {
25 println!("Dry-run mode: showing what would be deleted\n");
26
27 let all_ids = persistence.list_ids()?;
29 let mut tombstoned_count = 0;
30
31 for id in all_ids {
32 let Some(memory) = persistence.get(&id)? else {
33 continue;
34 };
35 if memory.status != crate::models::MemoryStatus::Tombstoned {
36 continue;
37 }
38 tombstoned_count += 1;
39 println!(
40 "Would delete: {} ({})",
41 id.as_str(),
42 memory.namespace.as_str()
43 );
44 }
45
46 println!("\nTotal tombstoned memories: {tombstoned_count}");
47 return Ok(());
48 }
49
50 if purge {
51 let older_than = Duration::from_secs(older_than_days * 24 * 60 * 60);
52 let purged = tombstone_service.purge_tombstoned(older_than)?;
53
54 println!("Purged {purged} tombstoned memories older than {older_than_days} days");
55 } else {
56 println!("Garbage collection complete");
57 println!("Use --purge to permanently delete tombstoned memories");
58 println!("Use --dry-run to preview what would be deleted");
59 }
60
61 Ok(())
62}