big features

This commit is contained in:
Mateusz Gruszczyński
2026-07-22 11:03:50 +02:00
parent 0d77624adc
commit 1be2023e36
30 changed files with 1077 additions and 77 deletions
+28 -1
View File
@@ -10,6 +10,8 @@ pub struct Config {
pub files_dir: String,
pub upload_max_size_bytes: usize,
pub asset_version: String,
pub smtp: Option<crate::state::SmtpConfig>,
pub registration_enabled: bool,
}
impl Config {
@@ -26,6 +28,18 @@ impl Config {
return Err("UPLOAD_MAX_SIZE_MB must be greater than 0".into());
}
let smtp_host = std::env::var("SMTP_HOST").ok().filter(|v| !v.trim().is_empty());
let smtp = if let Some(host) = smtp_host {
Some(crate::state::SmtpConfig {
host,
port: env_var("SMTP_PORT", "587").parse()?,
username: std::env::var("SMTP_USERNAME").unwrap_or_default(),
password: std::env::var("SMTP_PASSWORD").unwrap_or_default(),
from: std::env::var("SMTP_FROM").map_err(|_| "SMTP_FROM is required when SMTP_HOST is set")?,
public_url: std::env::var("PUBLIC_URL").map_err(|_| "PUBLIC_URL is required when SMTP_HOST is set")?,
})
} else { None };
Ok(Self {
host,
port,
@@ -39,7 +53,9 @@ impl Config {
upload_max_size_bytes: upload_max_size_mb
.checked_mul(1024 * 1024)
.ok_or("UPLOAD_MAX_SIZE_MB is too large")?,
asset_version: env!("CARGO_PKG_VERSION").to_owned(),
asset_version: env_var("ASSET_VERSION", env!("CARGO_PKG_VERSION")),
smtp,
registration_enabled: env_bool("REGISTRATION_ENABLED", false)?,
})
}
}
@@ -47,3 +63,14 @@ impl Config {
fn env_var(name: &str, default: &str) -> String {
env::var(name).unwrap_or_else(|_| default.to_owned())
}
fn env_bool(name: &str, default: bool) -> Result<bool, Box<dyn std::error::Error>> {
match env::var(name) {
Ok(value) => match value.trim().to_ascii_lowercase().as_str() {
"1" | "true" | "yes" | "on" => Ok(true),
"0" | "false" | "no" | "off" => Ok(false),
_ => Err(format!("{name} must be true or false").into()),
},
Err(_) => Ok(default),
}
}