Creates migration 0011 to:
- Create room_game_configs table with proper schema
- Add unique index on (room_id, game_name)
- Migrate existing game_config data from arcade_rooms table
Migration is idempotent and safe to run on any database state:
- Uses IF NOT EXISTS for table and index creation
- Uses INSERT OR IGNORE to avoid duplicate data
- Will work on both fresh databases and existing production
This ensures production will automatically get the new table structure
when the migration runs on deployment.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Manual migration applied on 2025-10-15:
- Created room_game_configs table via sqlite3 CLI
- Migrated 6000 existing configs from arcade_rooms.game_config
- 5991 matching configs + 9 memory-quiz configs
- Table created directly instead of through drizzle migration system
The manually created drizzle migration SQL file has been removed since
the migration was applied directly to the database. See
.claude/MANUAL_MIGRATION_0011.md for complete details on the migration
process, verification steps, and rollback plan.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
### Schema Changes
- Create `room_game_configs` table with one row per game per room
- Migrate existing gameConfig data from arcade_rooms.game_config JSON column
- Add unique index on (roomId, gameName) for efficient queries
### Benefits
- ✅ Type-safe config access with shared types
- ✅ Smaller rows (only configs for used games)
- ✅ Easier updates (single row vs entire JSON blob)
- ✅ Better concurrency (no lock contention between games)
- ✅ Foundation for per-game audit trail
### Core Changes
1. **Shared Config Types** (`game-configs.ts`)
- `MatchingGameConfig`, `MemoryQuizGameConfig` interfaces
- Default configs for each game
- Single source of truth for all settings
2. **Helper Functions** (`game-config-helpers.ts`)
- `getGameConfig<T>()` - type-safe config retrieval with defaults
- `setGameConfig()` - upsert game config
- `getAllGameConfigs()` - aggregate all game configs for a room
- `validateGameConfig()` - runtime validation
3. **API Routes**
- `/api/arcade/rooms/current`: Aggregates configs from new table
- `/api/arcade/rooms/[roomId]/settings`: Writes to new table
4. **Socket Server** (`socket-server.ts`)
- Uses `getGameConfig()` helper for session creation
- Eliminates manual config extraction and defaults
5. **Validators**
- `MemoryQuizGameValidator.getInitialState(config: MemoryQuizGameConfig)`
- `MatchingGameValidator.getInitialState(config: MatchingGameConfig)`
- Type signatures enforce consistency
### Migration Path
- Existing data migrated automatically (SQL in migration file)
- Old `gameConfig` column preserved temporarily
- Client-side providers unchanged (read from aggregated response)
Next steps:
- Test settings persistence thoroughly
- Drop old `gameConfig` column after validation
- Update documentation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>