reifydb_transaction/transaction/catalog/
user_role.rs1use reifydb_core::interface::catalog::{
5 change::CatalogTrackUserRoleChangeOperations,
6 user::{RoleId, UserId, UserRoleDef},
7};
8use reifydb_type::Result;
9
10use crate::{
11 change::{
12 Change,
13 OperationType::{Create, Delete},
14 TransactionalUserRoleChanges,
15 },
16 transaction::{admin::AdminTransaction, subscription::SubscriptionTransaction},
17};
18
19impl CatalogTrackUserRoleChangeOperations for AdminTransaction {
20 fn track_user_role_def_created(&mut self, user_role: UserRoleDef) -> Result<()> {
21 let change = Change {
22 pre: None,
23 post: Some(user_role),
24 op: Create,
25 };
26 self.changes.add_user_role_def_change(change);
27 Ok(())
28 }
29
30 fn track_user_role_def_deleted(&mut self, user_role: UserRoleDef) -> Result<()> {
31 let change = Change {
32 pre: Some(user_role),
33 post: None,
34 op: Delete,
35 };
36 self.changes.add_user_role_def_change(change);
37 Ok(())
38 }
39}
40
41impl TransactionalUserRoleChanges for AdminTransaction {
42 fn find_user_role(&self, user: UserId, role: RoleId) -> Option<&UserRoleDef> {
43 for change in self.changes.user_role_def.iter().rev() {
44 if let Some(ur) = &change.post {
45 if ur.user_id == user && ur.role_id == role {
46 return Some(ur);
47 }
48 } else if let Some(ur) = &change.pre {
49 if ur.user_id == user && ur.role_id == role && change.op == Delete {
50 return None;
51 }
52 }
53 }
54 None
55 }
56
57 fn is_user_role_deleted(&self, user: UserId, role: RoleId) -> bool {
58 self.changes.user_role_def.iter().rev().any(|change| {
59 change.op == Delete
60 && change
61 .pre
62 .as_ref()
63 .map(|ur| ur.user_id == user && ur.role_id == role)
64 .unwrap_or(false)
65 })
66 }
67}
68
69impl CatalogTrackUserRoleChangeOperations for SubscriptionTransaction {
70 fn track_user_role_def_created(&mut self, user_role: UserRoleDef) -> Result<()> {
71 self.inner.track_user_role_def_created(user_role)
72 }
73
74 fn track_user_role_def_deleted(&mut self, user_role: UserRoleDef) -> Result<()> {
75 self.inner.track_user_role_def_deleted(user_role)
76 }
77}
78
79impl TransactionalUserRoleChanges for SubscriptionTransaction {
80 fn find_user_role(&self, user: UserId, role: RoleId) -> Option<&UserRoleDef> {
81 self.inner.find_user_role(user, role)
82 }
83
84 fn is_user_role_deleted(&self, user: UserId, role: RoleId) -> bool {
85 self.inner.is_user_role_deleted(user, role)
86 }
87}