user-auth store test1

This commit is contained in:
2022-12-30 20:48:13 +05:30
parent ec8122536d
commit ac80269c66
3 changed files with 70 additions and 32 deletions

13
backend/Cargo.lock generated
View File

@@ -464,6 +464,18 @@ dependencies = [
"tracing", "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]] [[package]]
name = "axum-sessions" name = "axum-sessions"
version = "0.4.1" version = "0.4.1"
@@ -602,6 +614,7 @@ dependencies = [
"axum 0.6.1", "axum 0.6.1",
"axum-extra 0.3.7", "axum-extra 0.3.7",
"axum-login", "axum-login",
"axum-macros",
"booksman-orm", "booksman-orm",
"booksman-search", "booksman-search",
"chrono", "chrono",

View File

@@ -28,6 +28,7 @@ tracing-subscriber = "^0.3"
itertools = "0.10" itertools = "0.10"
chrono = "0.4" chrono = "0.4"
axum-login = "0.4" axum-login = "0.4"
axum-macros = "0.3"
#features = ["sqlite"] #features = ["sqlite"]
[dependencies.rand] [dependencies.rand]

View File

@@ -5,7 +5,6 @@ use axum::{
Json, Router, Json, Router,
extract::{Extension, Path}, extract::{Extension, Path},
}; };
use axum_extra::routing::SpaRouter;
use clap::Parser; use clap::Parser;
use image; use image;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@@ -40,7 +39,7 @@ use axum_login::{
use rand::Rng; use rand::Rng;
use std::sync::Arc; use std::sync::Arc;
#[derive(Debug, Default, Clone)] #[derive(Debug, Default, Clone, Deserialize, Serialize)]
struct User { struct User {
id: i32, id: i32,
password_hash: String, password_hash: String,
@@ -269,9 +268,14 @@ pub async fn main() {
let usersmodels : Vec<user::Model> = QueryCore::list_all_users(&conn).await.unwrap_or(Vec::new()); let usersmodels : Vec<user::Model> = QueryCore::list_all_users(&conn).await.unwrap_or(Vec::new());
//let users : Vec<User> = get_users_seaorm(conn); //let users : Vec<User> = get_users_seaorm(conn);
//let user = User::get_rusty_user(); //let user = User::get_rusty_user();
//for user in users.iter() { for usermodel in usersmodels.iter() {
// store.write().await.insert(user.get_id(), user); 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 user_store = AuthMemoryStore::new(&store);
let auth_layer = AuthLayer::new(user_store, &secret); 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); let meili_client = Client::new(meili_url, meili_key);
async fn login_handler(mut auth: AuthContext, Json(user_sent): Json<User>) {
auth.login(&user_sent).await.unwrap();
}
async fn register_handler(mut auth: AuthContext, Json(user_sent): Json<User>) {
// 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() let app = Router::new()
.route("/api/search_openlibrary", get(search_openlibrary)) .route("/api/search_openlibrary", get(search_openlibrary))
.route("/api/create_by_isbn", get(create_by_isbn)) .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/login", post(login_handler))
.route("/api/register", post(register_handler)) .route("/api/register", post(register_handler))
.route("/api/logout", post(logout_handler)) .route("/api/logout", post(logout_handler))
.nest("/images", get_service(ServeDir::new(images_dir)).handle_error(handle_error)) .nest_service("/images", get_service(ServeDir::new(images_dir)).handle_error(handle_error))
.merge(SpaRouter::new("/assets", opt.static_dir)) .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(auth_layer)
.layer(session_layer) .layer(session_layer)
.layer(Extension(store))
.layer(ServiceBuilder::new().layer(TraceLayer::new_for_http())) .layer(ServiceBuilder::new().layer(TraceLayer::new_for_http()))
.layer(Extension(conn)) .layer(Extension(conn))
.layer(Extension(meili_client)) .layer(Extension(meili_client))
@@ -340,18 +330,52 @@ pub async fn main() {
.expect("Unable to start server"); .expect("Unable to start server");
} }
#[axum_macros::debug_handler]
async fn register_handler(mut auth: AuthContext, Extension(ref conn): Extension<DatabaseConnection>,
Extension(ref store): Extension<RwLock<HashMap<i32, User>>>,
Json(user_sent): Json<User>) -> 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( async fn list_users(
Extension(ref conn): Extension<DatabaseConnection>, Extension(ref conn): Extension<DatabaseConnection>,
axum::extract::Query(params): axum::extract::Query<HashMap<String, String>>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let res = PaginatedBookUIList{ let usersmodels : Vec<user::Model> = QueryCore::list_all_users(&conn).await.unwrap_or(Vec::new());
num_pages: books.1 as u32, let mut users : Vec<User> = Vec::new();
books: resbooks for usermodel in usersmodels.iter() {
}; let user = User{
return Json(res); id: usermodel.id,
// "success" 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<User>) -> 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 //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 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 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) let books = QueryCore::find_books_plus_meta_in_page(conn,page,userid,12)
.await .await
@@ -687,7 +711,7 @@ async fn list_search_book(
) -> impl IntoResponse { ) -> impl IntoResponse {
let page: usize = params.get("page").unwrap().parse().unwrap(); let page: usize = params.get("page").unwrap().parse().unwrap();
let search = params.get("search").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(); dotenvy::dotenv().ok();
let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file");