use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserPreferences {
pub language: Option<String>,
pub timezone: Option<String>,
pub email_notifications: bool,
pub slack_notifications: bool,
pub dashboard_config: HashMap<String, serde_json::Value>,
}
impl Default for UserPreferences {
fn default() -> Self {
Self {
language: Some("en".to_string()),
timezone: Some("UTC".to_string()),
email_notifications: true,
slack_notifications: false,
dashboard_config: HashMap::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TeamSettings {
pub default_model: Option<String>,
pub auto_approve_members: bool,
pub require_approval_for_high_cost: bool,
pub high_cost_threshold: Option<f64>,
pub rate_limits: Option<crate::core::virtual_keys::RateLimits>,
}
impl Default for TeamSettings {
fn default() -> Self {
Self {
default_model: None,
auto_approve_members: true,
require_approval_for_high_cost: false,
high_cost_threshold: Some(10.0),
rate_limits: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrganizationSettings {
pub sso_config: Option<SSOConfig>,
pub default_team: Option<String>,
pub require_email_verification: bool,
pub password_policy: PasswordPolicy,
pub session_timeout_minutes: u32,
pub allowed_email_domains: Vec<String>,
}
impl Default for OrganizationSettings {
fn default() -> Self {
Self {
sso_config: None,
default_team: None,
require_email_verification: true,
password_policy: PasswordPolicy::default(),
session_timeout_minutes: 480, allowed_email_domains: vec![],
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SSOConfig {
pub provider: SSOProvider,
pub client_id: String,
pub client_secret: String,
pub auth_endpoint: String,
pub token_endpoint: String,
pub userinfo_endpoint: String,
pub scopes: Vec<String>,
pub attribute_mappings: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SSOProvider {
Google,
Microsoft,
Okta,
Auth0,
Generic,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PasswordPolicy {
pub min_length: u32,
pub require_uppercase: bool,
pub require_lowercase: bool,
pub require_numbers: bool,
pub require_special_chars: bool,
pub expiry_days: Option<u32>,
}
impl Default for PasswordPolicy {
fn default() -> Self {
Self {
min_length: 8,
require_uppercase: true,
require_lowercase: true,
require_numbers: true,
require_special_chars: false,
expiry_days: None,
}
}
}