# ТЗ: Скачивание трека из popup на карте **Work Item:** ET-011 **Стадия:** Анализ → Architecture **Автор:** analyst **Дата:** 2026-06-03 --- ## 1. Сводка Добавить в существующий popup публичного GPS-трека (слой ET-008) кнопку «Скачать», которая запрашивает с сервера GPX-файл и сохраняет его в загрузки пользователя. Новый backend-эндпоинт собирает GPX 1.1 из геометрии трека в БД `gps_tracks.sqlite`. ## 2. Функциональные требования ### REQ-F-01 — Кнопка «Скачать» в popup трека В popup публичного трека (создаётся в `_renderTrackPopupHtml(props)`, `src/web/gps_tracks.js`, l.463) **должна появляться кнопка «Скачать»**. - Иконка: download (SVG, как в `sheet-route` `downloadGPX`, l.135–137 в `index.html`). - Tooltip / aria-label: «Скачать GPX». - Размещение: в правом верхнем углу popup, рядом с названием трека, или отдельной строкой в конце popup перед источниками — на усмотрение архитектора, но **всегда видна без скролла**. - Тапабельная зона: ≥ 32×32 CSS px (mobile-friendly, REQ-NF-04 ниже). ### REQ-F-02 — Backend: эндпоинт скачивания Реализовать в роутере `src/api/gps_tracks/endpoint.py` новый GET-эндпоинт: ``` GET /api/gps-tracks/{track_id}/download GET /api/gps-tracks/{track_id}/download?format=gpx (синоним) ``` Параметры: - `track_id` (path, int, обязательный) — `tracks.id` из БД. - `format` (query, optional, default=`gpx`) — формат файла. Допустимые значения для текущей итерации: `gpx`. (При закрытии Q-2 = «делаем KML» — добавится `kml`.) Поведение: - 200 + `Content-Type: application/gpx+xml` (для GPX) или `application/vnd.google-earth.kml+xml` (для KML). - `Content-Disposition: attachment; filename=".gpx"; filename*=UTF-8''.gpx` (RFC 5987, REQ-NF-05 ниже). - 404, если `track_id` не существует. - 400, если `format` не входит в whitelist. - 403, если источник трека запрещает реэкспорт (см. REQ-F-06 и Q-1 в BRD). ### REQ-F-03 — Содержимое GPX GPX-файл должен соответствовать схеме GPX 1.1 (http://www.topografix.com/GPX/1/1) и содержать: - Корневой `` с атрибутами: - `version="1.1"` - `creator="Enduro Trails"` - `xmlns="http://www.topografix.com/GPX/1/1"` - `xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"` - `xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"` - Блок `` с: - `` — `tracks.name` или «Без названия». - `` — `tracks.description` (если есть). - `