Backend:
- Migration 007 deduplicates existing users by name (case-insensitive,
keeping oldest) and adds a unique index on (event_id, LOWER(display_name))
- find_by_event_and_name is now case-insensitive (LOWER comparison)
- join endpoint checks name availability before creating; returns 409
Conflict with code "conflict" when the name is taken
Frontend (join page):
- On 409, switches to a name-taken view showing an amber warning with
name-choice tips, a PIN input that runs the recover flow inline, and
an "Anderen Namen wählen" button that returns to the name input
Test guide: added Steps 8 (rate-limit auto-retry) and 9 (name uniqueness)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Disable Axum's 2 MB default body limit on the upload route so large
photos/videos are accepted without HTTP 400
- Serialize UserRole as lowercase in JWT so the frontend role checks
('guest'/'host'/'admin') match correctly
- Drain multipart body before returning early upload errors (rate-limit,
ban, event-lock) to keep the HTTP keep-alive connection clean and
prevent cascading Netzwerkfehler / empty-500 responses
- Add TraceLayer for request logging and Vite dev proxy config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>