use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum TotpAlgorithm {
#[serde(rename = "SHA1")]
Sha1,
#[serde(rename = "SHA256")]
Sha256,
#[serde(rename = "SHA512")]
Sha512,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TotpDevice {
pub id: String,
pub organisation_id: String,
pub name: String,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub issuer: Option<String>,
pub digits: u8,
pub period: u32,
pub algorithm: TotpAlgorithm,
pub source: String,
#[serde(default)]
pub expires_at: Option<String>,
pub created_at: String,
pub updated_at: String,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct ListTotpDevicesParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub offset: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issuer: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ListTotpDevicesResponse {
pub total_count: u64,
pub options: ListTotpDevicesParams,
pub items: Vec<TotpDevice>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct CreateTotpDeviceParams {
pub shared_secret: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct TotpDeviceOptions {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issuer: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub digits: Option<u8>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub period: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub algorithm: Option<TotpAlgorithm>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct CreateCustomTotpDeviceParams {
pub secret: String,
#[serde(flatten)]
pub options: TotpDeviceOptions,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct CreateBase32SecretKeyTotpDeviceParams {
pub base32_secret_key: String,
#[serde(flatten)]
pub options: TotpDeviceOptions,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct CreateOtpAuthUrlTotpDeviceParams {
pub otp_auth_url: String,
#[serde(flatten)]
pub options: TotpDeviceOptions,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct GetTotpOtpParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_seconds_until_expire: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TotpOtpResponse {
pub code: String,
pub expires: String,
}