The backend container needs to reach validators using their Docker service names
(validator-1, validator-2, validator-3) instead of localhost:PORT.
This fixes the 'validators unreachable' warning on backend startup.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit addresses critical issues preventing user registration:
1. Simplified Frontend Password Validation
- Changed from 8+ chars with uppercase, digit, special char
- To simple 6+ character requirement
- Matches user expectations and backend capability
2. Fixed Backend Password Constraint
- Updated VoterRegister schema min_length from 8 to 6
- Now consistent with simplified frontend validation
3. Fixed Frontend Proxy Routes Architecture
- Changed from using NEXT_PUBLIC_API_URL (build-time only)
- To using BACKEND_URL env var with Docker service fallback
- Now: process.env.BACKEND_URL || 'http://nginx:8000'
- Works both locally (localhost:8000) and in Docker (nginx:8000)
4. Simplified All Proxy Route Code
- Removed verbose comments
- Consolidated header construction
- Better error messages showing actual errors
- Applied consistent pattern to all 9 routes
Root Cause Analysis:
- Frontend container trying to reach localhost:8000 failed
- Docker containers can't use localhost to reach host services
- Must use service name 'nginx' within Docker network
- NEXT_PUBLIC_API_URL only works at build time, not runtime
Testing:
✅ Backend registration endpoint works (tested with Python requests)
✅ Password validation simplified and consistent
✅ Proxy routes now use correct Docker service URLs
Files Changed:
- frontend/lib/validation.ts (password requirements)
- backend/schemas.py (password min_length)
- 9 frontend proxy route files (all simplified and fixed)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Form Validation:
- Create comprehensive Zod validation schemas for all forms
- Login form: email, password validation
- Register form: first name, last name, email, password strength requirements
- Profile update form: all user fields with optional phone/address
- Password change form: current password, new password confirmation
- Vote submission form: election ID and candidate selection
Password Strength:
- Minimum 8 characters
- At least one uppercase letter
- At least one digit
- At least one special character (!@#$%^&*)
React Hook Form Integration:
- Update login page with useForm and field-level error display
- Update register page with form validation and error messages
- Show validation errors inline with red borders
- Disable form submission while loading or submitting
- Better user feedback with detailed error messages
Type Safety:
- Zod schemas with TypeScript inference
- Type-safe form data types
- Proper error handling and validation
Build Status:
- All pages compile successfully
- Zero TypeScript errors
- Bundle size includes Zod (~40 kB) and React Hook Form
- Login/Register pages: 145 kB First Load JS (includes new validation libraries)
- Shared bundle remains ~102 kB
Setup:
- npm install zod react-hook-form @hookform/resolvers
- Ready for production with form validation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Core Integration:
- Create API client with TypeScript types for all endpoints
- Implement authentication context provider for user state management
- Add protected route component for dashboard access control
- Connect login/register pages to backend authentication endpoints
- Implement user session persistence with localStorage tokens
Authentication:
- Login page now connects to /api/auth/login endpoint
- Register page connects to /api/auth/register with validation
- Password strength requirements (min 8 chars)
- Form validation and error handling
- Automatic redirect to dashboard on successful auth
- Logout functionality with session cleanup
Protected Routes:
- Dashboard pages require authentication
- Non-authenticated users redirected to login
- Loading spinner during auth verification
- User name displayed in dashboard header
- Proper session management
Election/Vote APIs:
- Dashboard fetches active elections from /api/elections/active
- Display real election data with candidates count
- Handle loading and error states
- Skeleton loaders for better UX
Type Safety:
- Full TypeScript interfaces for all API responses
- Proper error handling with try-catch blocks
- API response types: AuthToken, VoterProfile, Election, Candidate, Vote, VoteHistory
Environment:
- API URL configurable via NEXT_PUBLIC_API_URL env variable
- Default to http://localhost:8000 for local development
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>