mod auth; mod content; mod error; mod roles; mod routes; mod state; use crate::{auth::http::refresh_sessions, state::Config}; use anyhow::Result; use axum::{ middleware, routing::{get, post}, Router, Server, }; use figment::{ providers::{Env, Format, Serialized, Toml}, Figment, }; use sqlx::postgres::PgPoolOptions; use state::AppState; use std::{net::SocketAddr, sync::Arc}; #[tokio::main] async fn main() -> Result<()> { tracing_subscriber::fmt::init(); let config: Config = Figment::from(Serialized::defaults(Config::default())) .merge(Toml::file("mabel.toml")) .merge(Env::prefixed("MABEL_")) .extract()?; let addr: SocketAddr = config.bind.parse()?; let database = PgPoolOptions::new() .max_connections(5) .connect(config.database_url.as_str()) .await?; sqlx::migrate!().run(&database).await?; let shared_state = Arc::new(AppState { database, config }); let app = Router::new() .nest("/auth", routes::auth::router()) .nest("/admin", routes::admin::router()) .nest("/pages", routes::content::router()) .route_layer(middleware::from_fn_with_state( shared_state.clone(), refresh_sessions, )) .with_state(shared_state); tracing::debug!("listening on {}", addr); Server::bind(&addr).serve(app.into_make_service()).await?; Ok(()) }