Skip to main content

reifydb_transaction/transaction/catalog/
user.rs

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