docs: explain persisted T-Bank reads and synchronization
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
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.
This commit was merged in pull request #22.
This commit is contained in:
@@ -51,9 +51,9 @@ Backend публикует статические маршруты под `/api/
|
||||
используют прежнюю карточку. Доля относится к позициям той же валюты
|
||||
во всём показанном портфеле, без денежных остатков.
|
||||
- Журнал объединяет операции по убыванию времени, при равном времени использует
|
||||
порядок идентификаторов счетов, сохраняя порядок внутри одного счёта. ID
|
||||
порядок идентификаторов счетов и операций. ID
|
||||
операций разных счетов не считаются дублями. Переводы не схлопываются.
|
||||
- Доходы собираются из всех страниц операций каждого счёта за общие периоды.
|
||||
- Доходы рассчитываются из согласованной локальной выборки операций за общие периоды.
|
||||
Итоги, сравнения, временные интервалы и принадлежность выплат рассчитывает
|
||||
сервис дохода.
|
||||
Для сравнения с годом ранее используется текущий состав счетов; новый счёт
|
||||
@@ -65,55 +65,39 @@ Backend публикует статические маршруты под `/api/
|
||||
|
||||
## Полнота, свежесть и доступ
|
||||
|
||||
Для каждого общего запроса backend определяет состав доступных счетов
|
||||
и единое поколение подключения. Получение данных использует эту же границу подключения;
|
||||
проверки сессии, доступа и существующий лимитер внешних запросов сохраняются.
|
||||
Финансовые данные не сохраняются в БД; снимки и продолжения хранятся
|
||||
в памяти процесса.
|
||||
Общий запрос читает membership и разрешённые snapshots из SQLite в одной
|
||||
согласованной границе. Время источников может различаться: это не обещание
|
||||
одновременного наблюдения счетов у брокера. Неполный счёт делает aggregate
|
||||
неполным; отсутствующие суммы не подменяются нулями. `lastSuccessfulAt`
|
||||
показывает самое раннее время обязательных источников.
|
||||
|
||||
Ошибка источника не превращается в частичный успешный ответ раздела.
|
||||
Портфель может использовать разрешённый существующей политикой запасной снимок
|
||||
отдельного счёта. Тогда общий `isStale` равен `true`, а `lastSuccessfulAt`
|
||||
показывает самое раннее время среди включённых снимков. Для пустого состава
|
||||
возвращается корректный пустой результат. Общий запрос не является атомарным
|
||||
наблюдением всех счетов в один момент времени.
|
||||
|
||||
Ошибка блока операций, доходов или будущих событий не скрывает основной
|
||||
портфель. При фоновом обновлении страницы уже полученный результат сохраняется
|
||||
с индикатором или предупреждением и повторной попыткой. Смена сессии или
|
||||
подключения сбрасывает общий режим вместе с остальными финансовыми запросами.
|
||||
Секции портфеля, операций, дохода и событий готовы независимо. Ошибка
|
||||
обновления сохраняет прежний полный результат того же scope и периода.
|
||||
Известный отказ доступа и смена подключения очищают personal view.
|
||||
|
||||
## Общая пагинация операций
|
||||
|
||||
Сервис объединяет потоки страниц каждого счёта и сохраняет непрочитанные строки
|
||||
между запросами. Фильтрованные пустые страницы не обрывают поток. Повреждённая
|
||||
цепочка курсоров и нарушенный порядок дат возвращают ошибку без частичной страницы.
|
||||
Страница строится из локальных строк с порядком occurredAt, accountId и ID
|
||||
операции. Cursor проверяет пользователя, подключение, membershipRevision,
|
||||
фильтры, limit и ревизии операций. Изменение rowset возвращает
|
||||
`400 INVALID_OPERATIONS_CURSOR`; клиент сбрасывает стек страниц, сохраняя
|
||||
применённые фильтры. Coverage/status без изменения строк не ломают cursor.
|
||||
Продолжение не зависит от RAM-кэша или перезапуска.
|
||||
|
||||
Курсор общего журнала — случайный непрозрачный идентификатор продолжения,
|
||||
привязанного к пользователю, поколению подключения, составу счетов, фильтрам
|
||||
и размеру страницы. Верхняя граница периода фиксируется первым запросом.
|
||||
Состояние ограничено 100 продолжениями на процесс со сроком жизни пять минут;
|
||||
повторный запрос того же продолжения возвращает тот же успешный результат.
|
||||
|
||||
Неизвестный, вытесненный, истёкший либо несовместимый курсор возвращает
|
||||
`400 INVALID_OPERATIONS_CURSOR`. Действие «Повторить» сбрасывает пагинацию,
|
||||
обновляет первую страницу и сохраняет фильтры. Перезапуск backend также
|
||||
инвалидирует продолжения. Раздел рассчитан на один экземпляр backend, как
|
||||
существующий финансовый кэш.
|
||||
Повторная сверка полного показанного периода публикует все счета и интервалы
|
||||
одной транзакцией; успешное первое окно не смешивается с прежними остальными.
|
||||
Подробнее — [журнал](../operations/overview.md#получение-и-полнота).
|
||||
|
||||
## Совместимость и границы требований
|
||||
|
||||
Общий режим добавляет маршруты, сохраняя маршруты отдельных счетов.
|
||||
При совместном обновлении сначала нужен backend, затем frontend с
|
||||
соответствующим сгенерированным контрактом; прежний клиент продолжает
|
||||
работать с отдельными счетами. При откате сначала возвращается клиент.
|
||||
Этот механизм не требует изменения схемы SQLite и миграции финансовых данных.
|
||||
Общий режим использует те же persistent sources и envelope, что и отдельный
|
||||
счёт. Новый envelope несовместим с прежним bare response: backend и frontend
|
||||
поставляются согласованной парой по [HTTP contract](../../architecture/http-api.md).
|
||||
Additive migration сохраняет прежние таблицы; rollback приложения не удаляет
|
||||
новые данные и не заменяет рабочую базу старым backup. Возврат требует заранее
|
||||
проверенной совместимой пары; произвольный прежний клиент не считается совместимым.
|
||||
Процедура backup/restore описана в [runbook](../../architecture/deployment.md).
|
||||
|
||||
Основные спецификации [портфеля](https://git.personal.ksv741.ru/WealthLedger/specs/src/commit/9e227a563dda67620f0ad78228aa8a4c18bf35a0/openspec/specs/portfolio-view/spec.md),
|
||||
[операций](https://git.personal.ksv741.ru/WealthLedger/specs/src/commit/9e227a563dda67620f0ad78228aa8a4c18bf35a0/openspec/specs/brokerage-account-ledger/spec.md),
|
||||
[дохода](https://git.personal.ksv741.ru/WealthLedger/specs/src/commit/9e227a563dda67620f0ad78228aa8a4c18bf35a0/openspec/specs/brokerage-account-income-analytics/spec.md)
|
||||
и [событий](https://git.personal.ksv741.ru/WealthLedger/specs/src/commit/9e227a563dda67620f0ad78228aa8a4c18bf35a0/openspec/specs/brokerage-account-upcoming-events/spec.md)
|
||||
описывают отдельный счёт. Общий режим подтверждён действующими маршрутизаторами,
|
||||
сервисами и [проверками агрегации](https://git.personal.ksv741.ru/WealthLedger/backend/src/commit/016782657acfd35ff3fd755462007938fac35156/src/modules/investments/all-accounts.spec.ts),
|
||||
но не выделен в самостоятельную основную спецификацию. Не следует считать
|
||||
описание общего режима изменением требований к отдельному счёту.
|
||||
Основные спецификации областей сохраняют исходные понятия отдельного счёта.
|
||||
Утверждённый change `persist-tbank-data` распространяет полноту, локальный
|
||||
доступ, атомарную сверку и состояния синхронизации на режим `all`.
|
||||
|
||||
Reference in New Issue
Block a user