Files
helios-server-rs/src/main.rs

104 lines
2.9 KiB
Rust
Raw Normal View History

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
}