diff --git a/axumtest/Cargo.lock b/axumtest/Cargo.lock index cb3d47e..acaa478 100644 --- a/axumtest/Cargo.lock +++ b/axumtest/Cargo.lock @@ -112,6 +112,7 @@ dependencies = [ "axum", "clap", "dotenv", + "futures", "mongodb", "serde", "serde_json", @@ -360,6 +361,21 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab30e97ab6aacfe635fad58f22c2bb06c8b685f7421eb1e064a729e2a5f481fa" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.23" @@ -367,6 +383,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bfc52cbddcfd745bf1740338492bb0bd83d76c67b445f91c5fb29fae29ecaa1" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -421,9 +438,11 @@ version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0828a5471e340229c11c77ca80017937ce3c58cb788a17e5f1c2d5c485a9577" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", + "futures-sink", "futures-task", "memchr", "pin-project-lite", diff --git a/axumtest/Cargo.toml b/axumtest/Cargo.toml index faeef37..a357081 100644 --- a/axumtest/Cargo.toml +++ b/axumtest/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" axum = { version = "0.5.15", features = ["headers"] } clap = { version = "3.2.17", features = ["derive", "env"] } dotenv = "0.15.0" +futures = "0.3.23" mongodb = "2.3.0" serde = { version = "1.0.143", features = ["derive"] } serde_json = "1.0.83" diff --git a/axumtest/src/cases/mod.rs b/axumtest/src/cases/mod.rs new file mode 100644 index 0000000..0a32386 --- /dev/null +++ b/axumtest/src/cases/mod.rs @@ -0,0 +1,40 @@ +//! Deal with cases. + +use std::sync::Arc; + +use axum::extract::Path; +use axum::middleware; +use axum::routing::get; +use axum::Router; +use futures::stream::TryStreamExt; +use mongodb::bson::Document; + +use crate::auth; +use crate::State; + +/// Build the routes for the cases resource. +pub fn router(state: Arc, ci_usr: String, ci_pwd: String, ci_role: String) -> Router { + Router::new().route( + "/collections/:collname/cases", + get({ + let shared_state = Arc::clone(&state); + move |path| all_cases_on_collection(path, shared_state) + }) + .route_layer(middleware::from_fn(move |req, next| { + let ci_usr = ci_usr.clone(); + let ci_pwd = ci_pwd.clone(); + let ci_role = ci_role.clone(); + + auth::ci_auth(req, next, ci_usr, ci_pwd, ci_role) + })), + ) +} + +async fn all_cases_on_collection(Path(collection): Path, state: Arc) -> String { + let collection = state.db.collection::(&collection); + let mut cursor = collection.find(None, None).await.unwrap(); + while let Some(record) = cursor.try_next().await.unwrap() { + tracing::debug!("{:?}", record.get_str("caseID")); + } + format!("Cases!") +} diff --git a/axumtest/src/main.rs b/axumtest/src/main.rs index feda865..79a802f 100644 --- a/axumtest/src/main.rs +++ b/axumtest/src/main.rs @@ -1,4 +1,5 @@ mod auth; +mod cases; mod collections; use std::sync::Arc; @@ -54,6 +55,12 @@ async fn main() { args.ci_usr.clone(), args.ci_pwd.clone(), args.ci_role.clone(), + )) + .merge(cases::router( + state.clone(), + args.ci_usr.clone(), + args.ci_pwd.clone(), + args.ci_role.clone(), )); tracing::info!(args.addr, "Server listening in");