use axum::{ Json, Router, http::StatusCode, routing::{get, post}, }; use axum_client_ip::{ClientIp, ClientIpSource}; use based::auth::{Sessions, User}; use owl::{prelude::*, save, set_global_db}; use rand::RngCore; use serde::{Deserialize, Serialize}; use serde_json::json; use std::net::SocketAddr; mod api; mod server_core; use server_core::route::{join_device, login_user}; fn generate_token() -> String { let mut rng = rand::rng(); let mut token = vec![0u8; 32]; rng.fill_bytes(&mut token); hex::encode(token) } #[tokio::main] async fn main() { tracing_subscriber::fmt::init(); let db = Database::in_memory(); set_global_db!(db); User::create("admin".to_string(), "admin", based::auth::UserRole::Admin) .await .unwrap(); let device = Router::new() .route("/join", post(join_device)) .layer(ClientIpSource::ConnectInfo.into_extension()); // Direct IP // .layer(ClientIpSource::XRealIp.into_extension()) // Proxy let user = Router::new().route("/login", post(login_user)); let app = Router::new().merge(device).merge(user); log::info!("Starting server"); let listener = tokio::net::TcpListener::bind("0.0.0.0:8000").await.unwrap(); axum::serve( listener, app.into_make_service_with_connect_info::(), ) .await .unwrap(); }