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>
16 lines
557 B
SQL
16 lines
557 B
SQL
-- Deduplicate users with the same name (case-insensitive) per event,
|
|
-- keeping the oldest account so no real data is lost.
|
|
DELETE FROM "user"
|
|
WHERE id NOT IN (
|
|
SELECT DISTINCT ON (event_id, LOWER(display_name)) id
|
|
FROM "user"
|
|
ORDER BY event_id, LOWER(display_name), created_at ASC
|
|
);
|
|
|
|
-- Drop the old non-unique index (replaced below)
|
|
DROP INDEX IF EXISTS idx_user_event_name;
|
|
|
|
-- Unique index enforces one account per name per event (case-insensitive)
|
|
CREATE UNIQUE INDEX idx_user_event_name_ci
|
|
ON "user" (event_id, LOWER(display_name));
|