Random stuff, testing things, and so on.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.0 KiB

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<State>) -> Json<Vec<String>> {
let collections = state.db.list_collection_names(None).await.unwrap();
Json(collections)
}