diff --git a/src/database.rs b/src/database.rs index a90de44..ca05c46 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,4 +1,5 @@ use cfg_if::cfg_if; +use leptos::logging::log; cfg_if! { if #[cfg(feature = "ssr")] { @@ -25,12 +26,59 @@ lazy_static! { /// Initialize the database pool /// -/// Will panic if the DATABASE_URL environment variable is not set, or if there is an error creating the pool. +/// Uses DATABASE_URL environment variable to connect to the database if set, +/// otherwise builds a connection string from other environment variables. +/// +/// Will panic if either the DATABASE_URL or POSTGRES_HOST environment variables +/// are not set, or if there is an error creating the pool. /// /// # Returns /// A database pool object, which can be used to get pooled connections fn init_db_pool() -> PgPool { - let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); + let database_url = env::var("DATABASE_URL").unwrap_or_else(|_| { + // Build the database URL from environment variables + // Construct a separate log_url to avoid logging the password + let mut log_url = "postgres://".to_string(); + let mut url = "postgres://".to_string(); + + if let Ok(user) = env::var("POSTGRES_USER") { + url.push_str(&user); + log_url.push_str(&user); + + if let Ok(password) = env::var("POSTGRES_PASSWORD") { + url.push_str(":"); + log_url.push_str(":"); + url.push_str(&password); + log_url.push_str("********"); + } + + url.push_str("@"); + log_url.push_str("@"); + } + + let host = env::var("POSTGRES_HOST").expect("DATABASE_URL or POSTGRES_HOST must be set"); + + url.push_str(&host); + log_url.push_str(&host); + + if let Ok(port) = env::var("POSTGRES_PORT") { + url.push_str(":"); + url.push_str(&port); + log_url.push_str(":"); + log_url.push_str(&port); + } + + if let Ok(dbname) = env::var("POSTGRES_DB") { + url.push_str("/"); + url.push_str(&dbname); + log_url.push_str("/"); + log_url.push_str(&dbname); + } + + log!("Connecting to database: {}", log_url); + url + }); + let manager = ConnectionManager::::new(database_url); PgPool::builder() .build(manager)