mod auth; use std::sync::Arc; use axum::middleware; use axum::routing::get; use axum::Json; use axum::routing::Router; use clap::Parser; use dotenv::dotenv; use mongodb::options::ClientOptions; use mongodb::Client; use mongodb::Database; #[derive(Parser)] struct Params { #[clap(env = "SRV_ADDR", default_value = "0.0.0.0:3000")] addr: String, #[clap(short, long, env = "MONGO_URI")] mongo_addr: String, #[clap(long, env = "CIUSR")] ci_usr: String, #[clap(long, env = "CIPWD")] ci_pwd: String, #[clap(long, env = "CIROLE")] ci_role: String, } struct State { db: Database, } #[tokio::main] async fn main() { dotenv().ok(); tracing_subscriber::fmt::init(); let args = Params::parse(); tracing::debug!("Connecting to mongo..."); let mongo_options = ClientOptions::parse(&args.mongo_addr).await.unwrap(); let client = Client::with_options(mongo_options).unwrap(); let db = client.database("helyxTestDatabase"); let collections = db.list_collection_names(None).await.unwrap(); tracing::debug!("Collections = {:?}", &collections); let state = Arc::new(State { db, }); let app = Router::new().route("/", get(index)).route( "/collections", get({ let shared_state = Arc::clone(&state); move || get_collections(Arc::clone(&shared_state)) }) .route_layer(middleware::from_fn(move |req, next| { let ci_usr = args.ci_usr.clone(); let ci_pwd = args.ci_pwd.clone(); let ci_role = args.ci_role.clone(); auth::ci_auth(req, next, ci_usr, ci_pwd, ci_role) })), ); tracing::info!(args.addr, "Server listening in"); axum::Server::bind(&args.addr.parse().unwrap()) .serve(app.into_make_service()) .await .unwrap(); } async fn index() -> String { format!("Hellow") } async fn get_collections(state: Arc) -> Json> { let collections = state.db.list_collection_names(None).await.unwrap(); Json(collections) }