from fastapi import APIRouter, Request, HTTPException from auth import require_auth from database import get_pool from config import SUPPORTED_LANGUAGES, ADMIN_IDS router = APIRouter(prefix="/users", tags=["users"]) SUPPORTED_LEVELS = {"A1", "A2", "B1", "B2", "C1", "C2"} @router.post("/register") async def register_user(request: Request): user_id, username = await require_auth(request) pool = await get_pool() async with pool.acquire() as conn: # Проверяем существует ли пользователь existing = await conn.fetchrow( "SELECT id, app_language, current_level FROM users WHERE telegram_id = $1", user_id ) if existing: return { "status": "ok", "app_language": existing["app_language"], "current_level": existing["current_level"] or "A1", "user_id": existing["id"], "is_admin": user_id in ADMIN_IDS, } # Создаем нового пользователя row = await conn.fetchrow( """INSERT INTO users (telegram_id, username, current_level) VALUES ($1, $2, 'A1') RETURNING id, app_language, current_level""", user_id, username or f"id{user_id}", ) return { "status": "ok", "app_language": row["app_language"], "current_level": row["current_level"], "user_id": row["id"], "is_admin": user_id in ADMIN_IDS, } @router.get("/me/is-admin") async def check_is_admin(request: Request): """Проверяет, является ли текущий пользователь администратором.""" user_id, _ = await require_auth(request) return {"is_admin": user_id in ADMIN_IDS} @router.post("/set-language") async def set_language(request: Request): user_id, _ = await require_auth(request) body = await request.json() lang = body.get("language", "pl") if lang not in SUPPORTED_LANGUAGES: raise HTTPException(400, "Unsupported language") pool = await get_pool() async with pool.acquire() as conn: await conn.execute( "UPDATE users SET app_language = $1 WHERE telegram_id = $2", lang, user_id, ) # 🔧 ИСПРАВЛЕНО: вызов достижений ВНЕ блока async with pool.acquire() from routers.achievements import check_and_award_achievements new_achievements = await check_and_award_achievements(user_id, "language_changed", 1) return { "status": "ok", "app_language": lang, "new_achievements": new_achievements } @router.post("/set-level") async def set_level(request: Request): """Устанавливает текущий уровень пользователя (A1, A2, B1, B2, C1, C2)""" user_id, _ = await require_auth(request) body = await request.json() level = body.get("level", "A1") if level not in SUPPORTED_LEVELS: raise HTTPException(400, "Unsupported level") pool = await get_pool() async with pool.acquire() as conn: # Проверяем, что пользователь существует user_exists = await conn.fetchval( "SELECT 1 FROM users WHERE telegram_id = $1", user_id ) if not user_exists: raise HTTPException(401, "User not registered") await conn.execute( "UPDATE users SET current_level = $1 WHERE telegram_id = $2", level, user_id, ) return { "status": "ok", "level": level, }