diff --git a/src/main.rs b/src/main.rs index cc24c41..a266ae0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,16 +9,65 @@ use axum::{ pub mod callers; +mod db { + + use sqlx::postgres::PgPoolOptions; + use std::env; + + pub mod connection_settings { + pub const MAXCONN: u32 = 10; + } + + pub mod keys { + pub const DBURL: &str = "DATABASE_URL"; + + pub mod error { + pub const ERROR: &str = "DATABASE_URL must be set in .env"; + } + } + + // use crate::{connection_settings, keys}; + + pub async fn create_pool() -> Result { + let database_url = get_db_url().await; + println!("Database url: {:?}", database_url); + + PgPoolOptions::new() + .max_connections(connection_settings::MAXCONN) + .connect(&database_url) + .await + } + + async fn get_db_url() -> String { + #[cfg(debug_assertions)] // Example: Only load .env in debug builds + dotenvy::dotenv().ok(); + env::var(keys::DBURL).expect(keys::error::ERROR) + } + + pub async fn migrations(pool: &sqlx::PgPool) { + // Run migrations using the sqlx::migrate! macro + // Assumes your migrations are in a ./migrations folder relative to Cargo.toml + sqlx::migrate!("./migrations") + .run(pool) + .await + .expect("Failed to run migrations"); + } +} + #[tokio::main] async fn main() { // initialize tracing tracing_subscriber::fmt::init(); + let pool = db::create_pool().await.expect("Failed to create pool"); + db::migrations(&pool).await; + // build our application with a route let app = Router::new() // `GET /` goes to `root` .route("/", get(root)) - .route(callers::endpoints::QUEUESONG, post(callers::song::endpoint::queue_song)); + .route(callers::endpoints::QUEUESONG, post(callers::song::endpoint::queue_song)) + .layer(axum::Extension(pool)); // `POST /users` goes to `create_user` // .route("/users", post(create_user));