yggdrasil/src/main.rs

76 lines
2.4 KiB
Rust

mod api;
mod auth;
mod components;
mod context;
mod db;
#[cfg(feature = "server")]
mod highlight;
mod hooks;
mod models;
mod pages;
mod router;
mod tasks;
mod theme;
mod utils;
fn main() {
#[cfg(feature = "server")]
{
dotenvy::dotenv().ok();
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
)
.init();
if std::env::var("DATABASE_URL").is_err() {
tracing::error!("DATABASE_URL environment variable not set. Make sure .env exists or the variable is exported.");
eprintln!("ERROR: DATABASE_URL environment variable not set");
std::process::exit(1);
}
dioxus::server::serve(|| async move {
use dioxus::server::{axum, DioxusRouterExt, ServeConfig};
use tower_http::trace::TraceLayer;
use tracing::Level;
tokio::spawn(async {
tasks::session_cleanup::run_cleanup().await;
});
let config = ServeConfig::builder()
.incremental(
dioxus::server::IncrementalRendererConfig::default()
.invalidate_after(std::time::Duration::from_secs(300)),
);
let router = axum::Router::new()
.route(
"/api/upload",
axum::routing::post(crate::api::upload::upload_image)
.layer(axum::extract::DefaultBodyLimit::disable()),
)
.nest_service("/uploads", tower_http::services::ServeDir::new("uploads"))
.serve_dioxus_application(config, router::AppRouter)
.layer(
TraceLayer::new_for_http()
.make_span_with(
tower_http::trace::DefaultMakeSpan::new().level(Level::INFO),
)
.on_request(tower_http::trace::DefaultOnRequest::new().level(Level::INFO))
.on_response(
tower_http::trace::DefaultOnResponse::new().level(Level::INFO),
),
);
Ok(router)
});
}
#[cfg(not(feature = "server"))]
{
use router::AppRouter;
dioxus::launch(AppRouter);
}
}