Add login and logout endpoints
All checks were successful
Push Workflows / rustfmt (push) Successful in 6s
Push Workflows / tailwind-build (push) Successful in 11s
Push Workflows / clippy (push) Successful in 43s
Push Workflows / test (push) Successful in 1m4s
Push Workflows / docs (push) Successful in 1m8s
Push Workflows / build (push) Successful in 1m30s
Push Workflows / nix-build (push) Successful in 5m27s
All checks were successful
Push Workflows / rustfmt (push) Successful in 6s
Push Workflows / tailwind-build (push) Successful in 11s
Push Workflows / clippy (push) Successful in 43s
Push Workflows / test (push) Successful in 1m4s
Push Workflows / docs (push) Successful in 1m8s
Push Workflows / build (push) Successful in 1m30s
Push Workflows / nix-build (push) Successful in 5m27s
This commit is contained in:
49
src/api/auth.rs
Normal file
49
src/api/auth.rs
Normal file
@@ -0,0 +1,49 @@
|
||||
use dioxus::prelude::*;
|
||||
|
||||
use crate::models::user::{User, UserCredentials};
|
||||
use crate::util::error::Result;
|
||||
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(feature = "server")] {
|
||||
|
||||
use dioxus::server::axum::Extension;
|
||||
|
||||
use crate::server::auth::AuthSession;
|
||||
use crate::util::error::{AuthError, Contextualize, Error, ErrorType};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#[post("/api/v1/auth/login", mut auth: Extension<AuthSession>)]
|
||||
pub async fn login(credentials: UserCredentials) -> Result<User> {
|
||||
let db_user = match auth.authenticate(credentials).await {
|
||||
Ok(Some(db_user)) => Ok(db_user),
|
||||
Ok(None) => Err(Error::new_here(ErrorType::Auth(
|
||||
AuthError::InvalidCredentials,
|
||||
))),
|
||||
Err(axum_login::Error::Session(e)) => Err(Error::new_here(ErrorType::Auth(
|
||||
AuthError::Error(format!("Session error: {e}")),
|
||||
))),
|
||||
Err(axum_login::Error::Backend(e)) => Err(e),
|
||||
}
|
||||
.err_context("Error authenticating")?;
|
||||
|
||||
auth.login(&db_user)
|
||||
.await
|
||||
.map_err(|e| Error::new_here(ErrorType::Auth(AuthError::Error(e.to_string()))))
|
||||
.err_context("Error logging in")?;
|
||||
|
||||
Ok(db_user.into())
|
||||
}
|
||||
|
||||
#[post("/api/v1/auth/logout", mut auth: Extension<AuthSession>)]
|
||||
pub async fn logout() -> Result<()> {
|
||||
match auth.logout().await {
|
||||
Ok(_) => Ok(()),
|
||||
Err(axum_login::Error::Session(e)) => Err(Error::new_here(ErrorType::Auth(
|
||||
AuthError::Error(format!("Session error: {e}")),
|
||||
))),
|
||||
Err(axum_login::Error::Backend(e)) => Err(e),
|
||||
}
|
||||
.err_context("Error logging out")
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
|
||||
pub mod auth;
|
||||
|
||||
Reference in New Issue
Block a user