Files
healthlog/docs/backlog/read-api-tochki.md
T
av f8200f7f80 feat: разбор и хранение тренировок и состояния разума
- секции `workouts` и `stateOfMind` покрыты разбором: тренировка лежит одной
  строкой вместе с маршрутом и внутренними рядами, запись — по ключу `род + id`;
  миграция 00007 заводит обе таблицы и возвращает в очередь `partial`-доставки
  с этими ключами
- сущность заменяется целиком, но условно: приехавшая побеждает, если не теряет
  содержания сохранённой (множество ключей и длины верхнеуровневых массивов), а
  при равном содержании выигрывает версия из более поздней доставки ЖУРНАЛА —
  «побеждает приехавшая» было бы функцией порядка свёртки, и живая витрина
  расходилась бы с пересборкой молча
- отпечаток витрины покрывает тренировки и записи и снимается одним снимком
  базы; отчёт `reindex` считает «было и стало» по каждой единице хранения
2026-08-02 13:05:16 +03:00

2.5 KiB

Read API: точки, выбор слоя, свёртка по сетке

Приоритет: высокий

Сейчас данные достаются только sqlite3 на хосте. Все три сценария — агент-медик, трекер тренировок, фитнес-игра — упираются в отсутствие чтения.

Формы запроса ровно две, и это один запрос с необязательным параметром: ?from&to — все значения за период (вес, лекарства, симптомы), ?from&to&bucket — с разбивкой (шаги, энергия).

Решение по размеру ответа (вариант «б»): разбивка не задана и ответ не влезает — сервер сам берёт сетку погрубее и называет её в ответе; разбивка задана явно и не влезает — ошибка со списком доступных сеток, а не тихая подмена. Различие существенно: иначе агент, попросивший минутную сетку, получит суточные суммы.

Отдача тренировок и записей входит сюда же. Разбор и хранение сущностей с собственным id сделаны (change 2026-08-02-trenirovki-i-zapisi), а эндпоинтов нет: тренировка с маршрутом и записи stateOfMind лежат в витрине и наружу не отдаются. Вводить их раньше конверта ответа значило бы задать контракт мимоходом, поэтому GET /workouts, GET /workouts/{id} и GET /records/{kind} закрываются этой задачей — вместе с формой конверта и правилом размера ответа. Второй сценарий паспорта (трекер) до тех пор не закрыт.

Готово, когда «шаги за неделю по дням» и «вес за год» отвечаются одним запросом каждый, тренировка отдаётся одним пакетом вместе с маршрутом, а в ответе всегда видно layer, bucket и aggregation.

Связано: docs/architecture.md → «Read API», план → шаг «Read API».