use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use crate::api_token::ApiTokenKind;
pub const DEVICE_GRANT_TYPE: &str = "urn:ietf:params:oauth:grant-type:device_code";
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceCodeRequest {
pub client_id: String,
#[serde(default)]
pub scope: Option<String>,
#[serde(default)]
pub token_name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceCodeResponse {
pub device_code: String,
pub user_code: String,
pub verification_uri: String,
pub verification_uri_complete: String,
pub expires_in: i64,
pub interval: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceTokenRequest {
pub grant_type: String,
pub device_code: String,
pub client_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceTokenResponse {
pub token: String,
pub name: String,
pub kind: ApiTokenKind,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum DeviceTokenError {
AuthorizationPending,
SlowDown,
AccessDenied,
ExpiredToken,
InvalidGrant,
UnsupportedGrantType,
InvalidRequest,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceTokenErrorResponse {
pub error: DeviceTokenError,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceVerifyRequest {
pub user_code: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DeviceAuthorizationView {
pub user_code: String,
pub client_id: String,
pub client_name: Option<String>,
pub created_at: DateTime<Utc>,
pub expires_at: DateTime<Utc>,
}