6.0 KiB
6.0 KiB
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_idcolumn - 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.pystill 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_idparameter fromcreate_player()function
Before:
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:
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_idfromget_me()response - Lines 4123-4127:
/api/internal/player/{telegram_id}endpoint (deleted) - Lines 4188-4192:
create_telegram_player()function (deleted)
Before:
@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:
@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
-
Code Changes:
# Edited api/database.py # Edited api/main.py -
Container Rebuild:
docker compose up -d --build echoes_of_the_ashes_api -
Verification:
docker logs echoes_of_the_ashes_api --tail 30Result: ✅ 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
- Login with existing user works
- Register new user works
/api/auth/mereturns user data (without telegram_id)- Game loads after login
- WebSocket connection established
- 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:
- Update SQLAlchemy table definitions
- Remove/update all functions that query the column
- Remove/update all API endpoints that return the column
- Remove parameters from functions that accept the column
- Test thoroughly before deployment
Better Process:
- Create migration script
- Search codebase for all references:
grep -r "column_name" - Update all code references
- Run migration
- Rebuild containers
- Test
Related Documents
STEAM_AND_PREMIUM_PLAN.md- Full Steam/premium implementation planACCOUNT_PLAYER_SEPARATION_PLAN.md- Major refactor plan (accounts + characters)migrate_steam_support.py- Original migration that dropped telegram_idCHANGELOG_STEAM_ICONS_2025-11-09.md- Previous session changes
Next Steps
IMMEDIATE (This is done ✅):
- Remove telegram_id references
- Test login
- 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. ✅