mod config; mod db; mod primary_market; mod registry; mod secondary_market; use axum::{ http::{ header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE}, Method, }, routing::get, Json, Router, }; use serde_json::{json, Value}; use tower_http::cors::{Any, CorsLayer}; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; #[tokio::main] async fn main() -> Result<(), Box> { // Initialize tracing tracing_subscriber::registry() .with( tracing_subscriber::EnvFilter::try_from_default_env() .unwrap_or_else(|_| "database=debug,tower_http=debug,axum=debug".into()), ) .with(tracing_subscriber::fmt::layer()) .init(); // Load environment variables dotenvy::dotenv().ok(); let config = config::Config::from_env()?; tracing::info!("Starting EU ETS Database Service"); tracing::info!("Connecting to database..."); // Create database pool let pool = db::create_pool(&config.database_url).await?; tracing::info!("Database connection established"); // Run migrations tracing::info!("Running database migrations..."); db::run_migrations(&pool).await?; // Configure CORS let cors = CorsLayer::new() .allow_origin(Any) .allow_methods([Method::GET, Method::POST, Method::PUT, Method::DELETE]) .allow_headers([AUTHORIZATION, ACCEPT, CONTENT_TYPE]); // Build application router let app = Router::new() .route("/", get(root_handler)) .route("/health", get(health_handler)) .nest("/api/registry", registry::create_routes(pool.clone())) .nest( "/api/secondary-market", secondary_market::create_routes(pool.clone()), ) .nest( "/api/primary-market", primary_market::create_routes(pool.clone()), ) .layer(cors); // Start server let listener = tokio::net::TcpListener::bind(&config.server_address()).await?; tracing::info!("Server listening on {}", config.server_address()); axum::serve(listener, app).await?; Ok(()) } async fn root_handler() -> Json { Json(json!({ "service": "EU ETS Database Service", "version": "0.1.0", "status": "running" })) } async fn health_handler() -> Json { Json(json!({ "status": "healthy", "timestamp": chrono::Utc::now().to_rfc3339() })) }