use std::time::Instant; use axum::Json; use chrono::{Duration, Utc}; use crate::controller::model::auth_model::*; use crate::db::repository::refresh_token_repository::create_refresh_token; use crate::db::repository::user_repository; use crate::errors::AppError; use crate::state::AppState; use crate::utils::anti_enumeration::anti_enumeration_delay; use crate::utils::hash; use crate::utils::jwt::generate_access_token; use crate::utils::refresh_token::generate_refresh_token; pub async fn login(state: &AppState, req: LoginRequest) -> Result, AppError> { todo!() } pub async fn register( state: &AppState, req: RegisterRequest, ) -> Result, AppError> { let start = Instant::now(); let mut tx = state.db.begin().await?; { let user = user_repository::get_user_by_email(&mut *tx, &req.email).await?; if user.is_some() { // user already registered anti_enumeration_delay(start, 150, 300).await; return Err(AppError::Internal); } } let h = hash::hash(&req.password)?; let user = user_repository::create_user(&mut *tx, req.email, h).await?; let access_token = generate_access_token(user.id, &state.jwt_secret)?; let (refresh_plain, refresh_hash) = generate_refresh_token(); let expires_at = chrono::Utc::now() + Duration::days(7); create_refresh_token(&mut *tx, user.id, refresh_hash, expires_at).await?; tx.commit().await?; anti_enumeration_delay(start, 150, 300).await; // TODO: put refresh token in cookie Ok(Json(AuthResponse { access_token: access_token, refresh_token: refresh_plain, })) }