feat(server): implement signup POST request and automatic sign-in
parent
89f8b08b5e
commit
4902f4d1fe
|
@ -30,7 +30,7 @@ pub fn router(ctx: Context) -> Router<Context> {
|
|||
// loop
|
||||
.route("/login", get(get_login).post(post_login))
|
||||
.route("/logout", post(post_logout))
|
||||
.route("/signup", get(get_signup))
|
||||
.route("/signup", get(get_signup).post(post_signup))
|
||||
}
|
||||
|
||||
/// Middleware that authenticates the current user via the session token. If the credentials are
|
||||
|
@ -206,7 +206,38 @@ async fn get_signup(State(ctx): State<Context>, headers: HeaderMap, jar: CookieJ
|
|||
|
||||
async fn post_signup(
|
||||
State(ctx): State<Context>,
|
||||
jar: CookieJar,
|
||||
user_agent: Option<TypedHeader<UserAgent>>,
|
||||
Form(signup): Form<SignupForm>,
|
||||
) -> AppResult<Response> {
|
||||
todo!()
|
||||
if signup.validate(&ctx)?.valid() {
|
||||
// Create the user and log them in
|
||||
match tokio::task::spawn_blocking(move || {
|
||||
let user = ctx.store.create_user(&signup.username, &signup.password)?;
|
||||
let user_agent = user_agent.map(|header| header.to_string());
|
||||
let session = ctx.store.user(&user).create_session(user_agent)?;
|
||||
|
||||
Ok::<_, AuthErr>(session)
|
||||
})
|
||||
.await
|
||||
.unwrap()
|
||||
{
|
||||
Ok(session) => Ok((
|
||||
// Redirect forces htmx to reload the full page, refreshing the navbar
|
||||
[("HX-Redirect", "/")],
|
||||
(jar.add(
|
||||
Cookie::build((super::SESSION_ID_COOKIE, session.id.to_string()))
|
||||
.secure(true)
|
||||
.same_site(cookie::SameSite::Lax)
|
||||
.http_only(true)
|
||||
.path("/")
|
||||
.max_age(Duration::days(365)),
|
||||
)),
|
||||
)
|
||||
.into_response()),
|
||||
Err(err) => Err(AppError::from(err)),
|
||||
}
|
||||
} else {
|
||||
todo!("return form with error messages")
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue