reifydb_transaction/transaction/catalog/
policy.rs1use reifydb_core::interface::catalog::{
5 change::CatalogTrackPolicyChangeOperations,
6 policy::{PolicyDef, PolicyId},
7};
8use reifydb_type::Result;
9
10use crate::{
11 change::{
12 Change,
13 OperationType::{Create, Delete, Update},
14 TransactionalPolicyChanges,
15 },
16 transaction::{admin::AdminTransaction, subscription::SubscriptionTransaction},
17};
18
19impl CatalogTrackPolicyChangeOperations for AdminTransaction {
20 fn track_policy_def_created(&mut self, policy: PolicyDef) -> Result<()> {
21 let change = Change {
22 pre: None,
23 post: Some(policy),
24 op: Create,
25 };
26 self.changes.add_policy_def_change(change);
27 Ok(())
28 }
29
30 fn track_policy_def_updated(&mut self, pre: PolicyDef, post: PolicyDef) -> Result<()> {
31 let change = Change {
32 pre: Some(pre),
33 post: Some(post),
34 op: Update,
35 };
36 self.changes.add_policy_def_change(change);
37 Ok(())
38 }
39
40 fn track_policy_def_deleted(&mut self, policy: PolicyDef) -> Result<()> {
41 let change = Change {
42 pre: Some(policy),
43 post: None,
44 op: Delete,
45 };
46 self.changes.add_policy_def_change(change);
47 Ok(())
48 }
49}
50
51impl TransactionalPolicyChanges for AdminTransaction {
52 fn find_policy(&self, id: PolicyId) -> Option<&PolicyDef> {
53 for change in self.changes.policy_def.iter().rev() {
54 if let Some(policy) = &change.post {
55 if policy.id == id {
56 return Some(policy);
57 }
58 } else if let Some(policy) = &change.pre {
59 if policy.id == id && change.op == Delete {
60 return None;
61 }
62 }
63 }
64 None
65 }
66
67 fn find_policy_by_name(&self, name: &str) -> Option<&PolicyDef> {
68 self.changes
69 .policy_def
70 .iter()
71 .rev()
72 .find_map(|change| change.post.as_ref().filter(|p| p.name.as_deref() == Some(name)))
73 }
74
75 fn is_policy_deleted(&self, id: PolicyId) -> bool {
76 self.changes
77 .policy_def
78 .iter()
79 .rev()
80 .any(|change| change.op == Delete && change.pre.as_ref().map(|p| p.id) == Some(id))
81 }
82
83 fn is_policy_deleted_by_name(&self, name: &str) -> bool {
84 self.changes.policy_def.iter().rev().any(|change| {
85 change.op == Delete
86 && change.pre.as_ref().map(|p| p.name.as_deref() == Some(name)).unwrap_or(false)
87 })
88 }
89}
90
91impl CatalogTrackPolicyChangeOperations for SubscriptionTransaction {
92 fn track_policy_def_created(&mut self, policy: PolicyDef) -> Result<()> {
93 self.inner.track_policy_def_created(policy)
94 }
95
96 fn track_policy_def_updated(&mut self, pre: PolicyDef, post: PolicyDef) -> Result<()> {
97 self.inner.track_policy_def_updated(pre, post)
98 }
99
100 fn track_policy_def_deleted(&mut self, policy: PolicyDef) -> Result<()> {
101 self.inner.track_policy_def_deleted(policy)
102 }
103}
104
105impl TransactionalPolicyChanges for SubscriptionTransaction {
106 fn find_policy(&self, id: PolicyId) -> Option<&PolicyDef> {
107 self.inner.find_policy(id)
108 }
109
110 fn find_policy_by_name(&self, name: &str) -> Option<&PolicyDef> {
111 self.inner.find_policy_by_name(name)
112 }
113
114 fn is_policy_deleted(&self, id: PolicyId) -> bool {
115 self.inner.is_policy_deleted(id)
116 }
117
118 fn is_policy_deleted_by_name(&self, name: &str) -> bool {
119 self.inner.is_policy_deleted_by_name(name)
120 }
121}