Commit
This commit is contained in:
243
old/EMERGENCY_FIX_2025-11-09.md
Normal file
243
old/EMERGENCY_FIX_2025-11-09.md
Normal file
@@ -0,0 +1,243 @@
|
||||
# Emergency Fix: Telegram ID References Removed
|
||||
|
||||
**Date:** 2025-11-09
|
||||
**Status:** ✅ FIXED
|
||||
**Severity:** CRITICAL (Production login broken)
|
||||
|
||||
---
|
||||
|
||||
## Problem
|
||||
|
||||
After migrating database to remove `telegram_id` column, login was completely broken:
|
||||
- SQL queries still referenced `telegram_id` column
|
||||
- Column physically dropped but code not updated
|
||||
- Users unable to login/register
|
||||
|
||||
**Error:** `column "telegram_id" does not exist`
|
||||
|
||||
---
|
||||
|
||||
## Root Cause
|
||||
|
||||
Database migration script (`migrate_steam_support.py`) successfully:
|
||||
- ✅ Added new columns (steam_id, email, premium_expires_at, account_type)
|
||||
- ✅ Dropped telegram_id column
|
||||
|
||||
But code was not updated:
|
||||
- ❌ `database.py` still defined telegram_id in schema
|
||||
- ❌ Functions still queried telegram_id
|
||||
- ❌ API endpoints still returned telegram_id
|
||||
|
||||
---
|
||||
|
||||
## Files Changed
|
||||
|
||||
### 1. `/api/database.py`
|
||||
|
||||
**Removed:**
|
||||
- Line 41: `Column("telegram_id", Integer, unique=True, nullable=True)` from table definition
|
||||
- Lines 315-320: `get_player_by_telegram_id()` function (deleted entirely)
|
||||
- Line 338: `telegram_id` parameter from `create_player()` function
|
||||
|
||||
**Before:**
|
||||
```python
|
||||
players = Table(
|
||||
"players",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, autoincrement=True),
|
||||
Column("telegram_id", Integer, unique=True, nullable=True), # ❌ REMOVED
|
||||
Column("username", String(50), unique=True, nullable=True),
|
||||
...
|
||||
)
|
||||
|
||||
async def get_player_by_telegram_id(telegram_id: int): # ❌ REMOVED
|
||||
async with DatabaseSession() as session:
|
||||
result = await session.execute(
|
||||
select(players).where(players.c.telegram_id == telegram_id)
|
||||
)
|
||||
...
|
||||
|
||||
async def create_player(
|
||||
username: Optional[str] = None,
|
||||
password_hash: Optional[str] = None,
|
||||
telegram_id: Optional[int] = None, # ❌ REMOVED
|
||||
name: str = "Survivor"
|
||||
):
|
||||
...
|
||||
```
|
||||
|
||||
**After:**
|
||||
```python
|
||||
players = Table(
|
||||
"players",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, autoincrement=True),
|
||||
Column("username", String(50), unique=True, nullable=True), # ✅ Clean
|
||||
...
|
||||
)
|
||||
|
||||
# get_player_by_telegram_id() deleted ✅
|
||||
|
||||
async def create_player(
|
||||
username: Optional[str] = None,
|
||||
password_hash: Optional[str] = None,
|
||||
name: str = "Survivor" # ✅ No telegram_id
|
||||
):
|
||||
...
|
||||
```
|
||||
|
||||
### 2. `/api/main.py`
|
||||
|
||||
**Removed:**
|
||||
- Line 426: `telegram_id` from `get_me()` response
|
||||
- Lines 4123-4127: `/api/internal/player/{telegram_id}` endpoint (deleted)
|
||||
- Lines 4188-4192: `create_telegram_player()` function (deleted)
|
||||
|
||||
**Before:**
|
||||
```python
|
||||
@app.get("/api/auth/me")
|
||||
async def get_me(current_user: dict = Depends(get_current_user)):
|
||||
return {
|
||||
"id": current_user["id"],
|
||||
"username": current_user.get("username"),
|
||||
"telegram_id": current_user.get("telegram_id"), # ❌ REMOVED
|
||||
...
|
||||
}
|
||||
|
||||
@app.get("/api/internal/player/{telegram_id}") # ❌ REMOVED
|
||||
async def get_player_by_telegram(telegram_id: int):
|
||||
player = await db.get_player_by_telegram_id(telegram_id)
|
||||
...
|
||||
|
||||
@app.post("/api/internal/player") # ❌ REMOVED
|
||||
async def create_telegram_player(telegram_id: int, name: str = "Survivor"):
|
||||
player = await db.create_player(telegram_id=telegram_id, name=name)
|
||||
...
|
||||
```
|
||||
|
||||
**After:**
|
||||
```python
|
||||
@app.get("/api/auth/me")
|
||||
async def get_me(current_user: dict = Depends(get_current_user)):
|
||||
return {
|
||||
"id": current_user["id"],
|
||||
"username": current_user.get("username"), # ✅ No telegram_id
|
||||
...
|
||||
}
|
||||
|
||||
# Telegram endpoints deleted ✅
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Deployment Steps
|
||||
|
||||
1. **Code Changes:**
|
||||
```bash
|
||||
# Edited api/database.py
|
||||
# Edited api/main.py
|
||||
```
|
||||
|
||||
2. **Container Rebuild:**
|
||||
```bash
|
||||
docker compose up -d --build echoes_of_the_ashes_api
|
||||
```
|
||||
|
||||
3. **Verification:**
|
||||
```bash
|
||||
docker logs echoes_of_the_ashes_api --tail 30
|
||||
```
|
||||
|
||||
Result: ✅ Login working
|
||||
```
|
||||
192.168.32.2 - "POST /api/auth/login HTTP/1.1" 200
|
||||
192.168.32.2 - "GET /api/auth/me HTTP/1.1" 200
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Testing Checklist
|
||||
|
||||
- [x] Login with existing user works
|
||||
- [x] Register new user works
|
||||
- [x] `/api/auth/me` returns user data (without telegram_id)
|
||||
- [x] Game loads after login
|
||||
- [x] WebSocket connection established
|
||||
- [x] No SQL errors in logs
|
||||
|
||||
---
|
||||
|
||||
## Impact Analysis
|
||||
|
||||
### ✅ Fixed
|
||||
- Login functionality restored
|
||||
- User registration working
|
||||
- User profile endpoint clean
|
||||
- No more SQL column errors
|
||||
|
||||
### ⚠️ Breaking Changes
|
||||
- **Removed endpoints** (no longer needed):
|
||||
- `GET /api/internal/player/{telegram_id}`
|
||||
- `POST /api/internal/player` (create_telegram_player)
|
||||
|
||||
- **Removed function:**
|
||||
- `get_player_by_telegram_id()` in database.py
|
||||
|
||||
### 🔄 Still TODO (Future Work)
|
||||
- Complete account/player separation (see ACCOUNT_PLAYER_SEPARATION_PLAN.md)
|
||||
- Multi-character support
|
||||
- Email-based authentication
|
||||
- Steam integration
|
||||
- Tauri desktop build
|
||||
|
||||
---
|
||||
|
||||
## Prevention Measures
|
||||
|
||||
**Lesson Learned:** When dropping database columns, must also:
|
||||
1. Update SQLAlchemy table definitions
|
||||
2. Remove/update all functions that query the column
|
||||
3. Remove/update all API endpoints that return the column
|
||||
4. Remove parameters from functions that accept the column
|
||||
5. Test thoroughly before deployment
|
||||
|
||||
**Better Process:**
|
||||
1. Create migration script
|
||||
2. Search codebase for all references: `grep -r "column_name"`
|
||||
3. Update all code references
|
||||
4. Run migration
|
||||
5. Rebuild containers
|
||||
6. Test
|
||||
|
||||
---
|
||||
|
||||
## Related Documents
|
||||
|
||||
- `STEAM_AND_PREMIUM_PLAN.md` - Full Steam/premium implementation plan
|
||||
- `ACCOUNT_PLAYER_SEPARATION_PLAN.md` - Major refactor plan (accounts + characters)
|
||||
- `migrate_steam_support.py` - Original migration that dropped telegram_id
|
||||
- `CHANGELOG_STEAM_ICONS_2025-11-09.md` - Previous session changes
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
**IMMEDIATE (This is done ✅):**
|
||||
- [x] Remove telegram_id references
|
||||
- [x] Test login
|
||||
- [x] Deploy fix
|
||||
|
||||
**SHORT TERM (Next sprint):**
|
||||
- [ ] Implement email field usage in registration
|
||||
- [ ] Add email validation
|
||||
- [ ] Start account/player separation
|
||||
|
||||
**LONG TERM:**
|
||||
- [ ] Multi-character system
|
||||
- [ ] Steam authentication
|
||||
- [ ] Tauri desktop app
|
||||
- [ ] Avatar creator
|
||||
|
||||
---
|
||||
|
||||
**Status:** Production is stable. Login working. Emergency resolved. ✅
|
||||
Reference in New Issue
Block a user