# Database Schema Migration - Players Tab Fix ## Summary Fixed all database queries in the web-map editor to use the correct `accounts` + `characters` schema instead of the deprecated `players` table. ## Schema Changes ### Old Schema (Deprecated) - `players` table with `telegram_id` as primary key - Columns: `intelligence`, `weight_capacity`, `volume_capacity` - `accounts` table with `is_banned`, `ban_reason`, `premium_until` ### New Schema (Current) - `accounts` table: `id`, `email`, `premium_expires_at`, `created_at` - `characters` table: `id`, `account_id` (FK), `name`, `level`, `xp`, `hp`, `stamina`, `strength`, `agility`, `endurance`, `intellect`, `unspent_points`, `location_id`, `is_dead` - `inventory` table: `character_id` (FK), `item_id`, `quantity`, `is_equipped`, `unique_item_id` (FK to unique_items) - `unique_items` table: `id`, `item_id`, `durability`, `max_durability`, `tier`, `unique_stats` ## Files Modified ### 1. `/opt/dockers/echoes_of_the_ashes/web-map/server.py` **Changes:** - ✅ Changed import from `bot.database` to `api.database` - ✅ Updated all SQL queries to use `characters` and `accounts` tables - ✅ Changed column names: - `telegram_id` → `id` (character ID) - `intelligence` → `intellect` - `premium_until` → `premium_expires_at` - `character_name` → `name` - ✅ Updated API endpoints: - `/api/editor/player/` → `/api/editor/player/` - `/api/editor/account/` → `/api/editor/account/` - ✅ Fixed inventory queries to use `character_id` and join with `unique_items` table - ✅ Updated player count query for live stats (line 1080) - ✅ Fixed delete account to use CASCADE (accounts → characters → inventory) - ✅ Updated reset player to use correct default values **Endpoints Fixed:** 1. `GET /api/editor/players` - List all characters with account info 2. `GET /api/editor/player/` - Get character details + inventory 3. `POST /api/editor/player/` - Update character stats 4. `POST /api/editor/player//inventory` - Update inventory 5. `POST /api/editor/player//equipment` - Update equipment 6. `DELETE /api/editor/account//delete` - Delete account 7. `POST /api/editor/player//reset` - Reset character ### 2. `/opt/dockers/echoes_of_the_ashes/web-map/editor_enhanced.js` **Changes:** - ✅ Updated `renderPlayerList()` to use `player.id` instead of `player.telegram_id` - ✅ Changed dataset attribute: `dataset.telegramId` → `dataset.characterId` - ✅ Updated `selectPlayer()` function parameter and API call - ✅ Fixed player editor display to show: - Character ID instead of Telegram ID - Account email - Correct timestamp handling (character_created_at * 1000) - ✅ Updated action buttons to use correct IDs: - Ban/Unban: uses `account_id` - Reset: uses character `id` - Delete: uses `account_id` - ✅ Fixed `deletePlayer()` to find player by `account_id` - ✅ Updated status badge logic to use `is_premium` boolean ## Testing Checklist ### Backend Tests - [ ] Start containers: `docker compose up -d` - [ ] Check logs: `docker logs echoes_of_the_ashes_map` - [ ] Test API endpoints: ```bash # Login first curl -X POST http://localhost:8080/api/login \ -H "Content-Type: application/json" \ -d '{"password":"admin123"}' \ -c cookies.txt # Get players list curl http://localhost:8080/api/editor/players -b cookies.txt # Get specific player (replace 1 with actual character ID) curl http://localhost:8080/api/editor/player/1 -b cookies.txt ``` ### Frontend Tests 1. Navigate to `http://localhost:8080/editor` 2. Login with password (default: `admin123`) 3. Click "👥 Players" tab 4. Verify: - [ ] Player list loads correctly - [ ] Search by name works - [ ] Filter by status (All/Active/Banned/Premium) works - [ ] Clicking a player loads their details - [ ] Character stats display correctly - [ ] Inventory shows (read-only) - [ ] Equipment shows (read-only) - [ ] Account info displays (email, premium status) 5. Test actions: - [ ] Edit character stats and save - [ ] Reset player (confirm it clears inventory) - [ ] Delete account (confirm double-confirmation) ## Known Limitations 1. **Ban functionality**: Accounts table doesn't have `is_banned` or `ban_reason` columns in new schema - Ban/Unban buttons will return "not implemented" message - Need to add these columns to accounts table if ban feature is needed 2. **Inventory editing**: Currently read-only display - Full CRUD for inventory would require more complex UI - Unique items support needs proper unique_items table integration 3. **Equipment slots**: New schema uses `is_equipped` flag in inventory - No separate `equipped_items` table - Equipment is just inventory items with `is_equipped=true` ## Rebuild Instructions ```bash # Rebuild map container with fixes docker compose build echoes_of_the_ashes_map # Restart container docker compose up -d echoes_of_the_ashes_map # Check logs docker logs -f echoes_of_the_ashes_map ``` ## Rollback Plan If issues occur: ```bash # Restore from container (files are already synced) ./sync_from_containers.sh # Or restore from git git checkout web-map/server.py web-map/editor_enhanced.js ``` ## Additional Notes - All changes are backward compatible with existing data - No database migrations needed (schema already exists) - Frontend gracefully handles missing data (email, premium status) - Timestamps are handled correctly (Unix timestamps in DB, converted to Date objects in JS)