106 lines
3.7 KiB
Python
106 lines
3.7 KiB
Python
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,
|
|
} |