summaryrefslogtreecommitdiff
path: root/src/ui.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui.rs')
-rw-r--r--src/ui.rs38
1 files changed, 31 insertions, 7 deletions
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<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(),
+ }
+}