diff --git a/src/server/main.rs b/src/server/main.rs index 8ac0adc..2927dd6 100644 --- a/src/server/main.rs +++ b/src/server/main.rs @@ -9,11 +9,38 @@ use tower_http::services::ServeFile; use crate::App; use crate::app::LOGO_ICO; use crate::server::{ - auth::build_auth_layer, config::Config, database, key_val_store, + auth::build_auth_layer, + config::Config, + database::{self, DbPool}, + key_val_store::{self, KeyValPool}, require_auth_mw::require_auth_middleware, }; use crate::util::error::{Contextualize, Error, ErrorType, Result}; +pub fn build_router(config: Config, db_pool: DbPool, key_val_pool: KeyValPool) -> Router { + let favicon_path = { + // Resolve the favicon path + let asset_path = LOGO_ICO.resolve(); + + // If the asset path starts with "/", strip it. Otherwise it behaves as an "absolute path" + // and replaces the base path in the join operation. This is necessary because Dioxus will + // produce a path like "/assets/" in the call to `resolve` + let asset_path_rel = asset_path.strip_prefix("/").unwrap_or(&asset_path); + + config.server.public_path.join(asset_path_rel) + }; + + let auth_layer = build_auth_layer(db_pool.clone(), key_val_pool, config.auth.cookies_secure); + + Router::new() + .serve_dioxus_application(ServeConfig::new(), App) + .layer(from_fn(require_auth_middleware)) + .layer(Extension(config)) + .layer(Extension(db_pool)) + .layer(auth_layer) + .nest_service("/favicon.ico", ServeFile::new(favicon_path)) +} + pub async fn main() -> Result { if let Err(e) = dotenvy::dotenv() { tracing::warn!("Error reading .env: {e}"); @@ -43,33 +70,10 @@ pub async fn main() -> Result { .await .err_context("Failed key-value store setup")?; - let favicon_path = { - // Resolve the favicon path - let asset_path = LOGO_ICO.resolve(); - - // If the asset path starts with "/", strip it. Otherwise it behaves as an "absolute path" - // and replaces the base path in the join operation. This is necessary because Dioxus will - // produce a path like "/assets/" in the call to `resolve` - let asset_path_rel = asset_path.strip_prefix("/").unwrap_or(&asset_path); - - config.server.public_path.join(asset_path_rel) - }; - - tracing::debug!("Favicon path: {}", favicon_path.display()); - - let auth_layer = build_auth_layer(db_pool.clone(), key_val_pool, config.auth.cookies_secure); - let addr = config.server.serve_addr(); tracing::info!("Setup complete, building router..."); - - let router = Router::new() - .serve_dioxus_application(ServeConfig::new(), App) - .layer(from_fn(require_auth_middleware)) - .layer(Extension(config)) - .layer(Extension(db_pool)) - .layer(auth_layer) - .nest_service("/favicon.ico", ServeFile::new(favicon_path)); + let router = build_router(config, db_pool, key_val_pool); tracing::info!("Listening on {addr}..."); let listener = TcpListener::bind(addr)