use std::env; use anyhow::{Context, Result}; #[derive(Clone, Debug)] pub struct AppConfig { pub database_url: String, pub server_host: String, pub server_port: u16, pub jwt_secret: String, pub jwt_issuer: String, pub jwt_audience: String, pub jwt_expiry_minutes: i64, pub refresh_token_expiry_days: i64, pub refresh_cookie_secure: bool, pub refresh_cookie_domain: Option, pub cors_allowed_origin: Option, pub aws_endpoint_url: Option, pub aws_access_key_id: Option, pub aws_secret_access_key: Option, pub aws_region: String, pub s3_bucket: String, } impl AppConfig { pub fn from_env() -> Result { let database_url = env::var("DATABASE_URL").context("DATABASE_URL must be set")?; let server_host = env::var("SERVER_HOST").unwrap_or_else(|_| "127.0.0.1".to_string()); let server_port = env::var("SERVER_PORT") .unwrap_or_else(|_| "3000".to_string()) .parse() .context("SERVER_PORT must be a valid u16")?; let jwt_secret = env::var("JWT_SECRET").context("JWT_SECRET must be set")?; let jwt_issuer = env::var("JWT_ISSUER").unwrap_or_else(|_| "paperless-neo".to_string()); let jwt_audience = env::var("JWT_AUDIENCE").unwrap_or_else(|_| "paperless-neo-clients".to_string()); let jwt_expiry_minutes = env::var("JWT_EXPIRY_MINUTES") .unwrap_or_else(|_| "60".to_string()) .parse() .context("JWT_EXPIRY_MINUTES must be an integer")?; let refresh_token_expiry_days = env::var("REFRESH_TOKEN_EXPIRY_DAYS") .unwrap_or_else(|_| "30".to_string()) .parse() .context("REFRESH_TOKEN_EXPIRY_DAYS must be an integer")?; let refresh_cookie_secure = env::var("REFRESH_COOKIE_SECURE") .map(|v| v == "1" || v.eq_ignore_ascii_case("true")) .unwrap_or(false); let refresh_cookie_domain = env::var("REFRESH_COOKIE_DOMAIN").ok(); let cors_allowed_origin = env::var("CORS_ALLOWED_ORIGIN").ok(); let aws_endpoint_url = env::var("AWS_ENDPOINT_URL").ok(); let aws_access_key_id = env::var("AWS_ACCESS_KEY_ID").ok(); let aws_secret_access_key = env::var("AWS_SECRET_ACCESS_KEY").ok(); let aws_region = env::var("AWS_REGION").unwrap_or_else(|_| "us-east-1".to_string()); let s3_bucket = env::var("S3_BUCKET").context("S3_BUCKET must be set")?; Ok(Self { database_url, server_host, server_port, jwt_secret, jwt_issuer, jwt_audience, jwt_expiry_minutes, refresh_token_expiry_days, refresh_cookie_secure, refresh_cookie_domain, cors_allowed_origin, aws_endpoint_url, aws_access_key_id, aws_secret_access_key, aws_region, s3_bucket, }) } }