Files
filwordspl-backend/routers/users.py
T
2026-09-20 11:45:58 +00:00

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,
}