Files
docs/architecture/cross-cutting/data-freshness.md
T
ksv741 0ee54ca952 docs: record minimal runtime coordination
Document accepted cross-tab reauthentication, on-demand candles,
native query/logging ownership and the complete deployment path.

Preserve historical ADR context and link amendments through ADR 018.
Related backend change: WealthLedger/backend@d698ed9
2026-10-03 21:32:35 +03:00

6.5 KiB
Raw Blame History

Свежесть данных и повторное использование

WealthLedger читает инвестиционные данные из SQLite. Обычный GET возвращает сохранённый результат и запрашивает фоновые зависимости, если они отсутствуют или устарели. HTTP-ответ не ждёт T-Bank. Модель принята в ADR 017.

Клиентский и серверный снимки

Client Cached Snapshot — успешный ответ в TanStack Query. Он сохраняет показанное содержимое при временной ошибке запроса в той же границе доступа. SQLite сохраняет источники независимо от браузера: membership, последний полный portfolio, исполненные операции, общие сведения об инструментах, котировки, свечи и календари.

Полнота периода и свежесть различаются. Успешно проверенный пустой интервал полон; последняя страница журнала сама по себе полноту не доказывает. Ошибка сверки сохраняет прежние данные и время. Старый полный портфель не удаляется по истечении TTL. isStale показывает возраст portfolio source, а не сам факт неудачного обновления.

Источник Когда обычный запрос требует обновления
Portfolio, котировки, изменяемый хвост дневных свечей Через 60 секунд
Membership и изменяемый хвост операций Через 5 минут
Metadata, поиск каталога, company и календари Через сутки
Полные прошлые интервалы операций и завершённые свечи При явном обновлении показанного периода

TTL не создаёт таймер импорта. Запрошенная работа может закончиться после ухода со страницы. После перезапуска нет автоматического обхода intent: следующий подходящий запрос повторяет незавершённый интервал с первой страницы, переиспользуя полные интервалы. Cursor брокера не служит durable checkpoint.

Ручное «Обновить» перечитывает зависимости текущего экрана и применённый период независимо от TTL. Повторная сверка полного периода публикуется одной транзакцией после всех страниц, интервалов и счетов, включая all. Сбой сохраняет весь прежний результат. Первая загрузка может публиковать полные малые интервалы и показывать частичный период без окончательных сумм.

Клиент наблюдает только известную активную работу открытого экрана. Status GET и data GET с sync=observe не запускают работу. После изменения состояния ответ попадает в ту же query identity; после ухода или завершения наблюдение прекращается. Поздний ответ не заменяет уже принятый новый. HTTP API объясняет envelope и экранный refresh.

Отменой query lifecycle владеет TanStack Query. Status не пересобирает финансовые ответы и не передаёт hash notifications. Свечи нового диапазона загружаются при его открытии; предзагрузка всей истории портфеля не выполняется.

Смена подключения

Каждое чтение проверяет локальную сессию, текущее подключение, известный отказ токена и сохранённый состав доступных счетов. Расшифровка token и GetAccounts для локальной выдачи не нужны. Старый membership допускает выдачу и фоновую сверку; это задержка обнаружения отзыва доступа, а не live-проверка брокера. Unknown membership не даёт доступа к произвольному accountId: ответ сообщает о загрузке доступа. Успешный новый список немедленно ограничивает последующие чтения. Известный invalid token блокирует личные данные.

Успешный PUT атомарно сохраняет token, новую случайную внутреннюю revision и membership из проверки token. Прежние личные datasets и work становятся недоступны. DELETE удаляет подключение и личные данные; общие неперсональные источники могут оставаться. Неуспешный PUT сохраняет действующую границу.

Публикация проверяет revision и attempt в той же SQLite-транзакции; поздняя работа старого подключения не меняет даже timestamp. Revision не попадает в API, логи или cursor. Frontend очищает personal queries при смене подключения и известном отказе доступа; поздний ответ не восстанавливает скрытые данные. Logout очищает сессию и query cache. Подробнее — интеграция T-Bank.