Backend:
- Миграция gps_tracks_001_init.sql: таблицы tracks + pipeline_runs
- Пакет src/api/gps_tracks/: models, db (WAL+upsert с dedup), dedup
(bbox+length+date bucket-hash), mvt (LRU-кэш 1024 тайла), endpoint
(GET /api/gps-tracks, GET /api/gps-tracks/tiles/{z}/{x}/{y}.mvt,
GET /api/gps-tracks/health, POST /api/gps-tracks/cache/clear), config
- Парсеры: osm (split_bbox, haversine, defusedxml XXE-защита),
enduro_russia + ttrails — заглушки (ADR-010/011 proposed, блокированы)
- Licensing guard: pipeline проверяет status ADR-файла до запуска источника
- scripts/gps_collect.py: CLI с --region/--source/--dry-run/--gc
Frontend:
- src/web/gps_tracks.js: двухрежимный слой (MVT z≤11, GeoJSON z≥12),
debounced fetch + AbortController, фильтры активности/источника,
цветовая палитра by-source/by-activity, halo на спутнике, popup трека,
restorePublicTracksState(), localStorage persistence
- index.html: чекбокс «Публичные треки» в terrain-popup, #sheet-gps-filters
- app.css: .terrain-link-btn, .gps-filter-grid, .track-popup
- app.js: вызов restorePublicTracksState() в rebuildMapOverlays(),
applyGpsHaloVisibility() в applyBaseLayer()
Конфиги:
- config/gps_sources.yaml: osm (enabled), enduro_russia/ttrails (disabled)
- config/gps_regions.yaml: ЦФО+Чувашия (enabled), Кавказ (disabled)
Docker:
- gps-collector service с profiles: [batch]
Тесты: 48 новых тестов (unit + integration), 125/125 pass
Refs: ET-008
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
41 lines
1.5 KiB
SQL
41 lines
1.5 KiB
SQL
PRAGMA journal_mode=WAL;
|
|
CREATE TABLE IF NOT EXISTS tracks (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
dedup_key TEXT NOT NULL UNIQUE,
|
|
name TEXT,
|
|
description TEXT,
|
|
activity_type TEXT,
|
|
user TEXT,
|
|
created_at TEXT,
|
|
length_m REAL NOT NULL,
|
|
points_count INTEGER NOT NULL,
|
|
min_lon REAL NOT NULL,
|
|
min_lat REAL NOT NULL,
|
|
max_lon REAL NOT NULL,
|
|
max_lat REAL NOT NULL,
|
|
geom BLOB NOT NULL,
|
|
sources_json TEXT NOT NULL,
|
|
external_urls_json TEXT NOT NULL,
|
|
tags_json TEXT,
|
|
inserted_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
source_priority INTEGER NOT NULL DEFAULT 999
|
|
);
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_tracks_dedup ON tracks(dedup_key);
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_activity ON tracks(activity_type);
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_created ON tracks(created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_bbox ON tracks(min_lon, max_lon, min_lat, max_lat);
|
|
|
|
CREATE TABLE IF NOT EXISTS pipeline_runs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
started_at TEXT NOT NULL,
|
|
finished_at TEXT,
|
|
region_id TEXT NOT NULL,
|
|
source_id TEXT NOT NULL,
|
|
status TEXT NOT NULL,
|
|
tracks_new INTEGER DEFAULT 0,
|
|
tracks_updated INTEGER DEFAULT 0,
|
|
errors_json TEXT
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_pipeline_started ON pipeline_runs(started_at);
|