Improve error handling for Echo backend error format
- Update ErrorResponse model to make detail and statusCode optional since
backend now returns simple {"error": "message"} format
- Update AuthApi to parse actual backend error messages instead of generic
"Registration failed"/"Login failed" strings
- Update ErrorParser to prioritize the "error" field and add fallback for
simple error map responses
- Update iOS ViewModels (Login, Register, AppleSignIn) to properly handle
400 and 409 status codes by displaying backend error messages
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -125,12 +125,16 @@ class AppleSignInViewModel: ObservableObject {
|
||||
|
||||
if let code = error.code?.intValue {
|
||||
switch code {
|
||||
case 400:
|
||||
errorMessage = "Invalid Apple Sign In token"
|
||||
case 401:
|
||||
errorMessage = "Authentication failed. Please try again."
|
||||
case 403:
|
||||
errorMessage = "Access denied"
|
||||
case 409:
|
||||
// Conflict - let backend message explain the issue
|
||||
errorMessage = ErrorMessageParser.parse(error.message)
|
||||
case 400:
|
||||
// Bad request - validation errors from backend
|
||||
errorMessage = ErrorMessageParser.parse(error.message)
|
||||
case 500...599:
|
||||
errorMessage = "Server error. Please try again later."
|
||||
default:
|
||||
|
||||
@@ -106,12 +106,18 @@ class LoginViewModel: ObservableObject {
|
||||
// Check for specific error codes and provide user-friendly messages
|
||||
if let code = error.code?.intValue {
|
||||
switch code {
|
||||
case 400, 401:
|
||||
case 401:
|
||||
self.errorMessage = "Invalid username or password"
|
||||
case 403:
|
||||
self.errorMessage = "Access denied. Please check your credentials."
|
||||
case 404:
|
||||
self.errorMessage = "Service not found. Please try again later."
|
||||
case 409:
|
||||
// Conflict - let backend message explain the issue
|
||||
self.errorMessage = ErrorMessageParser.parse(error.message)
|
||||
case 400:
|
||||
// Bad request - validation errors from backend
|
||||
self.errorMessage = ErrorMessageParser.parse(error.message)
|
||||
case 500...599:
|
||||
self.errorMessage = "Server error. Please try again later."
|
||||
default:
|
||||
|
||||
@@ -72,7 +72,24 @@ class RegisterViewModel: ObservableObject {
|
||||
self.isRegistered = true
|
||||
self.isLoading = false
|
||||
} else if let error = result as? ApiResultError {
|
||||
self.errorMessage = ErrorMessageParser.parse(error.message)
|
||||
// Handle specific HTTP status codes
|
||||
if let code = error.code?.intValue {
|
||||
switch code {
|
||||
case 409:
|
||||
// Conflict - duplicate username or email
|
||||
// The backend error message already contains the specific conflict
|
||||
self.errorMessage = ErrorMessageParser.parse(error.message)
|
||||
case 400:
|
||||
// Bad request - validation errors
|
||||
self.errorMessage = ErrorMessageParser.parse(error.message)
|
||||
case 500...599:
|
||||
self.errorMessage = "Server error. Please try again later."
|
||||
default:
|
||||
self.errorMessage = ErrorMessageParser.parse(error.message)
|
||||
}
|
||||
} else {
|
||||
self.errorMessage = ErrorMessageParser.parse(error.message)
|
||||
}
|
||||
self.isLoading = false
|
||||
}
|
||||
} catch {
|
||||
|
||||
Reference in New Issue
Block a user