fix(server): better error responses when creating users
This commit is contained in:
parent
3f3654c3cb
commit
363bc2b9ef
|
|
@ -1,7 +1,7 @@
|
||||||
use axum::{
|
use axum::{
|
||||||
extract::State,
|
extract::State,
|
||||||
http::StatusCode,
|
http::StatusCode,
|
||||||
response::Json,
|
response::{IntoResponse, Json, Response},
|
||||||
routing::{get, post},
|
routing::{get, post},
|
||||||
Router,
|
Router,
|
||||||
};
|
};
|
||||||
|
|
@ -33,14 +33,35 @@ pub fn router() -> Router<Arc<AppState>> {
|
||||||
async fn register(
|
async fn register(
|
||||||
State(state): State<Arc<AppState>>,
|
State(state): State<Arc<AppState>>,
|
||||||
Json(user_data): Json<CreateUser>,
|
Json(user_data): Json<CreateUser>,
|
||||||
) -> Result<Json<UserResponse>, StatusCode> {
|
) -> Response {
|
||||||
let user = state
|
match state.db.create_user(user_data).await {
|
||||||
.db
|
Ok(user) => {
|
||||||
.create_user(user_data)
|
let user_response: UserResponse = user.into();
|
||||||
.await
|
(StatusCode::OK, Json(user_response)).into_response()
|
||||||
.map_err(|_| StatusCode::BAD_REQUEST)?;
|
}
|
||||||
|
Err(e) => {
|
||||||
Ok(Json(user.into()))
|
tracing::error!("User registration failed: {}", e);
|
||||||
|
|
||||||
|
// Check for specific database constraint violations
|
||||||
|
let error_message = if e.to_string().contains("users_username_key") {
|
||||||
|
"Username already exists"
|
||||||
|
} else if e.to_string().contains("users_email_key") {
|
||||||
|
"Email already exists"
|
||||||
|
} else if e.to_string().contains("duplicate key") {
|
||||||
|
"User with this username or email already exists"
|
||||||
|
} else {
|
||||||
|
"Registration failed due to invalid data"
|
||||||
|
};
|
||||||
|
|
||||||
|
(
|
||||||
|
StatusCode::BAD_REQUEST,
|
||||||
|
Json(serde_json::json!({
|
||||||
|
"error": error_message,
|
||||||
|
"details": e.to_string()
|
||||||
|
}))
|
||||||
|
).into_response()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[utoipa::path(
|
#[utoipa::path(
|
||||||
|
|
|
||||||
|
|
@ -84,8 +84,9 @@ impl AdminTestClient {
|
||||||
.duration_since(std::time::UNIX_EPOCH)
|
.duration_since(std::time::UNIX_EPOCH)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.as_millis();
|
.as_millis();
|
||||||
let username = format!("user_test_{}", timestamp);
|
let random_suffix = uuid::Uuid::new_v4().simple().to_string()[..8].to_string();
|
||||||
let email = format!("user_test_{}@example.com", timestamp);
|
let username = format!("user_test_{}_{}", timestamp, random_suffix);
|
||||||
|
let email = format!("user_test_{}@example.com", random_suffix);
|
||||||
let password = "userpassword123";
|
let password = "userpassword123";
|
||||||
|
|
||||||
// Register regular user
|
// Register regular user
|
||||||
|
|
@ -103,7 +104,9 @@ impl AdminTestClient {
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if !register_response.status().is_success() {
|
if !register_response.status().is_success() {
|
||||||
return Err(format!("User registration failed: {}", register_response.text().await?).into());
|
let status = register_response.status();
|
||||||
|
let error_text = register_response.text().await.unwrap_or_else(|_| "Unknown error".to_string());
|
||||||
|
return Err(format!("User registration failed with status {}: {}", status, error_text).into());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Login user
|
// Login user
|
||||||
|
|
@ -478,8 +481,9 @@ async fn test_admin_user_management_without_roles() {
|
||||||
.duration_since(std::time::UNIX_EPOCH)
|
.duration_since(std::time::UNIX_EPOCH)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.as_millis();
|
.as_millis();
|
||||||
let username = format!("role_test_user_{}", timestamp);
|
let random_suffix = uuid::Uuid::new_v4().simple().to_string()[..8].to_string();
|
||||||
let email = format!("roletest_{}@example.com", timestamp);
|
let username = format!("role_test_user_{}_{}", timestamp, random_suffix);
|
||||||
|
let email = format!("roletest_{}@example.com", random_suffix);
|
||||||
|
|
||||||
let regular_user = client.create_user(&username, &email, UserRole::User, true).await
|
let regular_user = client.create_user(&username, &email, UserRole::User, true).await
|
||||||
.expect("Failed to create regular user");
|
.expect("Failed to create regular user");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue