quokka-admin 0.1.0

An admin panel for quokka
Documentation
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)
    }
}