feat: 完善生产级 Rust Web 模板

This commit is contained in:
2026-07-21 16:00:03 +08:00
parent fb30d5da1a
commit ce89569bf3
58 changed files with 2042 additions and 349 deletions
+58 -29
View File
@@ -1,8 +1,9 @@
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::domain::dto::auth::{RegisterRequest, LoginRequest, RefreshRequest, DeleteUserRequest};
use crate::domain::vo::auth::{RegisterResult, LoginResult, RefreshResult};
use crate::domain::vo::ApiResponse;
use crate::infra::middleware::UserId;
use crate::repositories::user_repository::UserRepository;
use crate::services::auth_service::AuthService;
use crate::AppState;
@@ -11,6 +12,7 @@ use axum::{
Json,
};
use serde_json::json;
use validator::Validate;
/// 注册
pub async fn register(
@@ -18,10 +20,17 @@ pub async fn register(
State(state): State<AppState>,
Json(payload): Json<RegisterRequest>,
) -> Result<Json<ApiResponse<RegisterResult>>, 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());
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)) => {
@@ -31,7 +40,7 @@ pub async fn register(
Ok(Json(response))
}
Err(e) => {
log_info(&request_id, "注册失败", &e.to_string());
log_info(&request_id, "注册失败", e.to_string());
Err(ErrorResponse::new(e.to_string()))
}
}
@@ -43,10 +52,17 @@ pub async fn login(
State(state): State<AppState>,
Json(payload): Json<LoginRequest>,
) -> Result<Json<ApiResponse<LoginResult>>, 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());
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)) => {
@@ -56,7 +72,7 @@ pub async fn login(
Ok(Json(response))
}
Err(e) => {
log_info(&request_id, "登录失败", &e.to_string());
log_info(&request_id, "登录失败", e.to_string());
Err(ErrorResponse::new(e.to_string()))
}
}
@@ -71,16 +87,17 @@ pub async fn refresh(
log_info(
&request_id,
"刷新 token 请求",
&json!({"device_id": "default"}),
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());
let service = AuthService::new(
user_repo,
state.redis_client.clone(),
state.config.auth.clone(),
);
match service
.refresh_access_token(&payload.refresh_token)
.await
{
match service.refresh_access_token(&payload.refresh_token).await {
Ok((access_token, refresh_token)) => {
let data = RefreshResult {
access_token,
@@ -88,15 +105,11 @@ pub async fn refresh(
};
let response = ApiResponse::success(data);
log_info(
&request_id,
"刷新成功",
&json!({"access_token": "***"}),
);
log_info(&request_id, "刷新成功", json!({"access_token": "***"}));
Ok(Json(response))
}
Err(e) => {
log_info(&request_id, "刷新失败", &e.to_string());
log_info(&request_id, "刷新失败", e.to_string());
Err(ErrorResponse::new(e.to_string()))
}
}
@@ -106,13 +119,17 @@ pub async fn refresh(
pub async fn delete_account(
Extension(request_id): Extension<RequestId>,
State(state): State<AppState>,
Extension(user_id): Extension<String>,
UserId(user_id): UserId,
Json(payload): Json<DeleteUserRequest>,
) -> Result<Json<ApiResponse<()>>, ErrorResponse> {
log_info(&request_id, "删除账号请求", &format!("user_id={}", user_id));
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 service = AuthService::new(
user_repo,
state.redis_client.clone(),
state.config.auth.clone(),
);
let delete_request = DeleteUserRequest {
user_id: user_id.clone(),
@@ -121,12 +138,12 @@ pub async fn delete_account(
match service.delete_user(delete_request).await {
Ok(_) => {
log_info(&request_id, "账号删除成功", &format!("user_id={}", user_id));
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());
log_info(&request_id, "账号删除失败", e.to_string());
Err(ErrorResponse::new(e.to_string()))
}
}
@@ -136,21 +153,33 @@ pub async fn delete_account(
pub async fn delete_refresh_token(
Extension(request_id): Extension<RequestId>,
State(state): State<AppState>,
Extension(user_id): Extension<String>,
UserId(user_id): UserId,
) -> Result<Json<ApiResponse<()>>, ErrorResponse> {
log_info(&request_id, "删除刷新令牌请求", &format!("user_id={}", user_id));
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 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));
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());
log_info(&request_id, "刷新令牌删除失败", e.to_string());
Err(ErrorResponse::new(e.to_string()))
}
}