diff options
Diffstat (limited to 'src/ui.rs')
| -rw-r--r-- | src/ui.rs | 38 |
1 files changed, 31 insertions, 7 deletions
@@ -1,6 +1,7 @@ use axum::{ - extract::{Path, State}, + extract::{Path, Request, State}, http::{header, StatusCode}, + middleware::{self, Next}, response::{IntoResponse, Redirect, Response}, routing::get, Router, @@ -31,12 +32,19 @@ impl Assets { } } -pub fn router() -> Router<App> { - Router::new() - .route("/*path", get(asset)) - .route("/", get(root)) - .route("/login", get(login)) - .route("/ch/:channel", get(channel)) +pub fn router(app: &App) -> Router<App> { + [ + Router::new() + .route("/*path", get(asset)) + .route("/setup", get(setup)), + Router::new() + .route("/", get(root)) + .route("/login", get(login)) + .route("/ch/:channel", get(channel)) + .route_layer(middleware::from_fn_with_state(app.clone(), setup_required)), + ] + .into_iter() + .fold(Router::default(), Router::merge) } async fn asset(Path(path): Path<String>) -> Result<Asset, NotFound<String>> { @@ -55,6 +63,14 @@ async fn login() -> Result<impl IntoResponse, Internal> { Assets::index() } +async fn setup(State(app): State<App>) -> Result<impl IntoResponse, Internal> { + if app.setup().completed().await? { + Ok(Redirect::to("/login").into_response()) + } else { + Ok(Assets::index().into_response()) + } +} + async fn channel( State(app): State<App>, login: Option<Login>, @@ -96,3 +112,11 @@ where (StatusCode::NOT_FOUND, response).into_response() } } + +pub async fn setup_required(State(app): State<App>, request: Request, next: Next) -> Response { + match app.setup().completed().await { + Ok(true) => next.run(request).await, + Ok(false) => Redirect::to("/setup").into_response(), + Err(error) => Internal::from(error).into_response(), + } +} |
