use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OAuthExtensionSpec {
pub provider_name: String,
#[serde(default)]
pub description: String,
pub client_id: String,
#[serde(default, skip_serializing)]
pub client_secret_ref: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_secret_encrypted: Option<String>,
pub issuer_url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub authorization_endpoint: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub token_endpoint: Option<String>,
pub scopes: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct OAuthExtensionStatus {
#[serde(skip_serializing_if = "Option::is_none")]
pub redirect_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub configured_at: Option<DateTime<Utc>>,
#[serde(default)]
pub auth_verified: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rise_client_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rise_client_secret: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OAuthState {
pub redirect_uri: Option<String>,
pub application_state: Option<String>,
pub project_name: String,
pub extension_name: String,
pub code_verifier: String,
pub created_at: DateTime<Utc>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_code_challenge: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_code_challenge_method: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct TokenResponse {
pub access_token: String,
pub token_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_in: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub refresh_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_token: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct CallbackRequest {
pub code: String,
pub state: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OAuthCodeState {
pub project_id: Uuid,
pub extension_name: String,
pub created_at: DateTime<Utc>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub redirect_uri: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub code_challenge: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub code_challenge_method: Option<String>,
pub token_response_encrypted: String,
pub content_type: String,
pub status_code: u16,
}
#[derive(Debug, Deserialize)]
pub struct AuthorizeFlowQuery {
pub redirect_uri: Option<String>,
pub state: Option<String>,
pub code_challenge: Option<String>,
pub code_challenge_method: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct TokenRequest {
pub grant_type: String,
pub code: Option<String>,
pub refresh_token: Option<String>,
pub redirect_uri: Option<String>,
pub client_id: String,
pub client_secret: Option<String>,
pub code_verifier: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct OAuth2TokenResponse {
pub access_token: String,
pub token_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_in: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub refresh_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_token: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct OAuth2ErrorResponse {
pub error: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_description: Option<String>,
}