syncweb_core/sync/
deleted.rs1use std::{collections::HashMap, path::PathBuf, time::SystemTime};
2
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6#[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#[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#[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 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}