"""Черновик задачи из ссылки на багрепорт BugTrail (ТЗ 3.22, 0.92).
GET /api/bugtrail/draft?url=... — бэкенд достаёт отчёт по share-токену и отдаёт
готовый заголовок с описанием. Ничего не создаёт и в БД не пишет: фронт заполняет
форму, решение создать задачу остаётся за человеком.
Ходить с бэкенда, а не из браузера, приходится по двум причинам: у трекера узкий
CORS и share-токен незачем светить лишний раз. Адрес трекера берётся из настроек,
из ссылки вынимается только токен (см. services/bugtrail.py).
"""
from fastapi import APIRouter, HTTPException
from app.config import get_settings
from app.dependencies import UserIdDep
from app.services import bugtrail
router = APIRouter(prefix="/api/bugtrail", tags=["bugtrail"])
@router.get("/draft", response_model=bugtrail.BugTrailDraft)
async def get_bugtrail_draft(url: str, user_id: UserIdDep) -> bugtrail.BugTrailDraft:
"""Черновик задачи из ссылки на отчёт BugTrail.
400 — не наша ссылка, 503 — импорт выключен настройкой, 404 — отчёта нет,
502 — трекер молчит или ответил не тем. Тихо игнорировать 404/502 нельзя:
человек вставил ссылку именно чтобы получить текст, но и ссылка при этом
остаётся в заголовке — терять введённое нечем.
"""
settings = get_settings()
if not settings.bugtrail_enabled:
raise HTTPException(status_code=503, detail="BugTrail import is not configured")
token = bugtrail.parse_share_token(url)
if token is None:
raise HTTPException(status_code=400, detail="Not a BugTrail report link")
report, status = await bugtrail.fetch_report(token)
if status == "not_found":
raise HTTPException(status_code=404, detail="Report not found")
if report is None:
raise HTTPException(status_code=502, detail="BugTrail is unavailable")
return bugtrail.build_draft(
report,
api_base=settings.bugtrail_url.rstrip("/"),
panel_base=settings.bugtrail_panel,
token=token,
)