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