diff --git a/src/engines.rs b/src/engines.rs index 91d4ab9..d57a55a 100644 --- a/src/engines.rs +++ b/src/engines.rs @@ -1,77 +1,46 @@ pub mod kv; -use crate::engines::kv::logic::body_to_json; -use crate::engines::kv::structs::KvSecret; use axum::{ - extract::{Path, Request}, - http::StatusCode, - middleware::{self, Next}, + body::Body, + extract::{Request, State}, response::Response, - routing::*, Router, }; use log::*; use sqlx::{Any, Pool}; pub fn secrets_router(pool: Pool) -> Router> { - // Router::new().layer(map_request(handler)) - - Router::new() - .route("/:mount_path/data/:kv_path", post(baz)) - .with_state(pool) + Router::new().fallback(map_mount_points).with_state(pool) } -/// Routing handler for path "/v1/kv-v2/data/foo" -/// expects payload as JSON, prints payload into struct +async fn map_mount_points(State(_pool): State>, req: Request) -> Response { + // let mount_path = mount_path.trim_start_matches('/'); + // debug!("Mount path: {}", mount_path); + debug!("Mount path: {:?}", req); -async fn baz(Path(mount_path): Path, Path(kv_path): Path, body: String) -> String { - let mut body_json = body_to_json(body); + let mut mount_path: Vec<&str> = req.uri().path().split("/").collect(); - // TODO: If version field provided during a read, the value at the version number will be returned - let secret: KvSecret = KvSecret { - data: body_json.to_string(), - // content: body_json["data"]["password1"].take().to_string(), - version: body_json["data"]["version"].take().as_i64(), - }; - log::debug!( - "Secret: {}, Content: {}, Version: {:?}, path: {}", - kv_path, - secret.data, - secret.version, - mount_path, - ); - String::from("RoutingTest baz successful") + // let a = sqlx::query!("SELECT * FROM secret_engines WHERE path = $1", mount_path.join("/")) + // .fetch_one(&pool) + // .await + // .expect("Failed to fetch secret engine"); + + let tada = vec!["a/b/c/d".to_string(), "/a/b/c".to_string(), "/kv-v2".into()]; + + // Find longest matching existing mount path for the request + for _ in 1..mount_path.len() { + if tada.contains(&mount_path.join("/")) { + trace!( + "Mount path {} found for route request: {}", + mount_path.join("/"), + req.uri().path() + ); + + break; + } else { + mount_path.pop(); + } + } + + return Response::new(Body::from(format!("Mount path:"))); } - -// async fn handler(Host(hostname): Host, request: Request) -> &'static str { -// TODO: Find a solution for this mess -// async fn handler(request: Request) -> Result, StatusCode> { -// // let path: Vec<&str> = request.uri().path().split('/').clone().collect(); -// // log::info!("path, {:?}", path[1]); - -// let root = service_fn(|req: Request| async move { -// let res = Response::new("Hello, World!".to_string()); -// Ok::<_, Infallible>(res) -// }); -// let root = BoxService::new(root); - -// let mut routes = vec!["/abc", "/def"]; -// routes.sort_unstable_by(|a, b| a.len().cmp(&b.len())); - -// let mut app = Router::new(); -// app.as_service().call(request).await.unwrap(); - -// // match path[1] { -// // "test" => { -// // log::info!("test route"); -// // // TODO: Nest another Router here -// // return Ok(Request::new(Body::empty())); -// // } -// // _ => { -// // log::info!("default"); -// // return Err(StatusCode::NOT_FOUND); -// // } -// // } - -// Err(StatusCode::IM_A_TEAPOT) -// }