user-auth store test1
This commit is contained in:
13
backend/Cargo.lock
generated
13
backend/Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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{
|
||||||
|
id: usermodel.id,
|
||||||
|
name: usermodel.user_name.clone().unwrap().clone(),
|
||||||
|
password_hash : "".to_string(),
|
||||||
};
|
};
|
||||||
return Json(res);
|
users.push(user);
|
||||||
// "success"
|
|
||||||
}
|
}
|
||||||
|
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");
|
||||||
|
|||||||
Reference in New Issue
Block a user