Newer
Older
gnexus-tasks / backend / app / api / bugtrail.py
"""Черновик задачи из ссылки на багрепорт 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,
    )