Skip to main content

reifydb_transaction/transaction/catalog/
user_role.rs

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