use std::sync::Arc; use serde::{Deserialize, Serialize}; use utoipa::ToSchema; #[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, ToSchema)] #[serde(rename_all = "snake_case")] pub enum ProfileVisibility { Public, #[default] RegisteredOnly, MembersOnly, Private, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct UserConfig { #[serde(default = "default_max_pagination")] pub max_profile_pagination: usize, #[serde(default = "default_default_pagination")] pub default_profile_pagination: usize, #[serde(default = "default_max_username_len")] pub max_username_len: usize, #[serde(default = "default_min_username_len")] pub min_username_len: usize, #[serde(default = "default_max_display_name_len")] pub max_display_name_len: usize, #[serde(default = "default_max_bio_len")] pub max_bio_len: usize, #[serde(default = "default_max_pronouns_len")] pub max_pronouns_len: usize, #[serde(default = "default_max_website_len")] pub max_website_len: usize, #[serde(default = "default_max_location_len")] pub max_location_len: usize, #[serde(default = "default_max_company_len")] pub max_company_len: usize, #[serde(default = "default_max_meme_name_len")] pub max_meme_name_len: usize, #[serde(default = "default_max_recovery_codes")] pub max_recovery_codes: usize, #[serde(default = "default_access_key_token_bytes")] pub access_key_token_bytes: usize, #[serde(default = "default_ssh_key_max_per_user")] pub ssh_key_max_per_user: usize, #[serde(default = "default_deletion_grace_days")] pub deletion_grace_days: i64, #[serde(default = "default_follow_rate_limit_secs")] pub follow_rate_limit_secs: u64, #[serde(default = "default_block_rate_limit_secs")] pub block_rate_limit_secs: u64, #[serde(default = "default_report_rate_limit_secs")] pub report_rate_limit_secs: u64, #[serde(default = "default_unread_cache_ttl")] pub notifications_unread_cache_ttl_secs: u64, #[serde(default)] pub default_visibility: ProfileVisibility, #[serde(default = "default_default_locale")] pub default_locale: String, #[serde(default = "default_default_timezone")] pub default_timezone: String, } fn default_max_pagination() -> usize { 100 } fn default_default_pagination() -> usize { 20 } fn default_max_username_len() -> usize { 64 } fn default_min_username_len() -> usize { 1 } fn default_max_display_name_len() -> usize { 64 } fn default_max_bio_len() -> usize { 512 } fn default_max_pronouns_len() -> usize { 32 } fn default_max_website_len() -> usize { 256 } fn default_max_location_len() -> usize { 128 } fn default_max_company_len() -> usize { 128 } fn default_max_meme_name_len() -> usize { 64 } fn default_max_recovery_codes() -> usize { 10 } fn default_access_key_token_bytes() -> usize { 32 } fn default_ssh_key_max_per_user() -> usize { 50 } fn default_deletion_grace_days() -> i64 { 14 } fn default_follow_rate_limit_secs() -> u64 { 60 } fn default_block_rate_limit_secs() -> u64 { 60 } fn default_report_rate_limit_secs() -> u64 { 300 } fn default_unread_cache_ttl() -> u64 { 3600 } fn default_default_locale() -> String { "en".to_string() } fn default_default_timezone() -> String { "UTC".to_string() } impl Default for UserConfig { fn default() -> Self { Self { max_profile_pagination: default_max_pagination(), default_profile_pagination: default_default_pagination(), max_username_len: default_max_username_len(), min_username_len: default_min_username_len(), max_display_name_len: default_max_display_name_len(), max_bio_len: default_max_bio_len(), max_pronouns_len: default_max_pronouns_len(), max_website_len: default_max_website_len(), max_location_len: default_max_location_len(), max_company_len: default_max_company_len(), max_meme_name_len: default_max_meme_name_len(), max_recovery_codes: default_max_recovery_codes(), access_key_token_bytes: default_access_key_token_bytes(), ssh_key_max_per_user: default_ssh_key_max_per_user(), deletion_grace_days: default_deletion_grace_days(), follow_rate_limit_secs: default_follow_rate_limit_secs(), block_rate_limit_secs: default_block_rate_limit_secs(), report_rate_limit_secs: default_report_rate_limit_secs(), notifications_unread_cache_ttl_secs: default_unread_cache_ttl(), default_visibility: ProfileVisibility::default(), default_locale: default_default_locale(), default_timezone: default_default_timezone(), } } } #[allow(dead_code)] pub type SharedUserConfig = Arc;