initial commit (backend)
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
from fastapi import APIRouter, Request, HTTPException
|
||||
from auth import require_auth
|
||||
from database import get_pool
|
||||
|
||||
router = APIRouter(prefix="/hints", tags=["hints"])
|
||||
|
||||
@router.get("/first-letter/{level_id}")
|
||||
async def get_first_letter_hint(request: Request, level_id: int):
|
||||
"""Подсказка: показывает первую букву случайного ненайденного слова"""
|
||||
telegram_id, _ = await require_auth(request)
|
||||
|
||||
pool = await get_pool()
|
||||
async with pool.acquire() as conn:
|
||||
# Проверяем, что уровень существует
|
||||
level = await conn.fetchrow("SELECT * FROM levels WHERE id = $1", level_id)
|
||||
if not level:
|
||||
raise HTTPException(404, "Level not found")
|
||||
|
||||
# Проверяем, что пользователь существует
|
||||
user_exists = await conn.fetchval(
|
||||
"SELECT 1 FROM users WHERE telegram_id = $1", telegram_id
|
||||
)
|
||||
if not user_exists:
|
||||
raise HTTPException(401, "User not registered")
|
||||
|
||||
# Получаем прогресс пользователя по этому уровню
|
||||
progress = await conn.fetchrow(
|
||||
"SELECT hints_used FROM user_progress WHERE user_id = $1 AND level_id = $2",
|
||||
telegram_id, level_id
|
||||
)
|
||||
|
||||
hints_already_used = progress["hints_used"] if progress else 0
|
||||
|
||||
# Получаем все слова уровня
|
||||
words = await conn.fetch(
|
||||
"SELECT word_pl FROM level_words WHERE level_id = $1", level_id
|
||||
)
|
||||
|
||||
if not words:
|
||||
raise HTTPException(404, "No words found for this level")
|
||||
|
||||
word_paths = level["word_paths"]
|
||||
if isinstance(word_paths, str):
|
||||
import json
|
||||
word_paths = json.loads(word_paths)
|
||||
|
||||
# Находим первое слово, у которого есть путь
|
||||
all_level_words = [w["word_pl"] for w in words]
|
||||
|
||||
# Ищем слово с путём (сначала основные, потом filler-слова)
|
||||
found_word = None
|
||||
first_cell = None
|
||||
|
||||
for word in all_level_words:
|
||||
if word in word_paths and word_paths[word]:
|
||||
found_word = word
|
||||
first_cell = word_paths[word][0]
|
||||
break
|
||||
|
||||
if not found_word:
|
||||
# Если пути не нашлись — берём любое слово
|
||||
found_word = all_level_words[0]
|
||||
first_cell = [0, 0]
|
||||
|
||||
return {
|
||||
"status": "ok",
|
||||
"word": found_word,
|
||||
"first_cell": first_cell,
|
||||
"hints_used_total": hints_already_used,
|
||||
}
|
||||
|
||||
@router.get("/word-list/{level_id}")
|
||||
async def get_word_list(request: Request, level_id: int):
|
||||
"""Подсказка: показывает список всех слов уровня с переводами"""
|
||||
telegram_id, _ = await require_auth(request)
|
||||
|
||||
pool = await get_pool()
|
||||
async with pool.acquire() as conn:
|
||||
# Проверяем, что уровень существует
|
||||
level = await conn.fetchrow("SELECT id FROM levels WHERE id = $1", level_id)
|
||||
if not level:
|
||||
raise HTTPException(404, "Level not found")
|
||||
|
||||
# Проверяем, что пользователь существует
|
||||
user_exists = await conn.fetchval(
|
||||
"SELECT 1 FROM users WHERE telegram_id = $1", telegram_id
|
||||
)
|
||||
if not user_exists:
|
||||
raise HTTPException(401, "User not registered")
|
||||
|
||||
# Получаем прогресс пользователя
|
||||
progress = await conn.fetchrow(
|
||||
"SELECT hints_used FROM user_progress WHERE user_id = $1 AND level_id = $2",
|
||||
telegram_id, level_id
|
||||
)
|
||||
|
||||
hints_already_used = progress["hints_used"] if progress else 0
|
||||
|
||||
# Получаем слова
|
||||
words = await conn.fetch(
|
||||
"SELECT * FROM level_words WHERE level_id = $1 ORDER BY word_pl", level_id
|
||||
)
|
||||
|
||||
# Определяем язык пользователя
|
||||
user = await conn.fetchrow(
|
||||
"SELECT app_language FROM users WHERE telegram_id = $1", telegram_id
|
||||
)
|
||||
lang = user["app_language"] if user else "pl"
|
||||
|
||||
# Формируем список с переводами
|
||||
translation_field = f"translation_{lang}"
|
||||
word_list = []
|
||||
for w in words:
|
||||
translation = (
|
||||
w.get(translation_field) or
|
||||
w.get("translation_pl") or
|
||||
w.get("translation_en") or
|
||||
""
|
||||
)
|
||||
word_list.append({
|
||||
"word_pl": w["word_pl"],
|
||||
"translation": translation,
|
||||
})
|
||||
|
||||
return {
|
||||
"status": "ok",
|
||||
"words": word_list,
|
||||
"total_words": len(word_list),
|
||||
"hints_used_total": hints_already_used,
|
||||
}
|
||||
|
||||
@router.get("/remaining/{level_id}")
|
||||
async def get_remaining_hints(request: Request, level_id: int):
|
||||
"""Возвращает количество оставшихся подсказок для уровня"""
|
||||
telegram_id, _ = await require_auth(request)
|
||||
|
||||
pool = await get_pool()
|
||||
async with pool.acquire() as conn:
|
||||
progress = await conn.fetchrow(
|
||||
"SELECT hints_used FROM user_progress WHERE user_id = $1 AND level_id = $2",
|
||||
telegram_id, level_id
|
||||
)
|
||||
|
||||
hints_used = progress["hints_used"] if progress else 0
|
||||
max_hints = 3
|
||||
remaining = max(0, max_hints - hints_used)
|
||||
|
||||
return {
|
||||
"max_hints": max_hints,
|
||||
"hints_used": hints_used,
|
||||
"remaining": remaining,
|
||||
}
|
||||
Reference in New Issue
Block a user