mod events; mod jwt; mod user; use axum::{ routing::{get, post}, Router, }; use jsonwebtoken::{DecodingKey, EncodingKey}; use sqlx::postgres::PgPoolOptions; use sqlx::PgPool; use std::net::SocketAddr; use user::{signin, signup}; #[derive(Clone)] pub struct AppState { pub db_pool: PgPool, pub jwt_encode: EncodingKey, pub jwt_decode: DecodingKey, } #[tokio::main] async fn main() { tracing_subscriber::fmt::init(); // Ex. // export DATABASE_URL="postgres://school_app_api_user:school_app_api_pass@localhost/school_app_api" let db_url = std::env::var("DATABASE_URL") .expect("Set `DATABASE_URL` to the url of the postgres database."); let (jwt_encode, jwt_decode) = jwt::get_jwt_keys(); let db_pool = PgPoolOptions::new() .max_connections(50) .connect(&db_url) .await .expect("could not connect to database_url"); // build our application with a route let app = Router::new() .route("/", get(root)) .route("/user/signup", post(signup)) .route("/user/signin", post(signin)) .route("/event", post(events::create_event)) .route("/event/preview", get(events::get_events_preview)) .with_state(AppState { db_pool, jwt_encode, jwt_decode, }); // run our app with hyper // `axum::Server` is a re-export of `hyper::Server` let addr = SocketAddr::from(([0, 0, 0, 0], 3000)); tracing::info!("listening on {}", addr); axum::Server::bind(&addr) .serve(app.into_make_service()) .await .unwrap(); } async fn root() -> &'static str { "Hello, World!" }