use axum::{extract::State, http::StatusCode, Json};
use std::sync::Arc;
use crate::{
error::{AuthError, AuthResult},
models::{AuthUser, Credentials, LoginResponse},
traits::AuthProvider,
AuthConfig,
};
pub async fn login_handler<P>(
State((provider, _config)): State<(Arc<P>, AuthConfig)>,
Json(credentials): Json<Credentials>,
) -> AuthResult<Json<LoginResponse>>
where
P: AuthProvider,
{
let user = provider
.authenticate(&credentials.email, &credentials.password)
.await?;
let session = provider.create_session(user.id).await?;
Ok(Json(LoginResponse::new(session, user)))
}
pub async fn logout_handler<P>(
State((provider, _config)): State<(Arc<P>, AuthConfig)>,
token: String, ) -> AuthResult<StatusCode>
where
P: AuthProvider,
{
provider.destroy_session(&token).await?;
Ok(StatusCode::NO_CONTENT)
}
pub async fn me_handler<P>(
State((provider, _config)): State<(Arc<P>, AuthConfig)>,
token: String, ) -> AuthResult<Json<AuthUser>>
where
P: AuthProvider,
{
let user = provider
.validate_session(&token)
.await?
.ok_or(AuthError::InvalidSession)?;
Ok(Json(user))
}