mod routes; mod tokens; use axum::{routing::post, Router}; use sqlx::postgres::PgPoolOptions; use std::sync::Arc; use tokens::TokenService; use tower_http::cors::{Any, CorsLayer}; use tower_http::trace::TraceLayer; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; #[derive(Clone)] pub struct AppState { pub db: sqlx::PgPool, pub tokens: Arc, } #[tokio::main] async fn main() -> anyhow::Result<()> { dotenvy::dotenv().ok(); tracing_subscriber::registry() .with(tracing_subscriber::EnvFilter::new( std::env::var("RUST_LOG").unwrap_or_else(|_| "auth_api=debug,tower_http=debug".into()), )) .with(tracing_subscriber::fmt::layer()) .init(); let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); let jwt_secret = std::env::var("JWT_SECRET").expect("JWT_SECRET must be set"); let db = PgPoolOptions::new() .max_connections(5) .connect(&database_url) .await?; sqlx::migrate!("../../db/migrations") .run(&db) .await?; let state = AppState { db, tokens: Arc::new(TokenService::new(jwt_secret)), }; let cors = CorsLayer::new() .allow_origin(Any) .allow_headers(Any) .allow_methods(Any); let app = Router::new() .route("/register", post(routes::register::register)) .route("/login", post(routes::login::login)) .route("/refresh", post(routes::refresh::refresh)) .route("/logout", post(routes::logout::logout)) .layer(cors) .layer(TraceLayer::new_for_http()) .with_state(state); let addr = "0.0.0.0:3001"; tracing::info!("auth-api listening on {addr}"); let listener = tokio::net::TcpListener::bind(addr).await?; axum::serve(listener, app).await?; Ok(()) }