From ebf34e01ca8c8dab533bb76aff3d5b03177383f8 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Thu, 13 Aug 2026 20:57:01 +0300 Subject: [PATCH] feat: add brocker account list --- features/brokerage-accounts.md | 55 ++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 features/brokerage-accounts.md diff --git a/features/brokerage-accounts.md b/features/brokerage-accounts.md new file mode 100644 index 0000000..1505c3a --- /dev/null +++ b/features/brokerage-accounts.md @@ -0,0 +1,55 @@ +# Брокерские счета + +Авторизованный пользователь просматривает открытые поддерживаемые инвестиционные счета T-Bank на странице `/accounts`. Для получения списка требуется сохранённое T-Bank connection; frontend никогда не обращается к T-Bank напрямую. + +```mermaid +sequenceDiagram + participant U as User + participant F as Frontend + participant B as Backend + participant D as SQLite + participant T as T-Bank gRPC + U->>F: Открывает /accounts + F->>B: GET /api/v1/brokerage-accounts (Bearer) + B->>D: Читает T-Bank connection + alt Connection отсутствует + B-->>F: 409 TBANK_NOT_CONNECTED + F-->>U: Переход к настройкам T-Bank + else Connection существует + B->>T: GetAccounts(OPEN) over TLS + T-->>B: Счета или ошибка + B-->>F: Нормализованный массив либо Problem Details + F-->>U: Карточки счетов или error-state + end +``` + +## API + +`GET /api/v1/brokerage-accounts` требует Bearer access token и возвращает массив: + +```json +[ + { + "id": "account-id", + "name": "Основной", + "type": "BROKERAGE", + "openedOn": "2024-08-13" + } +] +``` + +Поддерживаемые `type`: `BROKERAGE`, `INDIVIDUAL_INVESTMENT`, `INVEST_BOX`, `MONEY_MARKET_FUND`. Банковские и неизвестные типы T-Bank не возвращаются. Пустое upstream-название заменяется названием типа, а отсутствующая дата открытия передаётся как `null`. + +## Состояния + +- `409 TBANK_NOT_CONNECTED`: список не запрашивается у T-Bank, экран ведёт в настройки. +- `400 INVALID_TBANK_TOKEN`: сохранённый token не удаляется, экран ведёт в настройки для замены или удаления. +- `503 TBANK_UNAVAILABLE`: экран предлагает повторить загрузку или открыть настройки. +- Неизвестная ошибка: экран предлагает только повторить загрузку. +- Успешный пустой ответ: штатное состояние отсутствия инвестиционных счетов. + +Карточка ведёт на `/accounts/:accountId` и показывает название, локализованный тип и дату открытия без времени. + +## Ограничения MVP + +Список запрашивается при открытии экрана без ручного обновления и без refetch при возврате фокуса. Frontend использует успешный React Query-кэш в течение 60 секунд, поэтому повторный вход в этот интервал не выполняет новый GET. Backend не хранит кэш и не передаёт метку свежести; после истечения frontend-кэша один upstream-вызов либо полностью заменяет список, либо показывает error-state. Балансы, доходность, графики, портфель, закрытые счета и операции не входят в feature.