wacht 0.1.0-beta.5

Official Rust SDK for the Wacht platform, providing type-safe API client and authentication middleware
Documentation
/*
 * Wacht Backend API
 *
 * Backend API for the Wacht platform console
 *
 * The version of the OpenAPI document: 1.0.0
 *
 * Generated by: https://openapi-generator.tech
 */

use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EmailSettings {
    pub enabled: bool,
    pub required: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub verify_signup: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub otp_verification_allowed: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub magic_link_verification_allowed: Option<bool>,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PhoneSettings {
    pub enabled: bool,
    pub required: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub verify_signup: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sms_verification_allowed: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub whatsapp_verification_allowed: Option<bool>,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct UsernameSettings {
    pub enabled: bool,
    pub required: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub min_length: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub max_length: Option<u8>,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PasswordSettings {
    pub enabled: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub min_length: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub require_lowercase: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub require_uppercase: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub require_number: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub require_special: Option<bool>,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct IndividualAuthSettings {
    pub enabled: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub required: Option<bool>,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EmailLinkSettings {
    pub enabled: bool,
    pub require_same_device: bool,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PasskeySettings {
    pub enabled: bool,
    #[serde(default)]
    pub prompt_registration_on_auth: bool,
    pub allow_autofill: bool,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct VerificationPolicy {
    pub phone_number: bool,
    pub email: bool,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct AuthFactorsEnabled {
    pub sso: bool,
    pub email_password: bool,
    pub username_password: bool,
    pub email_otp: bool,
    pub email_magic_link: bool,
    pub phone_otp: bool,
    pub web3_wallet: bool,
    pub backup_code: bool,
    pub authenticator: bool,
    pub passkey: bool,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MultiSessionSupport {
    pub enabled: bool,
    pub max_accounts_per_session: i64,
    pub max_sessions_per_account: i64,
}

#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct AuthenticationSettings {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub created_at: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub updated_at: Option<String>,
    pub email_address: EmailSettings,
    pub phone_number: PhoneSettings,
    pub username: UsernameSettings,
    pub first_name: IndividualAuthSettings,
    pub last_name: IndividualAuthSettings,
    pub password: PasswordSettings,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub magic_link: Option<EmailLinkSettings>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub passkey: Option<PasskeySettings>,
    pub auth_factors_enabled: AuthFactorsEnabled,
    pub verification_policy: VerificationPolicy,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub second_factor_policy: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub first_factor: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub multi_session_support: Option<MultiSessionSupport>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub session_token_lifetime: Option<i64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub session_validity_period: Option<i64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub session_inactive_timeout: Option<i64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub deployment_id: Option<String>,
}

impl Default for EmailSettings {
    fn default() -> Self {
        Self {
            enabled: true,
            required: true,
            verify_signup: Some(true),
            otp_verification_allowed: Some(true),
            magic_link_verification_allowed: Some(true),
        }
    }
}

impl Default for PhoneSettings {
    fn default() -> Self {
        Self {
            enabled: true,
            required: false,
            verify_signup: Some(true),
            sms_verification_allowed: Some(true),
            whatsapp_verification_allowed: Some(false),
        }
    }
}

impl Default for UsernameSettings {
    fn default() -> Self {
        Self {
            enabled: true,
            required: false,
            min_length: Some(3),
            max_length: Some(30),
        }
    }
}

impl Default for PasswordSettings {
    fn default() -> Self {
        Self {
            enabled: true,
            min_length: Some(8),
            require_lowercase: Some(true),
            require_uppercase: Some(true),
            require_number: Some(true),
            require_special: Some(true),
        }
    }
}

impl Default for IndividualAuthSettings {
    fn default() -> Self {
        Self {
            enabled: true,
            required: Some(false),
        }
    }
}

impl Default for VerificationPolicy {
    fn default() -> Self {
        Self {
            phone_number: true,
            email: true,
        }
    }
}

impl Default for AuthFactorsEnabled {
    fn default() -> Self {
        Self {
            sso: false,
            email_password: true,
            username_password: true,
            email_otp: false,
            email_magic_link: false,
            phone_otp: false,
            web3_wallet: false,
            backup_code: false,
            authenticator: false,
            passkey: false,
        }
    }
}

impl Default for AuthenticationSettings {
    fn default() -> Self {
        Self {
            id: None,
            created_at: None,
            updated_at: None,
            email_address: EmailSettings::default(),
            phone_number: PhoneSettings::default(),
            username: UsernameSettings::default(),
            first_name: IndividualAuthSettings::default(),
            last_name: IndividualAuthSettings::default(),
            password: PasswordSettings::default(),
            magic_link: Some(EmailLinkSettings {
                enabled: true,
                require_same_device: false,
            }),
            passkey: Some(PasskeySettings {
                enabled: false,
                prompt_registration_on_auth: false,
                allow_autofill: false,
            }),
            auth_factors_enabled: AuthFactorsEnabled::default(),
            verification_policy: VerificationPolicy::default(),
            second_factor_policy: None,
            first_factor: None,
            multi_session_support: None,
            session_token_lifetime: None,
            session_validity_period: None,
            session_inactive_timeout: None,
            deployment_id: None,
        }
    }
}