From 5ff106e910544788bc916626ae7665cb26e5af30 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Fri, 11 Oct 2024 20:55:36 -0400 Subject: Provide a separate "initial setup" endpoint that creates a user. --- src/ui.rs | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) (limited to 'src/ui.rs') diff --git a/src/ui.rs b/src/ui.rs index 34eb6f1..d0bb095 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -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 { - Router::new() - .route("/*path", get(asset)) - .route("/", get(root)) - .route("/login", get(login)) - .route("/ch/:channel", get(channel)) +pub fn router(app: &App) -> Router { + [ + 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) -> Result> { @@ -55,6 +63,14 @@ async fn login() -> Result { Assets::index() } +async fn setup(State(app): State) -> Result { + if app.setup().completed().await? { + Ok(Redirect::to("/login").into_response()) + } else { + Ok(Assets::index().into_response()) + } +} + async fn channel( State(app): State, login: Option, @@ -96,3 +112,11 @@ where (StatusCode::NOT_FOUND, response).into_response() } } + +pub async fn setup_required(State(app): State, 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(), + } +} -- cgit v1.2.3