- цель parsing-and-storage закрыта по своему критерию; незакрываемый остаток (новые формы от источника, ручные секции задним числом) переехал в тему parsing-completeness - цель mcp поглощена целью read-api, переименованной в «Чтение данных клиентами»: адаптер — последний шаг того же направления, а не своё - read-api-points разложена на конверт с точками, свёртку по сетке и тренировки с записями; спринт 2026-08-04 набран пятью задачами
3.4 KiB
Тренировки и записи наружу
- Секция: ядро
- Зачем: Тренировки с маршрутами и stateOfMind разобраны и лежат в витрине, а эндпоинтов нет — второй сценарий паспорта не закрыт
- Теги: goal:read-api
Трекер тренировок забирает тренировку одним пакетом вместе с маршрутом, а
записи stateOfMind достаются за период — без доступа к файлу базы.
Третья из трёх частей read-api-points. Разбор и хранение сущностей с
собственным id сделаны (change 2026-08-02-trenirovki-i-zapisi), эндпоинтов
нет: данные лежат в витрине и наружу не отдаются. Второй сценарий паспорта до
тех пор не закрыт.
Маршруты: GET /workouts, GET /workouts/{id}, GET /records/{kind}.
Конверт не изобретается заново — наследуется от конверта ответа вместе с формой провода и условным запросом. Вводить эти маршруты раньше конверта значило бы задать контракт мимоходом; именно поэтому они здесь, а не в задаче о разборе.
Маршрут — первый по-настоящему тяжёлый ответ проекта. Он лежит блобом внутри тренировки, и правило размера ответа (свёртка по сетке) обязано распространяться и на него — иначе одна тренировка с длинным треком проходит мимо предела, названного для точек. Разворачивание маршрута в отдельную таблицу остаётся идеей и этой задачей не решается.
Критерии приёмки
- тренировка отдаётся одним пакетом вместе с маршрутом — оракул: запрос к поднятому сервису на живом архиве
- записи
stateOfMindза период достаютсяGET /records/{kind}— оракул: тест на пакетахinternal/hae/testdata - конверт, форма провода и условный запрос те же, что у точек, а не собственные — оракул: тест, сравнивающий форму ответа обоих маршрутов
- тренировка с длинным маршрутом подчиняется тому же пределу размера ответа, что и точки — оракул: тест на синтетическом треке за пределом
Рамки
Схема не трогается, данные только читаются, сервис перезапускается. Берётся
после конверта ответа. Против ./data — только task up / task run.
Связано: docs/architecture.md → «Read API»; идея
разворачивания маршрутов в таблицу.