mod auth; mod config; mod db; mod entities; mod handlers; mod routes; use crate::auth::{AppState, OidcClient}; use crate::config::Config; use crate::routes::create_router; use migration::MigratorTrait; use std::net::SocketAddr; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; #[tokio::main] async fn main() { // Initialize tracing tracing_subscriber::registry() .with(tracing_subscriber::fmt::layer()) .init(); // Load configuration let config = Config::from_env(); // Connect to database let db = db::connect(&config) .await .expect("Failed to connect to database"); tracing::info!("Connected to database"); // Run migrations migration::Migrator::up(&db, None) .await .expect("Failed to run migrations"); tracing::info!("Migrations completed"); // Initialize OIDC client let oidc = OidcClient::new(&config) .await .expect("Failed to initialize OIDC client"); // Create AppState let state = AppState { db: db.clone(), oidc, }; // Create router let app = create_router(state) .layer(tower_http::cors::CorsLayer::permissive()) .fallback_service(tower_http::services::ServeDir::new("static")); // Start server let addr = SocketAddr::from(([127, 0, 0, 1], config.port)); tracing::info!("listening on {}", addr); let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); axum::serve(listener, app).await.unwrap(); }