use argon2::PasswordVerifier;
use quokka::state::FromState;
use crate::{
entity::user::UserRepository,
middleware::{AdminLoginProvider, LoginData, LoginResult},
};
#[derive(Clone, FromState)]
pub struct DbLoginProvider {
user_repository: UserRepository,
}
impl AdminLoginProvider for DbLoginProvider {
async fn do_login(&self, login_data: &LoginData) -> quokka::Result<Option<LoginResult>> {
let Some(user) = self
.user_repository
.get_user_by_name(&login_data.login_name)
.await?
else {
return Ok(None);
};
if argon2::Argon2::default()
.verify_password(
login_data.password.as_bytes(),
&argon2::PasswordHash::new(&user.password).map_err(quokka::Error::wrap_error(
"Unable to parse password hash",
500,
))?,
)
.is_ok()
{
return Ok(Some(LoginResult {
user_identifier: user.username,
}));
}
Ok(None)
}
}