use argon2::PasswordVerifier; use axum::{ extract::State, http::StatusCode, response::{IntoResponse, Response}, }; use axum_login::{secrecy::SecretVec, AuthUser, SqliteStore}; use sqlx::SqlitePool; use uuid::Uuid; use crate::{templates::LoginGet, User}; pub type AuthContext = axum_login::extractors::AuthContext>; impl AuthUser for User { fn get_id(&self) -> Uuid { self.id } fn get_password_hash(&self) -> SecretVec { SecretVec::new(self.pwhash.as_bytes().to_vec()) } } //-************************************************************************ // Login error and success types //-************************************************************************ #[Error] pub struct LoginError(#[from] LoginErrorKind); #[Error] #[non_exhaustive] pub enum LoginErrorKind { BadPassword, Unknown, } impl IntoResponse for LoginError { fn into_response(self) -> Response { match self.0 { LoginErrorKind::Unknown => ( StatusCode::INTERNAL_SERVER_ERROR, "An unknown error occurred; you cursed, brah?", ) .into_response(), _ => (StatusCode::BAD_REQUEST, format!("{self}")).into_response(), } } } //-************************************************************************ // Login handlers //-************************************************************************ /// Handle login queries #[axum::debug_handler] pub async fn post_login( mut auth: AuthContext, State(pool): State, ) -> Result<(), LoginError> { Err(LoginErrorKind::Unknown.into()) } pub async fn get_login() -> impl IntoResponse { LoginGet::default() }