use super::system::AuthSystem;
use crate::core::models::user::types::User;
use crate::utils::auth::crypto::password::{hash_password, verify_password};
use crate::utils::error::gateway_error::{GatewayError, Result};
use tracing::info;
impl AuthSystem {
pub async fn create_user(
&self,
username: String,
email: String,
password: String,
) -> Result<User> {
info!("Creating new user: {}", username);
let password_hash = hash_password(&password)?;
let user = User::new(username, email, password_hash);
self.storage.db().create_user(&user).await
}
pub async fn login(&self, username: &str, password: &str) -> Result<(User, String)> {
info!("User login attempt: {}", username);
let user = self
.storage
.db()
.find_user_by_username(username)
.await?
.ok_or_else(|| GatewayError::auth("Invalid username or password"))?;
if !verify_password(password, &user.password_hash)? {
return Err(GatewayError::auth("Invalid username or password"));
}
if !user.is_active() {
return Err(GatewayError::auth("Account is not active"));
}
let session_id = uuid::Uuid::new_v4();
let permissions = self.get_user_permissions(&user).await?;
let session_token = self
.jwt
.create_access_token(
user.id(),
format!("{:?}", user.role),
permissions,
user.team_ids.first().copied(),
Some(session_id),
)
.await?;
self.storage.db().update_user_last_login(user.id()).await?;
info!("User logged in successfully: {}", username);
Ok((user, session_token))
}
pub async fn logout(&self, session_token: &str) -> Result<()> {
info!("User logout");
if let Ok(claims) = self.jwt.verify_access_token(session_token).await
&& let Some(session_id) = claims.session_id
{
info!("Invalidated session: {}", session_id);
}
Ok(())
}
}