codex/frontend-fsd-portfolios #26
@ -14,9 +14,8 @@ React SPA, собранная с Vite.
|
|||||||
|
|
||||||
## Структура исходников
|
## Структура исходников
|
||||||
|
|
||||||
Published-структура ниже описывает primary FSD entrypoints. Historical каталоги `api/`, `context/`,
|
Published-структура ниже описывает primary FSD entrypoints. Исторические каталоги `api/`, `context/`,
|
||||||
`hooks/`, `components/` ещё присутствуют в кодовой базе, но для уже мигрированных областей они всё
|
`hooks/`, `components/` ещё присутствуют в кодовой базе для ещё не мигрированных доменов.
|
||||||
чаще играют роль transitional shim-слоя, а не source of truth.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
apps/frontend/src/
|
apps/frontend/src/
|
||||||
@ -38,54 +37,63 @@ apps/frontend/src/
|
|||||||
├── shared/
|
├── shared/
|
||||||
│ ├── api/ # shared API client, response types, generated OpenAPI types
|
│ ├── api/ # shared API client, response types, generated OpenAPI types
|
||||||
│ └── ui/ # shared UI primitives without domain logic
|
│ └── ui/ # shared UI primitives without domain logic
|
||||||
├── entities/
|
├── entities/ # FSD business entities
|
||||||
│ ├── session/ # FSD: auth/session (api, model/context + hook)
|
│ ├── session/ # Auth/session (api, model)
|
||||||
│ ├── search/ # FSD: market search query slice
|
│ ├── search/ # Market search query slice
|
||||||
│ ├── stock/ # FSD: stock api + query hooks
|
│ ├── stock/ # Акции (api, model)
|
||||||
│ ├── bond/ # FSD: bond api + query hooks
|
│ ├── bond/ # Облигации (api, model)
|
||||||
│ ├── portfolio/ # FSD: portfolio api + query hooks
|
│ ├── portfolio/ # Портфели (api, model)
|
||||||
│ ├── broker-account/ # FSD: account slice (api, model, ui)
|
│ ├── broker-account/ # Брокерский счёт (api, model, ui)
|
||||||
│ ├── broker-position/ # FSD: position slice (api, model)
|
│ ├── broker-position/ # Брокерская позиция (api, model)
|
||||||
│ └── broker-operation/ # FSD: operation slice (api, model)
|
│ └── broker-operation/ # Брокерская операция (api, model)
|
||||||
├── widgets/
|
├── widgets/ # FSD compositional widgets
|
||||||
│ ├── search-bar/ # FSD: instrument search widget
|
│ ├── search-bar/ # Поиск инструментов
|
||||||
│ ├── price-chart/ # FSD: market chart widget
|
│ ├── price-chart/ # График цены
|
||||||
│ ├── stock-details/ # FSD: stock details widget
|
│ ├── stock-details/ # Детальная карточка акции
|
||||||
│ ├── bond-details/ # FSD: bond details widget
|
│ ├── bond-details/ # Детальная карточка облигации
|
||||||
│ ├── dividends-table/ # FSD: stock dividends widget
|
│ ├── dividends-table/ # Таблица дивидендов
|
||||||
│ ├── broker-account-card/ # FSD: account card widget
|
│ ├── broker-account-card/ # Карточка брокерского счёта
|
||||||
│ ├── broker-accounts-summary/ # FSD: accounts summary widget
|
│ ├── broker-accounts-summary/ # Сводка брокерских счетов
|
||||||
│ ├── broker-allocation-chart/ # FSD: allocation chart widget
|
│ ├── broker-allocation-chart/ # График распределения
|
||||||
│ └── broker-operations-table/ # FSD: operations table widget
|
│ ├── broker-operations-table/ # Таблица операций
|
||||||
├── pages/
|
│ ├── portfolio-card/ # Карточка портфеля
|
||||||
│ ├── HomePage.tsx # re-export shim → pages/home
|
│ ├── portfolio-form/ # Форма портфеля
|
||||||
│ ├── StockPage.tsx # re-export shim → pages/stock
|
│ ├── portfolio-summary/ # Сводка портфеля
|
||||||
│ ├── BondPage.tsx # re-export shim → pages/bond
|
│ ├── portfolio-analytics/ # Метрики портфеля
|
||||||
│ ├── home/ # FSD: home page entrypoint
|
│ ├── share-positions-table/ # Таблица позиций-акций
|
||||||
│ ├── stock/ # FSD: stock page entrypoint
|
│ └── bond-positions-table/ # Таблица позиций-облигаций
|
||||||
│ ├── bond/ # FSD: bond page entrypoint
|
├── pages/ # FSD page entrypoints
|
||||||
│ ├── LoginPage.tsx
|
│ ├── home/ # Главная
|
||||||
│ ├── RegisterPage.tsx
|
│ ├── stock/ # Страница акции
|
||||||
│ ├── ProfilePage.tsx
|
│ ├── bond/ # Страница облигации
|
||||||
│ ├── portfolios/
|
│ ├── LoginPage.tsx # Вход (не мигрирован)
|
||||||
│ ├── screener/
|
│ ├── RegisterPage.tsx # Регистрация (не мигрирован)
|
||||||
|
│ ├── ProfilePage.tsx # Профиль (не мигрирован)
|
||||||
|
│ ├── portfolios/ # Список и детальная портфеля (не мигрирован)
|
||||||
|
│ ├── screener/ # Скринер (не мигрирован)
|
||||||
│ ├── broker-accounts/ # FSD: page entrypoint
|
│ ├── broker-accounts/ # FSD: page entrypoint
|
||||||
│ ├── broker-account/ # FSD: page entrypoint
|
│ ├── broker-account/ # FSD: page entrypoint
|
||||||
│ ├── broker-positions/ # FSD: page entrypoint
|
│ ├── broker-positions/ # FSD: page entrypoint
|
||||||
│ └── broker-operations/ # FSD: page entrypoint
|
│ └── broker-operations/ # FSD: page entrypoint
|
||||||
|
├── api/
|
||||||
|
│ └── screener.ts # Screener API helpers (не мигрирован)
|
||||||
|
├── hooks/
|
||||||
|
│ └── useScreener.ts # Screener hook (не мигрирован)
|
||||||
|
├── components/
|
||||||
|
│ └── screener/ # Screener UI (не мигрирован)
|
||||||
├── test/
|
├── test/
|
||||||
|
│ ├── factories.ts # Фабрики тестовых данных
|
||||||
│ ├── handlers.ts # MSW handlers
|
│ ├── handlers.ts # MSW handlers
|
||||||
│ └── test-utils.tsx
|
│ ├── server.ts # MSW server
|
||||||
├── api/ # historical paths + compatibility shims around shared/entities
|
│ ├── test-utils.tsx # Обёртка рендера
|
||||||
├── context/ # historical compatibility layer
|
│ ├── setup.ts # Настройка jsdom
|
||||||
├── hooks/ # historical compatibility layer
|
│ └── README.md
|
||||||
└── components/ # historical compatibility layer
|
|
||||||
└── styles.css
|
└── styles.css
|
||||||
```
|
```
|
||||||
|
|
||||||
## FSD-миграция
|
## FSD-миграция
|
||||||
|
|
||||||
### app-слой и session-сущность
|
### app-слой
|
||||||
|
|
||||||
Создан `app/` слой FSD, в который перенесены инфраструктурные модули:
|
Создан `app/` слой FSD, в который перенесены инфраструктурные модули:
|
||||||
|
|
||||||
@ -94,52 +102,50 @@ apps/frontend/src/
|
|||||||
- `app/layouts/` — AppLayout (шапка + Outlet)
|
- `app/layouts/` — AppLayout (шапка + Outlet)
|
||||||
- `app/App.tsx` — BrowserRouter → AppRoutes
|
- `app/App.tsx` — BrowserRouter → AppRoutes
|
||||||
|
|
||||||
Домен auth переведён в `entities/session/`:
|
### entities
|
||||||
|
|
||||||
- `entities/session/api/` — login, register, logout, refresh, getMe, updateProfile
|
Домены бизнес-сущностей переведены в FSD:
|
||||||
- `entities/session/model/` — SessionContext, useSession
|
|
||||||
|
|
||||||
Старые файлы (`api/auth.ts`, `hooks/useAuth.ts`, `context/AuthContext.tsx`, `routes.tsx`, `components/Layout.tsx`, `components/ProtectedRoute.tsx`, `App.tsx`) сохранены как ре-экспорт шмы для обратной совместимости.
|
| Сущность | api | model | ui |
|
||||||
|
|----------|-----|-------|----|
|
||||||
|
| `session` | login, register, refresh, logout, getMe, updateProfile | SessionContext, useSession | — |
|
||||||
|
| `stock` | getStock, getStockCandles, getStockDividends | useStock, useStockCandles, useStockDividends | — |
|
||||||
|
| `bond` | getBond, getBondCandles | useBond, useBondCandles | — |
|
||||||
|
| `portfolio` | CRUD портфелей и позиций, аналитика | usePortfolio, usePortfolios, usePortfolioAnalytics, usePortfolioMutations, usePositionMutations | — |
|
||||||
|
| `search` | — | useSearch | — |
|
||||||
|
| `broker-account` | API брокерских счетов | useBrokerAccounts, useBrokerAccountPortfolios | BrokerAccountLayout |
|
||||||
|
| `broker-position` | API брокерских позиций | useBrokerPositions | — |
|
||||||
|
| `broker-operation` | API брокерских операций | useBrokerOperations | — |
|
||||||
|
|
||||||
### broker-домен (пилот)
|
Каждая сущность имеет barrel-файл `index.ts`, реэкспортирующий публичное API.
|
||||||
|
|
||||||
Broker-домен переведён в пилотный FSD срез:
|
### widgets
|
||||||
|
|
||||||
- `pages/broker-*` — тонкие route entrypoints
|
Композиционные блоки UI. Каждый виджет — директория с `index.ts` и `ui/`:
|
||||||
- `widgets/broker-*` — screen-level композиция
|
|
||||||
- `entities/broker-*` — доменные срезы (api, model, ui)
|
|
||||||
|
|
||||||
### market pages (следующая итерация)
|
- `search-bar` — поиск с автодополнением
|
||||||
|
- `price-chart` — график цены (lightweight-charts)
|
||||||
|
- `stock-details`, `bond-details` — детальные карточки бумаг
|
||||||
|
- `dividends-table` — таблица дивидендов
|
||||||
|
- `broker-*-*` — UI брокерского домена
|
||||||
|
- `portfolio-card`, `portfolio-form`, `portfolio-summary`, `portfolio-analytics` — UI портфелей
|
||||||
|
- `share-positions-table`, `bond-positions-table` — таблицы позиций
|
||||||
|
|
||||||
После broker pilot market-раздел также переведён на FSD entrypoints:
|
### pages
|
||||||
|
|
||||||
- `pages/home`, `pages/stock`, `pages/bond` — primary route entrypoints;
|
- `pages/home`, `pages/stock`, `pages/bond` — FSD page entrypoints для market pages
|
||||||
- `widgets/search-bar`, `widgets/price-chart`, `widgets/stock-details`,
|
- `pages/broker-*` — FSD page entrypoints для брокерского домена
|
||||||
`widgets/bond-details`, `widgets/dividends-table` — primary UI entrypoints;
|
- Временно не мигрированы: `portfolios/`, `screener/`, `LoginPage.tsx`, `RegisterPage.tsx`, `ProfilePage.tsx`
|
||||||
- `entities/search` — search query slice;
|
|
||||||
- `entities/stock` и `entities/bond` — query hooks и domain API для market pages.
|
|
||||||
|
|
||||||
При этом orchestration остаётся в page-layer: route params, вычисление диапазонов дат, загрузка
|
### Не мигрировано
|
||||||
данных и loading/not-found состояния не переносятся в widgets.
|
|
||||||
|
|
||||||
### Остальные домены
|
Скринер остаётся в исторической структуре:
|
||||||
|
|
||||||
`screener` в основном остаётся в historical технической структуре. `portfolio` находится в
|
- `api/screener.ts` — API-вызовы
|
||||||
промежуточном состоянии: page-level структура ещё не полностью унифицирована, но domain API/model
|
- `hooks/useScreener.ts` — логика с URLSearchParams
|
||||||
слой уже вынесен в `entities/portfolio`.
|
- `components/screener/` — FilterPanel, FilterPanelBond, FilterPanelShare, ScreenerTable
|
||||||
|
- `pages/screener/ScreenerPage.tsx` — страница
|
||||||
|
|
||||||
### Legacy coexistence
|
Страницы аутентификации (`LoginPage`, `RegisterPage`, `ProfilePage`) — плоские, но используют FSD-импорты из `entities/session`.
|
||||||
|
|
||||||
После app/session, broker и market migration в проекте ещё остаются top-level `api/`, `context/`,
|
ESLint-правила на границы импортов FSD пока не введены.
|
||||||
`hooks/`, `components/` и плоские `pages/*.tsx`. Для уже мигрированных зон они служат главным
|
|
||||||
образом как compatibility shim-слой:
|
|
||||||
|
|
||||||
- `components/SearchBar.tsx` → `widgets/search-bar`
|
|
||||||
- `components/PriceChart.tsx` → `widgets/price-chart`
|
|
||||||
- `components/StockDetails.tsx` → `widgets/stock-details`
|
|
||||||
- `components/BondDetails.tsx` → `widgets/bond-details`
|
|
||||||
- `hooks/useSearch.ts` → `entities/search`
|
|
||||||
- `pages/HomePage.tsx`, `pages/StockPage.tsx`, `pages/BondPage.tsx` → новые page entrypoints
|
|
||||||
|
|
||||||
Published docs описывают primary FSD entrypoints; legacy paths остаются временной поверхностью
|
|
||||||
совместимости.
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user