use crate::domain::dto::auth::{DeleteUserRequest, LoginRequest, RefreshRequest, RegisterRequest}; use crate::domain::vo::auth::{LoginResult, RefreshResult, RegisterResult}; use crate::domain::vo::ApiResponse; use crate::error::ErrorResponse; use crate::infra::middleware::logging::{log_info, RequestId}; use crate::infra::middleware::UserId; use crate::repositories::user_repository::UserRepository; use crate::services::auth_service::AuthService; use crate::AppState; use axum::{ extract::{Extension, State}, Json, }; use serde_json::json; use validator::Validate; /// 注册 pub async fn register( Extension(request_id): Extension, State(state): State, Json(payload): Json, ) -> Result>, ErrorResponse> { payload .validate() .map_err(|e| ErrorResponse::bad_request(e.to_string()))?; log_info(&request_id, "注册请求参数", &payload); let user_repo = UserRepository::new(state.pool.clone()); let service = AuthService::new( user_repo, state.redis_client.clone(), state.config.auth.clone(), ); match service.register(payload).await { Ok((user_model, access_token, refresh_token)) => { let data = RegisterResult::from((user_model, access_token, refresh_token)); let response = ApiResponse::success(data); log_info(&request_id, "注册成功", &response); Ok(Json(response)) } Err(e) => { log_info(&request_id, "注册失败", e.to_string()); Err(ErrorResponse::new(e.to_string())) } } } /// 登录 pub async fn login( Extension(request_id): Extension, State(state): State, Json(payload): Json, ) -> Result>, ErrorResponse> { payload .validate() .map_err(|e| ErrorResponse::bad_request(e.to_string()))?; log_info(&request_id, "登录请求参数", &payload); let user_repo = UserRepository::new(state.pool.clone()); let service = AuthService::new( user_repo, state.redis_client.clone(), state.config.auth.clone(), ); match service.login(payload).await { Ok((user_model, access_token, refresh_token)) => { let data = LoginResult::from((user_model, access_token, refresh_token)); let response = ApiResponse::success(data); log_info(&request_id, "登录成功", &response); Ok(Json(response)) } Err(e) => { log_info(&request_id, "登录失败", e.to_string()); Err(ErrorResponse::new(e.to_string())) } } } /// 刷新 Token pub async fn refresh( Extension(request_id): Extension, State(state): State, Json(payload): Json, ) -> Result>, ErrorResponse> { log_info( &request_id, "刷新 token 请求", json!({"device_id": "default"}), ); let user_repo = UserRepository::new(state.pool.clone()); let service = AuthService::new( user_repo, state.redis_client.clone(), state.config.auth.clone(), ); match service.refresh_access_token(&payload.refresh_token).await { Ok((access_token, refresh_token)) => { let data = RefreshResult { access_token, refresh_token, }; let response = ApiResponse::success(data); log_info(&request_id, "刷新成功", json!({"access_token": "***"})); Ok(Json(response)) } Err(e) => { log_info(&request_id, "刷新失败", e.to_string()); Err(ErrorResponse::new(e.to_string())) } } } /// 删除账号 pub async fn delete_account( Extension(request_id): Extension, State(state): State, UserId(user_id): UserId, Json(payload): Json, ) -> Result>, ErrorResponse> { log_info(&request_id, "删除账号请求", format!("user_id={}", user_id)); let user_repo = UserRepository::new(state.pool.clone()); let service = AuthService::new( user_repo, state.redis_client.clone(), state.config.auth.clone(), ); let delete_request = DeleteUserRequest { user_id: user_id.clone(), password: payload.password, }; match service.delete_user(delete_request).await { Ok(_) => { log_info(&request_id, "账号删除成功", format!("user_id={}", user_id)); let response = ApiResponse::success_with_message((), "账号删除成功"); Ok(Json(response)) } Err(e) => { log_info(&request_id, "账号删除失败", e.to_string()); Err(ErrorResponse::new(e.to_string())) } } } /// 刷新令牌 pub async fn delete_refresh_token( Extension(request_id): Extension, State(state): State, UserId(user_id): UserId, ) -> Result>, ErrorResponse> { log_info( &request_id, "删除刷新令牌请求", format!("user_id={}", user_id), ); let user_repo = UserRepository::new(state.pool.clone()); let service = AuthService::new( user_repo, state.redis_client.clone(), state.config.auth.clone(), ); match service.delete_refresh_token(&user_id).await { Ok(_) => { log_info( &request_id, "刷新令牌删除成功", format!("user_id={}", user_id), ); let response = ApiResponse::success_with_message((), "刷新令牌删除成功"); Ok(Json(response)) } Err(e) => { log_info(&request_id, "刷新令牌删除失败", e.to_string()); Err(ErrorResponse::new(e.to_string())) } } }