Files
echoes-of-the-ash/PLAYERS_TAB_SCHEMA_FIX.md
2025-11-27 16:27:01 +01:00

147 lines
5.5 KiB
Markdown

# 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/<int:telegram_id>``/api/editor/player/<int:character_id>`
- `/api/editor/account/<int:telegram_id>``/api/editor/account/<int:account_id>`
- ✅ 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/<character_id>` - Get character details + inventory
3. `POST /api/editor/player/<character_id>` - Update character stats
4. `POST /api/editor/player/<character_id>/inventory` - Update inventory
5. `POST /api/editor/player/<character_id>/equipment` - Update equipment
6. `DELETE /api/editor/account/<account_id>/delete` - Delete account
7. `POST /api/editor/player/<character_id>/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)