Conventional commits / commits (pull_request) Successful in 14s
Docs security / security (pull_request) Successful in 8s
Docs verify / verify (pull_request) Successful in 13s
Docs security / security (push) Successful in 8s
Docs verify / verify (push) Successful in 12s
Document local data ownership, coverage and freshness, refresh behavior, failure recovery and additive migration rollback. Record ADR 017.
67 lines
6.1 KiB
Markdown
67 lines
6.1 KiB
Markdown
# Свежесть данных и повторное использование
|
||
|
||
WealthLedger читает инвестиционные данные из SQLite. Обычный GET возвращает
|
||
сохранённый результат и запрашивает фоновые зависимости, если они отсутствуют
|
||
или устарели. HTTP-ответ не ждёт T-Bank. Модель принята в
|
||
[ADR 017](../../adr/017-local-tbank-reads-and-background-sync.md).
|
||
|
||
## Клиентский и серверный снимки
|
||
|
||
[Client Cached Snapshot](../../glossary.md#client-cached-snapshot) — успешный
|
||
ответ в TanStack Query. Он сохраняет показанное содержимое при временной ошибке
|
||
запроса в той же границе доступа. SQLite сохраняет источники независимо от
|
||
браузера: membership, последний полный portfolio, исполненные операции,
|
||
общие сведения об инструментах, котировки, свечи и календари.
|
||
|
||
[Полнота периода](../../glossary.md#полнота-истории-счёта) и свежесть различаются.
|
||
Успешно проверенный пустой интервал полон; последняя страница журнала сама
|
||
по себе полноту не доказывает. Ошибка сверки сохраняет прежние данные и время.
|
||
Старый полный портфель не удаляется по истечении 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](../http-api.md) объясняет envelope и экранный refresh.
|
||
|
||
## Смена подключения
|
||
|
||
Каждое чтение проверяет локальную сессию, текущее подключение, известный отказ
|
||
токена и сохранённый состав доступных счетов. Расшифровка 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](../../integrations/tbank.md).
|