Files
docs/architecture/cross-cutting/data-freshness.md
T
ksv741 e0bceea936
Docs security / security (push) Successful in 7s
Docs verify / verify (push) Successful in 13s
Conventional commits / commits (pull_request) Successful in 11s
Docs security / security (pull_request) Successful in 7s
Docs verify / verify (pull_request) Successful in 13s
docs: document hourly sync history
2026-10-09 09:05:08 +03:00

6.8 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.

Повторное чтение перечитывает общие справочные данные онлайн, а финансовые ресурсы используют сохранённый результат и применяемую политику свежести. Повторная сверка полного периода публикуется одной транзакцией после всех страниц, интервалов и счетов, включая 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.