diff options
Diffstat (limited to 'src/login/routes.rs')
| -rw-r--r-- | src/login/routes.rs | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/login/routes.rs b/src/login/routes.rs index 2269ea6..ce4e491 100644 --- a/src/login/routes.rs +++ b/src/login/routes.rs @@ -1,7 +1,7 @@ use axum::{ extract::{Form, State}, http::StatusCode, - response::IntoResponse, + response::{IntoResponse, Redirect, Response}, routing::post, Router, }; @@ -32,10 +32,6 @@ async fn on_login( identity: IdentityToken, Form(form): Form<Login>, ) -> Result<impl IntoResponse, InternalError> { - if identity.token().is_some() { - return Ok((StatusCode::BAD_REQUEST, identity, "already logged in")); - } - let mut tx = db.begin().await?; // Spelling the following in the more conventional form, @@ -67,18 +63,30 @@ async fn on_login( let resp = if let Some(token) = token { let identity = identity.set(&token); - (StatusCode::OK, identity, "logged in") + (identity, LoginResponse::Successful) } else { - ( - StatusCode::UNAUTHORIZED, - identity, - "invalid name or password", - ) + (identity, LoginResponse::Rejected) }; Ok(resp) } +enum LoginResponse { + Rejected, + Successful, +} + +impl IntoResponse for LoginResponse { + fn into_response(self) -> Response { + match self { + Self::Rejected => { + (StatusCode::UNAUTHORIZED, "invalid name or password").into_response() + } + Self::Successful => Redirect::to("/").into_response(), + } + } +} + async fn on_logout( State(db): State<SqlitePool>, identity: IdentityToken, @@ -91,5 +99,5 @@ async fn on_logout( let identity = identity.clear(); - Ok((StatusCode::OK, identity, "logged out")) + Ok((identity, Redirect::to("/"))) } |
