diff --git a/.gitignore b/.gitignore index 6c435be..aeba3ae 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ dist result *.tgz *.tar.gz -file-service/*.sqlite -file-service/*.sqlite-shm -file-service/*.sqlite-wal +*.sqlite +*.sqlite-shm +*.sqlite-wal file-service/var diff --git a/Cargo.lock b/Cargo.lock index ae4b210..ce35caf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4545,6 +4545,8 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" name = "visions" version = "0.1.0" dependencies = [ + "authdb", + "tokio", "warp", ] diff --git a/visions/server/Cargo.toml b/visions/server/Cargo.toml index 4caede5..8c69b40 100644 --- a/visions/server/Cargo.toml +++ b/visions/server/Cargo.toml @@ -6,4 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -warp = "0.3.6" +authdb = { path = "../../authdb/" } +tokio = { version = "1", features = [ "full" ] } +warp = { version = "0.3" } diff --git a/visions/server/src/main.rs b/visions/server/src/main.rs index e7a11a9..17910a5 100644 --- a/visions/server/src/main.rs +++ b/visions/server/src/main.rs @@ -1,3 +1,49 @@ -fn main() { - println!("Hello, world!"); +use authdb::{AuthDB, Username}; +use std::{ + net::{IpAddr, Ipv4Addr, SocketAddr}, + path::PathBuf, + sync::{Arc, RwLock}, +}; +use warp::{header, Filter}; + +fn with_authentication( + auth_ctx: Arc>, +) -> impl Filter + Clone { + header("authentication").map(|value: String| { + println!("value: {:?}", value); + Username::from("savanni") + }) +} + +#[tokio::main] +pub async fn main() { + let auth_db = AuthDB::new(PathBuf::from("./auth_db.sqlite")) + .await + .expect("AuthDB should initialize"); + let auth_ctx: Arc> = Arc::new(RwLock::new(auth_db)); + + let echo_unauthenticated = warp::path!("api" / "v1" / "echo" / String).map(|param: String| { + println!("param: {}", param); + warp::reply::json(&vec!["unauthenticated", param.as_str()]) + }); + + let authenticate = warp::path!("api" / "v1" / "auth" / String).map(|param: String| { + println!("param: {}", param); + warp::reply::json(¶m) + }); + + let echo_authenticated = warp::path!("api" / "v1" / "echo" / String) + .and(with_authentication(auth_ctx.clone())) + .map(|param: String, username: Username| { + println!("param: {:?}", username); + println!("param: {}", param); + warp::reply::json(&vec!["authenticated", username.as_str(), param.as_str()]) + }); + + let filter = echo_authenticated.or(authenticate).or(echo_unauthenticated); + + let server = warp::serve(filter); + server + .run(SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 8001)) + .await; }