From ac80269c66fdba6a78f0808f3852442966b4f01a Mon Sep 17 00:00:00 2001 From: Vinod J M Date: Fri, 30 Dec 2022 20:48:13 +0530 Subject: [PATCH] user-auth store test1 --- backend/Cargo.lock | 13 +++++++ backend/api/Cargo.toml | 1 + backend/api/src/lib.rs | 88 +++++++++++++++++++++++++++--------------- 3 files changed, 70 insertions(+), 32 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 8e662d8..70fc1b4 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -464,6 +464,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4df0fc33ada14a338b799002f7e8657711422b25d4e16afb032708d6b185621" +dependencies = [ + "heck 0.4.0", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "axum-sessions" version = "0.4.1" @@ -602,6 +614,7 @@ dependencies = [ "axum 0.6.1", "axum-extra 0.3.7", "axum-login", + "axum-macros", "booksman-orm", "booksman-search", "chrono", diff --git a/backend/api/Cargo.toml b/backend/api/Cargo.toml index 5c8d819..b2fa184 100644 --- a/backend/api/Cargo.toml +++ b/backend/api/Cargo.toml @@ -28,6 +28,7 @@ tracing-subscriber = "^0.3" itertools = "0.10" chrono = "0.4" axum-login = "0.4" +axum-macros = "0.3" #features = ["sqlite"] [dependencies.rand] diff --git a/backend/api/src/lib.rs b/backend/api/src/lib.rs index 2e0d7f4..eff807b 100644 --- a/backend/api/src/lib.rs +++ b/backend/api/src/lib.rs @@ -5,7 +5,6 @@ use axum::{ Json, Router, extract::{Extension, Path}, }; -use axum_extra::routing::SpaRouter; use clap::Parser; use image; use serde::{Deserialize, Serialize}; @@ -40,7 +39,7 @@ use axum_login::{ use rand::Rng; use std::sync::Arc; -#[derive(Debug, Default, Clone)] +#[derive(Debug, Default, Clone, Deserialize, Serialize)] struct User { id: i32, password_hash: String, @@ -269,9 +268,14 @@ pub async fn main() { let usersmodels : Vec = QueryCore::list_all_users(&conn).await.unwrap_or(Vec::new()); //let users : Vec = get_users_seaorm(conn); //let user = User::get_rusty_user(); - //for user in users.iter() { - // store.write().await.insert(user.get_id(), user); - //} + for usermodel in usersmodels.iter() { + let user = User{ + id: usermodel.id, + name: usermodel.user_name.clone().unwrap(), + password_hash : usermodel.password_hash.clone(), + }; + store.write().await.insert(user.get_id(), user); + } let user_store = AuthMemoryStore::new(&store); let auth_layer = AuthLayer::new(user_store, &secret); @@ -279,22 +283,6 @@ pub async fn main() { let meili_client = Client::new(meili_url, meili_key); - async fn login_handler(mut auth: AuthContext, Json(user_sent): Json) { - auth.login(&user_sent).await.unwrap(); - } - - async fn register_handler(mut auth: AuthContext, Json(user_sent): Json) { - // add to db - //store.write().await.insert(user_sent.get_id(), user_sent); - auth.login(&user_sent).await.unwrap(); - } - - async fn logout_handler(mut auth: AuthContext) { - dbg!("Logging out user: {}", &auth.current_user); - auth.logout().await; - } - - let app = Router::new() .route("/api/search_openlibrary", get(search_openlibrary)) .route("/api/create_by_isbn", get(create_by_isbn)) @@ -307,10 +295,12 @@ pub async fn main() { .route("/api/login", post(login_handler)) .route("/api/register", post(register_handler)) .route("/api/logout", post(logout_handler)) - .nest("/images", get_service(ServeDir::new(images_dir)).handle_error(handle_error)) - .merge(SpaRouter::new("/assets", opt.static_dir)) + .nest_service("/images", get_service(ServeDir::new(images_dir)).handle_error(handle_error)) + .nest_service("/assets", get_service(ServeDir::new(opt.static_dir)).handle_error(handle_error)) +// .merge(SpaRouter::new("/assets", opt.static_dir)) .layer(auth_layer) .layer(session_layer) + .layer(Extension(store)) .layer(ServiceBuilder::new().layer(TraceLayer::new_for_http())) .layer(Extension(conn)) .layer(Extension(meili_client)) @@ -340,18 +330,52 @@ pub async fn main() { .expect("Unable to start server"); } + +#[axum_macros::debug_handler] + async fn register_handler(mut auth: AuthContext, Extension(ref conn): Extension, + Extension(ref store): Extension>>, +Json(user_sent): Json) -> impl IntoResponse { + // add to db + let user: user::Model = user::Model{ + id: user_sent.id, + user_name: Some(user_sent.clone().name), + password_hash: user_sent.clone().password_hash, + }; + let created_user = MutationCore::create_user(conn, user).await.expect("Failed to create user"); + store.write().await.insert(created_user.last_insert_id, user_sent.clone()); + auth.login(&user_sent).await.unwrap(); + return "success"; + } + + async fn list_users( Extension(ref conn): Extension, - axum::extract::Query(params): axum::extract::Query>, ) -> impl IntoResponse { - let res = PaginatedBookUIList{ - num_pages: books.1 as u32, - books: resbooks - }; - return Json(res); - // "success" + let usersmodels : Vec = QueryCore::list_all_users(&conn).await.unwrap_or(Vec::new()); + let mut users : Vec = Vec::new(); + for usermodel in usersmodels.iter() { + let user = User{ + id: usermodel.id, + name: usermodel.user_name.clone().unwrap().clone(), + password_hash : "".to_string(), + }; + users.push(user); + } + return Json(users); } + async fn login_handler(mut auth: AuthContext, Json(user_sent): Json) -> impl IntoResponse { + auth.login(&user_sent).await.unwrap(); + return "success"; + } + + // + + async fn logout_handler(mut auth: AuthContext) { + dbg!("Logging out user: {}", &auth.current_user); + auth.logout().await; + } + //https://openlibrary.org/api/books?bibkeys=ISBN:9780980200447&jscmd=data&format=json @@ -633,7 +657,7 @@ async fn list_book( let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); let page: usize = params.get("page").unwrap().parse().unwrap(); - let userid = params.get("userid").unwrap(); + let userid: usize = params.get("userid").unwrap().parse().unwrap(); let books = QueryCore::find_books_plus_meta_in_page(conn,page,userid,12) .await @@ -687,7 +711,7 @@ async fn list_search_book( ) -> impl IntoResponse { let page: usize = params.get("page").unwrap().parse().unwrap(); let search = params.get("search").unwrap(); - let userid = params.get("userid").unwrap(); + let userid: i32 = params.get("userid").unwrap().parse().unwrap(); dotenvy::dotenv().ok(); let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file");