Skip to main content

reifydb_transaction/transaction/catalog/
policy.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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}