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