From aa7022ec6b7e9ddba57d8619da2fdfa69e0ef678 Mon Sep 17 00:00:00 2001 From: 4aiman Date: Fri, 11 Sep 2026 01:25:28 +0300 Subject: [PATCH] routes: return a reliable id from addRoute (re-read, not lastInsertId) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../2026-09-11_route-editor-gapfill-fixes.md | 21 +++++++++++++------ frontend/js/db.js | 7 +++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/docs/session-logs/2026-09-11_route-editor-gapfill-fixes.md b/docs/session-logs/2026-09-11_route-editor-gapfill-fixes.md index a54a715..fd71162 100644 --- a/docs/session-logs/2026-09-11_route-editor-gapfill-fixes.md +++ b/docs/session-logs/2026-09-11_route-editor-gapfill-fixes.md @@ -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 и др.). diff --git a/frontend/js/db.js b/frontend/js/db.js index 7516641..902ecc8 100644 --- a/frontend/js/db.js +++ b/frontend/js/db.js @@ -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) {