use std::sync::Arc; use crate::routes::user::controller::UserController; use crate::routes::user::model::{User, UserResponse}; use crate::routes::user::service::UserService; use axum::http::StatusCode; use axum::routing::get; use axum::{serve, Router}; use config::db::init_db; use dotenvy::dotenv; use tokio::net::TcpListener; use utoipa::OpenApi; use utoipa_swagger_ui::SwaggerUi; mod base; mod config; mod routes; #[tokio::main] async fn main() { dotenv().ok(); let pool = init_db(); let hc_router = Router::new().route("/", get(health_check)); let user_service = UserService::new(pool); let user_controller = Arc::new(UserController::new(user_service)); let app = Router::new() .merge(UserController::routes(user_controller.clone())) .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", ApiDoc::openapi())) .nest("/hc", hc_router); let listener = TcpListener::bind("0.0.0.0:3000").await.unwrap(); serve(listener, app).await.unwrap(); async fn health_check() -> StatusCode { StatusCode::OK } #[derive(OpenApi)] #[openapi( components( schemas(User, UserResponse) ), tags( (name = "users", description = "User management endpoints") ) )] struct ApiDoc; }