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,
}
}
}