use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::net::IpAddr;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Credentials {
pub email: String,
pub password: String,
pub device_id: Option<String>,
pub ip_address: Option<IpAddr>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub id: Uuid,
pub email: String,
pub email_verified: bool,
pub password_hash: String,
pub display_name: Option<String>,
pub avatar_url: Option<String>,
pub roles: Vec<String>,
pub permissions: Vec<String>,
pub metadata: HashMap<String, serde_json::Value>,
pub mfa_enabled: bool,
pub mfa_secret: Option<String>,
pub webauthn_credentials: Vec<WebAuthnCredential>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub last_login_at: Option<DateTime<Utc>>,
pub login_count: u64,
pub failed_login_attempts: u32,
pub locked_until: Option<DateTime<Utc>>,
pub password_changed_at: DateTime<Utc>,
pub status: UserStatus,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum UserStatus {
Active,
Suspended,
Locked,
Deleted,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Session {
pub id: Uuid,
pub user_id: Uuid,
pub access_token: String,
pub refresh_token: String,
pub token_type: String,
pub expires_at: DateTime<Utc>,
pub refresh_expires_at: DateTime<Utc>,
pub device_id: Option<String>,
pub ip_address: Option<IpAddr>,
pub user_agent: Option<String>,
pub created_at: DateTime<Utc>,
pub last_active_at: DateTime<Utc>,
pub scopes: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Claims {
pub sub: Uuid,
pub email: String,
pub roles: Vec<String>,
pub permissions: Vec<String>,
pub session_id: Uuid,
pub iat: i64,
pub exp: i64,
pub nbf: i64,
pub iss: String,
pub aud: String,
pub jti: String,
pub scopes: Vec<String>,
pub device_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Role {
pub id: String,
pub name: String,
pub description: Option<String>,
pub permissions: Vec<String>,
pub inherits: Vec<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Permission {
pub id: String,
pub resource: String,
pub action: String,
pub description: Option<String>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Policy {
pub id: Uuid,
pub name: String,
pub effect: PolicyEffect,
pub conditions: Vec<PolicyCondition>,
pub actions: Vec<String>,
pub resources: Vec<String>,
pub priority: i32,
pub enabled: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum PolicyEffect {
Allow,
Deny,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum PolicyCondition {
IpRange { cidrs: Vec<String> },
TimeWindow { start: String, end: String },
UserAttribute { key: String, value: serde_json::Value },
RiskScore { max: u8 },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiKey {
pub id: Uuid,
pub key_hash: String,
pub prefix: String,
pub user_id: Uuid,
pub name: String,
pub description: Option<String>,
pub scopes: Vec<String>,
pub rate_limit: Option<u32>,
pub expires_at: Option<DateTime<Utc>>,
pub last_used_at: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
pub revoked: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TotpConfig {
pub secret: String,
pub algorithm: TotpAlgorithm,
pub digits: u32,
pub period: u32,
pub issuer: String,
pub account_name: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TotpAlgorithm {
SHA1,
SHA256,
SHA512,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebAuthnCredential {
pub id: String,
pub public_key: Vec<u8>,
pub counter: u32,
pub name: String,
pub created_at: DateTime<Utc>,
pub last_used_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OAuth2Provider {
pub name: String,
pub client_id: String,
pub client_secret: String,
pub auth_url: String,
pub token_url: String,
pub redirect_url: String,
pub scopes: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditLog {
pub id: Uuid,
pub user_id: Option<Uuid>,
pub session_id: Option<Uuid>,
pub action: String,
pub resource: String,
pub result: AuditResult,
pub ip_address: Option<IpAddr>,
pub user_agent: Option<String>,
pub metadata: HashMap<String, serde_json::Value>,
pub risk_score: u8,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum AuditResult {
Success,
Failure,
Blocked,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiskAssessment {
pub score: u8,
pub level: RiskLevel,
pub factors: Vec<RiskFactor>,
pub recommended_action: RiskAction,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RiskLevel {
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiskFactor {
pub name: String,
pub score: u8,
pub reason: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RiskAction {
Allow,
Challenge,
Deny,
RequireMfa,
}