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:
Trey t
2025-12-16 14:01:33 -06:00
parent 2517435551
commit 96ea1f4686
6 changed files with 70 additions and 13 deletions

View File

@@ -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:

View File

@@ -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:

View File

@@ -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 {