49 lines
1.3 KiB
Rust
49 lines
1.3 KiB
Rust
use std::env;
|
|
|
|
use axum::http::HeaderValue;
|
|
use sqlx::{Pool, Postgres};
|
|
use tokio::net::TcpListener;
|
|
use tower_http::{
|
|
cors::{self, CorsLayer},
|
|
services::ServeDir,
|
|
};
|
|
|
|
use crate::{
|
|
Result,
|
|
api::{self, AppState},
|
|
};
|
|
|
|
pub type Router = axum::Router<AppState>;
|
|
|
|
pub(super) async fn start(pool: Pool<Postgres>) -> Result<()> {
|
|
let cors_origin = env::var("CORS_ALLOW_ORIGIN").unwrap_or("*".to_string());
|
|
let serve_dir = std::env::var("SERVE_DIRECTORY")?;
|
|
|
|
let mut app = Router::new()
|
|
.nest("/api", api::router())
|
|
.layer(
|
|
CorsLayer::new().allow_origin(cors::AllowOrigin::exact(HeaderValue::from_str(
|
|
&cors_origin,
|
|
)?)),
|
|
)
|
|
.with_state(AppState::new(pool, serve_dir));
|
|
|
|
if !cfg!(debug_assertions) {
|
|
let frontend_path = env::var("STATIC_FRONTEND_DIR").unwrap_or("./frontend".to_string());
|
|
let frontend_service = ServeDir::new(frontend_path);
|
|
|
|
log::debug!("Registering static frontend");
|
|
app = app.fallback_service(frontend_service);
|
|
}
|
|
|
|
let addr = env::var("BIND_ADDRESS").unwrap_or("127.0.0.1:8080".to_string());
|
|
|
|
let listener = TcpListener::bind(&addr).await?;
|
|
|
|
log::info!("Listening on {}", addr);
|
|
|
|
axum::serve(listener, app).await?;
|
|
|
|
Ok(())
|
|
}
|