routes: return a reliable id from addRoute (re-read, not lastInsertId)

Found in desktop testing: saving a built route showed 'Маршрут пуст' and dropped
to the list — addRoute returned the INSERT lastInsertId, an i64 the SQL plugin
corrupts by ±1, so showRouteDetail opened a non-existent id. Re-read the id via
CAST(id AS TEXT) (same guard importGpxSession uses). Session log: desktop
verification of all 6 fixes.
This commit is contained in:
4aiman 2026-09-11 01:25:28 +03:00
commit aa7022ec6b
2 changed files with 20 additions and 8 deletions

View file

@ -27,11 +27,20 @@
(раньше отбрасывались) → `drawRoutePolyline` рисует оковку и в редакторе, и в детали.
`drawRoutePolyline`: прямые отрезки без высот — только тонкой линией.
## Проверка
- Синтаксис gps/db/main OK (node --check). const в новых функциях — нет.
- ДЕСКТОП-ТЕСТ на Xvfb со скринами — следующий шаг (на момент записи не гонял).
- На теле встроенным движком — после `./build.sh android -d -i`.
## Проверка (десктоп Xvfb :99 + домашний RouteServer, скрины)
- Редактор: 3 точки по Новочеркасску → маршрут рисуется оковкой с уклоном (зелёный→красный) +
тонкой линией, как в детали (#6). Тумблер уклон/высота (∡→⛰) переключает раскраску (#1).
Тап по линии вставил точку (4-я, маршрут перестроился) — легко попал (#4). Низ: подсказка
сверху, кнопки рядом, «Отмена» ниже (#3).
- Сохранение: в БД points_json = 61 точка с ele + waypoints_json = 4 опорные; список показал
«4 тчк · ▲» (#5). Деталь маршрута — оковка+уклон+профиль высоты, как импорт (#6).
- Баг, найденный тестом: сохранение показывало «Маршрут пуст» — `addRoute` возвращал
`lastInsertId` (i64 портится SQL-плагином ±1). Исправлено: id перечитывается через
`CAST(id AS TEXT)` (как в `importGpxSession`). После фикса сохранение ведёт прямо в деталь.
- Достройка (#2): на 06-22 старый порог давал 4 пропуска, новый (dt>60/хорда>150 + пропуск
крюков и «нулевого выигрыша») — 2 реальных длинных дропаута (+1.64 км), маргинальные отсеяны.
- Экран записи (`.rec-bottom`) не тронут. Тестовые маршруты из десктопной БД убраны.
## Дальше
- Прогнать на Xvfb: редактор (оковка/тумблеры/тап-вставка/низ), сохранение опорных, деталь с
оковкой; достройка на 09-08 — только длинные дропауты. Экран записи не сломан.
- На теле встроенным движком офлайн: `./build.sh android -d -i`. Проверить тач-жесты (тап-вставка,
долгий тап — дорога/прямая) и достройку на реальных треках (09-08 и др.).

View file

@ -1100,11 +1100,14 @@ async function getRoute(id) {
}
async function addRoute(name, color, points, waypoints) {
let r = await execute(
await execute(
"INSERT INTO routes (name, color, points_json, waypoints_json) VALUES (?1, ?2, ?3, ?4)",
[name, color || "#e53935", JSON.stringify(points || []), waypoints ? JSON.stringify(waypoints) : null]
);
return r.lastInsertId;
// lastInsertId comes back as an i64 the SQL plugin can corrupt by ±1 — re-read the id as
// text instead (same guard as importGpxSession), so the caller opens the right route.
let rows = await select("SELECT CAST(id AS TEXT) AS id FROM routes ORDER BY id DESC LIMIT 1");
return rows.length ? rows[0].id : null;
}
async function renameRoute(id, name) {