moex-vibe/apps/docs/docs/adr/ADR-012-frontend-broker-account-aggregation.md

93 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ADR-012: Сводка брокерских счетов агрегируется на frontend
**Статус:** Accepted
**Дата:** 2026-06-19
## Контекст
Страница списка брокерских счетов должна показывать общую стоимость, дневной результат, свободные
деньги и распределение активов, а также подробные показатели каждого счёта. Endpoint
`GET /api/v1/broker/accounts` возвращает только метаданные счетов. Все необходимые финансовые данные
уже доступны через `GET /api/v1/broker/accounts/:accountId/portfolio`.
Текущий продуктовый сценарий предполагает один–три открытых счёта. Backend кеширует ответы портфеля
и ограничивает запросы к T-Bank через общую очередь.
## Рассмотренные варианты
### 1. Агрегация существующих ответов на frontend
Frontend получает список счетов, параллельно запрашивает портфель каждого счёта и строит общую
сводку из успешно загруженных ответов.
Преимущества:
- не появляется новый API-контракт с данными, уже доступными в portfolio endpoint;
- каждый счёт может загружаться и восстанавливаться после ошибки независимо;
- при одном–трёх счетах число запросов остаётся ограниченным;
- используются существующие backend cache и rate limiting.
Недостатки:
- страница выполняет `1 + N` HTTP-запросов;
- ответы могут иметь разные значения `asOf` и не образуют атомарный снимок;
- правила презентационной агрегации находятся на frontend.
### 2. Новый aggregate endpoint
Добавить endpoint, который возвращает список счетов, их портфели и общую сводку одним ответом.
Преимущества:
- один HTTP-запрос с frontend;
- единый серверный контракт агрегации;
- проще переиспользовать сводку другими клиентами.
Недостатки:
- новый контракт дублирует существующие portfolio-данные;
- нужно определить семантику частичных ошибок и кеширования составного ответа;
- endpoint всё равно получает портфели нескольких счетов и не гарантирует атомарность данных T-Bank.
### 3. Расширение endpoint списка счетов
Добавить финансовую сводку каждого счёта в `GET /api/v1/broker/accounts`.
Преимущества:
- frontend получает всё одним запросом;
- карточки становятся простыми потребителями ответа.
Недостатки:
- лёгкий endpoint метаданных превращается в дорогой составной запрос;
- меняются его кеширование, время ответа и семантика ошибок;
- потребители списка счетов вынужденно получают финансовые данные.
## Решение
Использовать вариант 1: агрегировать существующие portfolio-ответы на frontend.
Frontend параллельно запрашивает портфели после получения списка счетов. Общая сводка строится только
из успешно загруженных ответов и явно помечается как частичная, если часть счетов недоступна. Ошибка
одного портфеля не блокирует остальные карточки.
Денежные значения группируются по валюте. Frontend не выполняет неявную валютную конвертацию и не
складывает несопоставимые суммы. Значения `asOf` отдельных ответов сохраняют свой смысл; сводка не
считается транзакционно согласованным снимком.
## Последствия
- Страница выполняет один запрос списка и до трёх параллельных запросов портфелей.
- Backend остаётся источником финансовых данных отдельного счёта, а frontend владеет только их
представлением и агрегацией для этой страницы.
- Частичные ошибки становятся штатным состоянием интерфейса и должны быть покрыты тестами.
- API, OpenAPI и frontend codegen для этой фичи не меняются.
- Решение следует пересмотреть, если выполняется хотя бы одно условие:
- продукт поддерживает более трёх одновременно отображаемых счетов;
- измерения показывают неприемлемую задержку или нагрузку от `1 + N` запросов;
- нескольким клиентам нужна одинаковая серверная сводка;
- появляется требование к согласованному серверному снимку или серверной валютной конвертации;
- правила агрегации становятся самостоятельной бизнес-логикой, а не логикой представления.