From 5017bfb7101f87b18d09c87184cfc047b1e33584 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Thu, 28 Aug 2025 13:27:09 +0200 Subject: [PATCH] feat(server): add error feedback to signup form --- otter/src/server/web/auth.rs | 15 +++++++++++-- otter/src/web/mod.rs | 1 + otter/src/web/templates/views/signup.html | 27 +++++++++++++++++++++-- otter/src/web/view.rs | 3 +++ 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/otter/src/server/web/auth.rs b/otter/src/server/web/auth.rs index d9cd299..51f48f0 100644 --- a/otter/src/server/web/auth.rs +++ b/otter/src/server/web/auth.rs @@ -195,6 +195,7 @@ async fn get_signup(State(ctx): State, headers: HeaderMap, jar: CookieJ Redirect::to("/").into_response() } else { View::Signup { + username: None, username_available: true, passwords_match: true, } @@ -207,10 +208,13 @@ async fn get_signup(State(ctx): State, headers: HeaderMap, jar: CookieJ async fn post_signup( State(ctx): State, jar: CookieJar, + headers: HeaderMap, user_agent: Option>, Form(signup): Form, ) -> AppResult { - if signup.validate(&ctx)?.valid() { + let validation = signup.validate(&ctx)?; + + if validation.valid() { // Create the user and log them in match tokio::task::spawn_blocking(move || { let user = ctx.store.create_user(&signup.username, &signup.password)?; @@ -238,6 +242,13 @@ async fn post_signup( Err(err) => Err(AppError::from(err)), } } else { - todo!("return form with error messages") + Ok(View::Signup { + username: Some(signup.username), + username_available: validation.username_available, + passwords_match: validation.passwords_match, + } + .page(&headers) + .response(&ctx.tera) + .into_response()) } } diff --git a/otter/src/web/mod.rs b/otter/src/web/mod.rs index f72e0a9..7abb954 100644 --- a/otter/src/web/mod.rs +++ b/otter/src/web/mod.rs @@ -91,6 +91,7 @@ pub fn initialize_tera() -> tera::Result { ), ( View::Signup { + username: None, username_available: true, passwords_match: true, } diff --git a/otter/src/web/templates/views/signup.html b/otter/src/web/templates/views/signup.html index 00dab19..6a9cc4a 100644 --- a/otter/src/web/templates/views/signup.html +++ b/otter/src/web/templates/views/signup.html @@ -1,11 +1,34 @@
- + + {% if not username_available %} + Username not available + {% endif %} - + + {% if not passwords_match %} + Passwords don't match + {% endif %}
diff --git a/otter/src/web/view.rs b/otter/src/web/view.rs index 049ceaa..ce1e54a 100644 --- a/otter/src/web/view.rs +++ b/otter/src/web/view.rs @@ -9,6 +9,7 @@ pub enum View { Sessions(Vec, i64, Option), Users(Vec, i64, Option), Signup { + username: Option, username_available: bool, passwords_match: bool, }, @@ -67,9 +68,11 @@ impl Template for View { } } Self::Signup { + username, username_available, passwords_match, } => { + ctx.insert("username", &username); ctx.insert("username_available", &username_available); ctx.insert("passwords_match", &passwords_match); }