use axum::{Json, Router, routing::delete, routing::post}; use std::net::SocketAddr; mod db; mod model; #[tokio::main] async fn main() { tracing_subscriber::fmt::init(); let app = Router::new() .route("/api/users", post(get_all_users_handler)) .route("/api/users/user", post(get_user_by_id_handler)) .route( "/api/users/user/username", post(get_user_by_username_handler), ) .route("/api/users/add", post(add_user_handler)) .route("/api/users", delete(delete_user_handler)); let addr = SocketAddr::from(([0, 0, 0, 0], 8888)); println!("Сервер запускается на {}", addr); axum::serve(tokio::net::TcpListener::bind(addr).await.unwrap(), app) .await .unwrap(); } async fn get_all_users_handler() -> Json> { let users = db::get_all_users(); let mapped_users = users .into_iter() .map(|user| model::GetUserResponse { id: user.id, username: user.username, email: user.email, group: user.group, is_superuser: user.is_superuser, }) .collect(); Json(mapped_users) } async fn get_user_by_id_handler( Json(payload): Json, ) -> Json> { let user = db::get_user_by_id(payload.id); let mapped_user = user.map(|user| model::GetUserResponse { id: user.id, username: user.username, email: user.email, group: user.group, is_superuser: user.is_superuser, }); Json(mapped_user) } async fn get_user_by_username_handler( Json(payload): Json, ) -> Json> { let user = db::get_user_by_username(&payload.username); let mapped_user = user.map(|user| model::GetUserResponse { id: user.id, username: user.username, email: user.email, group: user.group, is_superuser: user.is_superuser, }); Json(mapped_user) } async fn add_user_handler( Json(payload): Json, ) -> Json { let user = model::User { id: payload.id.clone(), username: payload.username.clone(), email: payload.email.clone(), password: payload.password.clone(), group: payload.group.clone(), is_superuser: payload.is_superuser, }; Json(db::insert_user(user)) } async fn delete_user_handler( Json(payload): Json, ) -> Json { let deleted: bool = db::delete_user(payload.id); Json(model::DeleteUserResponse { success: deleted }) }