Files
enduro-trails/docs/work-items/ET-005/08-data-requirements.md
claude-bot bafbea2dab
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 5s
CI / build (push) Successful in 1s
architect(ET-005): ADR, infra-requirements, data-requirements, tech-risks
2026-05-21 22:18:08 +03:00

77 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: data-requirements
work_item_id: ET-005
title: "Требования к данным — ET-005: Переключение единиц измерения (км/мили)"
version: 1
status: approved
created_at: 2026-05-21
authors:
- "agent:architect"
---
# Требования к данным — ET-005
## 1. Резюме
ET-005 не вводит и не изменяет ни одной серверной структуры данных.
Единственное «данное» фичи — пользовательская UI-настройка выбранной
единицы измерения, хранимая на клиенте.
## 2. Серверные данные
| Аспект | Требование |
|--------|------------|
| Изменения схемы SQLite/Spatialite | Нет |
| Новые таблицы / колонки / индексы | Нет |
| Миграции (`migrations/`) | Нет |
| Изменения контракта API | Нет — расстояния и далее отдаются в **метрах** |
## 3. Каноническая единица расстояния
- Внутренняя каноническая единица системы — **метр**. Backend отдаёт
`route.distance_m` (метры); линейка во фронтенде оперирует километрами
(`rulerTotal`).
- ET-005 **не меняет** ни хранимые, ни передаваемые значения. Перевод в
мили выполняется **только в момент форматирования строки для UI**
(`Units.formatDistance()`).
- Запрещено хранить в рантайм-состоянии значения, конвертированные в
мили — это исключает накопление ошибок округления при многократном
переключении (ФТ-3 ТЗ, AC-2, тест TP-04).
## 4. Клиентское хранилище
| Параметр | Значение |
|----------|----------|
| Механизм | `localStorage` |
| Ключ | `distance_unit` |
| Допустимые значения | `'km'`, `'mi'` |
| Значение по умолчанию | `'km'` (при отсутствии ключа или некорректном значении) |
| Объём | ≈ 2 байта полезной нагрузки на браузер |
| Запись | при переключении (`Units.setUnit()`) |
| Чтение | при инициализации модуля `units.js` |
Ключ согласуется с уже сложившейся в проекте конвенцией UI-настроек в
`localStorage` (`enduro-theme-mode`, `terrain-*`, `trails-*`,
`poi-visible`).
## 5. Константы и точность
| Параметр | Значение |
|----------|----------|
| Коэффициент перевода | `1 km = 0.621371 mi` (`Units.KM_TO_MI`), единственное место объявления |
| Точность по умолчанию | 1 знак после запятой (AC-2) |
| Параметризация точности | `formatDistance()` принимает `precision`, чтобы сохранить существующую точность карточек маршрутов (`toFixed(0)`) — см. `10-tech-risks.md`, R5 |
| Разделитель дробной части | Привести к единому виду; сейчас в `app.js` есть расхождение (`.` и `,`) — см. `10-tech-risks.md`, R4 |
## 6. Персональные данные
Персональные данные (PII) отсутствуют. `distance_unit` — обезличенная
UI-настройка, не покидает браузер пользователя, не логируется на
backend.
## 7. Вывод
Серверных данных, схем и миграций ET-005 **не затрагивает**. Единственная
единица данных — клиентский флаг `localStorage:distance_unit`. Требований
к резервному копированию, ретенции и приватности не возникает.