diff options
| author | Kit La Touche <kit@transneptune.net> | 2024-09-30 21:41:36 -0400 |
|---|---|---|
| committer | Kit La Touche <kit@transneptune.net> | 2024-09-30 21:41:36 -0400 |
| commit | c0fead957c6433be1ddfbbe8a55276a4aa8fc4df (patch) | |
| tree | fb8a12519e86628349d8070a193d3ce75a82e1a8 /src/login/routes.rs | |
| parent | a6a170ab5320d9ef0a2e007ac3ab75edee574fef (diff) | |
| parent | 6c054c5b8d43a818ccfa9087960dc19b286e6bb7 (diff) | |
Merge branch 'main' into feature-frontend
Diffstat (limited to 'src/login/routes.rs')
| -rw-r--r-- | src/login/routes.rs | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/login/routes.rs b/src/login/routes.rs index 4664063..8d9e938 100644 --- a/src/login/routes.rs +++ b/src/login/routes.rs @@ -78,27 +78,32 @@ struct LogoutRequest {} async fn on_logout( State(app): State<App>, + RequestedAt(now): RequestedAt, identity: IdentityToken, // This forces the only valid request to be `{}`, and not the infinite // variation allowed when there's no body extractor. Json(LogoutRequest {}): Json<LogoutRequest>, ) -> Result<(IdentityToken, StatusCode), LogoutError> { if let Some(secret) = identity.secret() { - app.logins().logout(&secret).await.map_err(LogoutError)?; + let (token, _) = app.logins().validate(&secret, &now).await?; + app.logins().logout(&token).await?; } let identity = identity.clear(); Ok((identity, StatusCode::NO_CONTENT)) } -#[derive(Debug)] -struct LogoutError(app::ValidateError); +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +enum LogoutError { + ValidateError(#[from] app::ValidateError), + DatabaseError(#[from] sqlx::Error), +} impl IntoResponse for LogoutError { fn into_response(self) -> Response { - let Self(error) = self; - match error { - error @ app::ValidateError::InvalidToken => { + match self { + error @ Self::ValidateError(app::ValidateError::InvalidToken) => { (StatusCode::UNAUTHORIZED, error.to_string()).into_response() } other => Internal::from(other).into_response(), |
