use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OidcClient {
pub id: Uuid,
pub client_id: String,
pub secret_hash: String,
pub name: String,
pub redirect_uris: Vec<String>,
pub grant_types: Vec<String>,
pub response_types: Vec<String>,
pub allowed_scopes: String,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone)]
pub struct CreateOidcClient {
pub name: String,
pub redirect_uris: Vec<String>,
pub grant_types: Vec<String>,
pub response_types: Vec<String>,
pub allowed_scopes: String,
pub secret_hash: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthorizationCode {
pub id: Uuid,
pub code_hash: String,
pub client_id: String,
pub user_id: Uuid,
pub redirect_uri: String,
pub scope: String,
pub nonce: Option<String>,
pub code_challenge: Option<String>,
pub expires_at: DateTime<Utc>,
pub used: bool,
}
#[derive(Debug, Clone)]
pub struct CreateAuthorizationCode {
pub code_hash: String,
pub client_id: String,
pub user_id: Uuid,
pub redirect_uri: String,
pub scope: String,
pub nonce: Option<String>,
pub code_challenge: Option<String>,
pub expires_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OidcToken {
pub id: Uuid,
pub token_hash: String,
pub client_id: String,
pub user_id: Uuid,
pub scope: String,
pub token_type: OidcTokenType,
pub expires_at: Option<DateTime<Utc>>,
pub revoked: bool,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OidcTokenType {
Access,
Refresh,
DeviceAccess,
}
#[derive(Debug, Clone)]
pub struct CreateOidcToken {
pub token_hash: String,
pub client_id: String,
pub user_id: Uuid,
pub scope: String,
pub token_type: OidcTokenType,
pub expires_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceCode {
pub id: Uuid,
pub device_code_hash: String,
pub user_code_hash: String,
pub user_code: String,
pub client_id: String,
pub scope: String,
pub expires_at: DateTime<Utc>,
pub interval_secs: u32,
pub authorized: bool,
pub denied: bool,
pub user_id: Option<Uuid>,
pub last_polled_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone)]
pub struct CreateDeviceCode {
pub device_code_hash: String,
pub user_code_hash: String,
pub user_code: String,
pub client_id: String,
pub scope: String,
pub expires_at: DateTime<Utc>,
pub interval_secs: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OidcFederationProvider {
pub id: Uuid,
pub name: String,
pub issuer: String,
pub client_id: String,
pub secret_enc: String,
pub scopes: String,
pub org_id: Option<Uuid>,
pub enabled: bool,
pub created_at: DateTime<Utc>,
#[serde(default)]
pub claim_mapping: Vec<ClaimMappingRule>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClaimMappingRule {
pub source_claim: String,
pub match_type: String,
pub match_value: String,
pub action: String,
pub target: String,
}
#[derive(Debug, Clone)]
pub struct CreateOidcFederationProvider {
pub name: String,
pub issuer: String,
pub client_id: String,
pub secret_enc: String,
pub scopes: String,
pub org_id: Option<Uuid>,
pub claim_mapping: Vec<ClaimMappingRule>,
}