use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum IsolationLevel {
Strict,
Standard,
Shared,
}
impl Default for IsolationLevel {
fn default() -> Self {
IsolationLevel::Standard
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TenantPermissions {
pub can_create: bool,
pub can_read: bool,
pub can_update: bool,
pub can_delete: bool,
pub can_list: bool,
pub max_users: Option<usize>,
pub max_groups: Option<usize>,
}
impl Default for TenantPermissions {
fn default() -> Self {
Self {
can_create: true,
can_read: true,
can_update: true,
can_delete: true,
can_list: true,
max_users: None,
max_groups: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TenantContext {
pub tenant_id: String,
pub client_id: String,
pub isolation_level: IsolationLevel,
pub permissions: TenantPermissions,
}
impl TenantContext {
pub fn new(tenant_id: String, client_id: String) -> Self {
Self {
tenant_id,
client_id,
isolation_level: IsolationLevel::default(),
permissions: TenantPermissions::default(),
}
}
pub fn with_isolation_level(mut self, level: IsolationLevel) -> Self {
self.isolation_level = level;
self
}
pub fn with_permissions(mut self, permissions: TenantPermissions) -> Self {
self.permissions = permissions;
self
}
pub fn can_perform_operation(&self, operation: &str) -> bool {
match operation {
"create" => self.permissions.can_create,
"read" => self.permissions.can_read,
"update" => self.permissions.can_update,
"delete" => self.permissions.can_delete,
"list" => self.permissions.can_list,
_ => false,
}
}
pub fn check_user_limit(&self, current_count: usize) -> bool {
match self.permissions.max_users {
Some(limit) => current_count < limit,
None => true,
}
}
pub fn check_group_limit(&self, current_count: usize) -> bool {
match self.permissions.max_groups {
Some(limit) => current_count < limit,
None => true,
}
}
}