Skip to main content

syncweb_core/sync/
deleted.rs

1use std::{collections::HashMap, path::PathBuf, time::SystemTime};
2
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6/// Metadata retained for a deleted entry.
7#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
8#[non_exhaustive]
9pub struct DeletedInfo {
10    pub path: PathBuf,
11    pub size: u64,
12    pub deleted_by: Uuid,
13    pub deleted_at: SystemTime,
14}
15
16/// A batch of entries pruned by one synchronization session.
17#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
18#[non_exhaustive]
19pub struct PruneEvent {
20    pub pruned: Vec<blake3::Hash>,
21    pub by: Uuid,
22}
23
24impl PruneEvent {
25    #[must_use]
26    pub const fn new(pruned: Vec<blake3::Hash>, by: Uuid) -> Self {
27        Self { pruned, by }
28    }
29}
30
31/// Tracks files that were observed locally and later deleted.
32#[derive(Clone, Debug, Default)]
33pub struct DeletedTracker {
34    deleted: HashMap<blake3::Hash, DeletedInfo>,
35}
36
37impl DeletedTracker {
38    #[must_use]
39    pub fn new() -> Self {
40        Self::default()
41    }
42
43    pub fn record_deletion(&mut self, hash: blake3::Hash, path: impl Into<PathBuf>, size: u64, session: Uuid) {
44        self.deleted.insert(
45            hash,
46            DeletedInfo {
47                path: path.into(),
48                size,
49                deleted_by: session,
50                deleted_at: SystemTime::now(),
51            },
52        );
53    }
54
55    #[must_use]
56    pub fn is_deleted(&self, hash: &blake3::Hash) -> bool {
57        self.deleted.contains_key(hash)
58    }
59
60    #[must_use]
61    pub fn deletion_info(&self, hash: &blake3::Hash) -> Option<&DeletedInfo> {
62        self.deleted.get(hash)
63    }
64
65    pub fn restore(&mut self, hash: &blake3::Hash) -> Option<DeletedInfo> {
66        self.deleted.remove(hash)
67    }
68
69    /// Restore metadata for an entry under the name used by the CLI.
70    pub fn undelete(&mut self, hash: &blake3::Hash) -> Option<DeletedInfo> {
71        self.restore(hash)
72    }
73
74    pub fn iter(&self) -> impl Iterator<Item = (&blake3::Hash, &DeletedInfo)> {
75        self.deleted.iter()
76    }
77
78    #[must_use]
79    pub fn len(&self) -> usize {
80        self.deleted.len()
81    }
82
83    #[must_use]
84    pub fn is_empty(&self) -> bool {
85        self.deleted.is_empty()
86    }
87}