mod handlers; use axum::{routing::get, Router}; use std::net::SocketAddr; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; use contracts::ProfessionState; #[tokio::main] async fn main() { tracing_subscriber::registry() .with(tracing_subscriber::EnvFilter::new( std::env::var("RUST_LOG").unwrap_or_else(|_| "info".into()), )) .with(tracing_subscriber::fmt::layer()) .init(); let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); let pool = sqlx::postgres::PgPoolOptions::new() .max_connections(5) .connect(&database_url) .await .expect("Failed to connect to postgres"); let redis_url = std::env::var("REDIS_URL") .unwrap_or_else(|_| "redis://127.0.0.1:6379".to_string()); let redis = cache::connect(&redis_url) .await .expect("Failed to connect to Redis"); tracing::info!("Social Media Managers service — connected to DB and Redis"); let state = ProfessionState { pool, redis }; let app = Router::new() .nest("/api/social-media-managers", handlers::router()) .route("/health", get(|| async { "Social Media Managers OK" })) .with_state(state); let port: u16 = std::env::var("PORT") .unwrap_or_else(|_| "8091".to_string()) .parse() .expect("PORT must be a number"); let addr = SocketAddr::from(([0, 0, 0, 0], port)); tracing::info!("Social Media Managers service listening on {}", addr); let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); axum::serve(listener, app).await.unwrap(); }