2024-07-28 14:24:53 +00:00
|
|
|
use std::env;
|
2024-07-09 17:06:20 +00:00
|
|
|
use axum::{
|
|
|
|
|
// http::StatusCode,
|
|
|
|
|
// routing::{get, post},
|
|
|
|
|
// Json,
|
|
|
|
|
Router,
|
|
|
|
|
};
|
2024-07-18 15:39:09 +00:00
|
|
|
use axum::http::Method;
|
2024-07-28 14:24:53 +00:00
|
|
|
// use pbkdf2::password_hash::Error;
|
|
|
|
|
// use serde::{Deserialize, Serialize};
|
2024-07-18 15:39:09 +00:00
|
|
|
use tower::ServiceBuilder;
|
|
|
|
|
use tower_http::cors::{Any, CorsLayer};
|
|
|
|
|
use tower_http::trace::TraceLayer;
|
2024-07-09 17:06:20 +00:00
|
|
|
use tracing::info;
|
|
|
|
|
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
|
2024-07-28 14:24:53 +00:00
|
|
|
use crate::util::pass::get_pbkdf2_from_psw;
|
2024-07-09 17:06:20 +00:00
|
|
|
|
|
|
|
|
// Project modules
|
2024-07-28 14:24:53 +00:00
|
|
|
mod ledger;
|
2024-07-18 15:39:09 +00:00
|
|
|
mod middleware;
|
2024-07-09 17:06:20 +00:00
|
|
|
mod model;
|
|
|
|
|
mod util;
|
2024-07-28 14:24:53 +00:00
|
|
|
mod user;
|
2024-07-09 17:06:20 +00:00
|
|
|
|
|
|
|
|
// Passed App State
|
|
|
|
|
#[derive(Clone)]
|
2024-07-18 15:39:09 +00:00
|
|
|
pub struct AppState {
|
2024-07-09 17:06:20 +00:00
|
|
|
db: deadpool_diesel::postgres::Pool,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
|
async fn main() {
|
|
|
|
|
dotenvy::dotenv().unwrap();
|
2024-07-18 15:39:09 +00:00
|
|
|
tracing_subscriber::registry()
|
|
|
|
|
.with(tracing_subscriber::fmt::layer())
|
|
|
|
|
.init();
|
2024-07-28 14:24:53 +00:00
|
|
|
|
|
|
|
|
let args: Vec<String> = env::args().collect();
|
|
|
|
|
|
|
|
|
|
if args.len() <= 1 {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-07-09 17:06:20 +00:00
|
|
|
// initialize db connection
|
|
|
|
|
let db_url = std::env::var("DATABASE_URL").unwrap();
|
|
|
|
|
|
|
|
|
|
let manager = deadpool_diesel::postgres::Manager::new(db_url, deadpool_diesel::Runtime::Tokio1);
|
|
|
|
|
let pool = deadpool_diesel::postgres::Pool::builder(manager)
|
|
|
|
|
.build()
|
|
|
|
|
.unwrap();
|
|
|
|
|
|
2024-07-18 15:39:09 +00:00
|
|
|
let shared_state = AppState { db: pool };
|
2024-07-28 14:24:53 +00:00
|
|
|
let cmd = args[1].clone();
|
|
|
|
|
|
|
|
|
|
match cmd.as_str() {
|
|
|
|
|
"add_user" => {
|
|
|
|
|
println!("adding user");
|
|
|
|
|
if args.len() <= 4 {
|
|
|
|
|
println!("insufficient arg number");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
let user = args[2].clone();
|
|
|
|
|
let psw = args[3].clone();
|
|
|
|
|
let mail = args[4].clone();
|
|
|
|
|
println!("adding user {}", user);
|
|
|
|
|
let hashed = get_pbkdf2_from_psw(psw);
|
|
|
|
|
let mut hash_psw = "".to_string();
|
|
|
|
|
match hashed {
|
|
|
|
|
Ok(val) => {
|
|
|
|
|
println!("get hash {}", val);
|
|
|
|
|
hash_psw=val;
|
|
|
|
|
}
|
|
|
|
|
Err(_) => {}
|
|
|
|
|
}
|
|
|
|
|
let res = user::dal::add_user(shared_state, user, hash_psw, mail)
|
|
|
|
|
.await;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
_ => {
|
|
|
|
|
println!("unknown command {}", cmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-09 17:06:20 +00:00
|
|
|
|
|
|
|
|
// Register routers
|
2024-07-18 15:39:09 +00:00
|
|
|
let cors_layer = CorsLayer::new()
|
|
|
|
|
.allow_methods([Method::GET, Method::POST])
|
|
|
|
|
.allow_origin(Any);
|
|
|
|
|
let global_layer = ServiceBuilder::new()
|
|
|
|
|
.layer(TraceLayer::new_for_http())
|
|
|
|
|
.layer(cors_layer);
|
|
|
|
|
|
2024-07-09 17:06:20 +00:00
|
|
|
let app = Router::new()
|
|
|
|
|
// V1 apis
|
2024-07-28 14:24:53 +00:00
|
|
|
.nest("/api/v1/category", ledger::category::get_nest_handlers())
|
|
|
|
|
.nest("/api/v1/tag", ledger::tag::get_nest_handlers())
|
|
|
|
|
.nest("/api/v1/user", user::handler::get_nest_handlers())
|
2024-07-18 15:39:09 +00:00
|
|
|
.with_state(shared_state)
|
|
|
|
|
.layer(global_layer);
|
2024-07-09 17:06:20 +00:00
|
|
|
|
|
|
|
|
let listener = tokio::net::TcpListener::bind("0.0.0.0:8987").await.unwrap();
|
|
|
|
|
info!("starting server on 0.0.0.0:8987");
|
|
|
|
|
axum::serve(listener, app).await.unwrap();
|
2023-10-14 10:49:05 +08:00
|
|
|
}
|