# FSD Entities Migration — Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [x]`) syntax for tracking. **Goal:** Перенести stock, bond и portfolio домены в FSD-сущности (`entities/`) без изменения пользовательского поведения. **Architecture:** Миграция по паттерну broker-пилота: создаётся FSD-каркас entity → код переносится → старые файлы становятся shim-ами → потребители переключаются на новые импорты → общий клиент очищается. **Tech Stack:** React 18, TypeScript, React Router v6, TanStack Query v5, Vitest, Testing Library. --- ## Карта файлов ### Stock entity - Create `apps/frontend/src/entities/stock/index.ts` - Create `apps/frontend/src/entities/stock/api/stockApi.ts` - Create `apps/frontend/src/entities/stock/model/useStock.ts` - Create `apps/frontend/src/entities/stock/model/useStockCandles.ts` - Create `apps/frontend/src/entities/stock/model/useStockDividends.ts` ### Bond entity - Create `apps/frontend/src/entities/bond/index.ts` - Create `apps/frontend/src/entities/bond/api/bondApi.ts` - Create `apps/frontend/src/entities/bond/model/useBond.ts` - Create `apps/frontend/src/entities/bond/model/useBondCandles.ts` ### Portfolio entity - Create `apps/frontend/src/entities/portfolio/index.ts` - Create `apps/frontend/src/entities/portfolio/api/portfolioApi.ts` - Create `apps/frontend/src/entities/portfolio/model/usePortfolio.ts` - Create `apps/frontend/src/entities/portfolio/model/usePortfolios.ts` - Create `apps/frontend/src/entities/portfolio/model/usePortfolioAnalytics.ts` - Create `apps/frontend/src/entities/portfolio/model/usePortfolioMutations.ts` - Create `apps/frontend/src/entities/portfolio/model/usePositionMutations.ts` ### Shared cleanup - Modify `apps/frontend/src/shared/api/client.ts` — удалить 9 stock/bond API-функций - Modify `apps/frontend/src/shared/api/index.ts` — удалить re-exports stock/bond функций - Modify `apps/frontend/src/api/client.ts` — удалить re-exports stock/bond функций (shim) ### Consumer migration - Modify `apps/frontend/src/pages/StockPage.tsx` — переключить импорты на `../../entities/stock` - Modify `apps/frontend/src/pages/BondPage.tsx` — переключить импорты на `../../entities/bond` - Modify `apps/frontend/src/pages/portfolios/PortfolioDetailPage.tsx` — на `../../entities/portfolio` - Modify `apps/frontend/src/pages/portfolios/PortfoliosListPage.tsx` — на `../../entities/portfolio` ### Shim files (обратно-совместимые re-export) - Modify `apps/frontend/src/hooks/useStock.ts` → shim - Modify `apps/frontend/src/hooks/useStockCandles.ts` → shim - Modify `apps/frontend/src/hooks/useStockDividends.ts` → shim - Modify `apps/frontend/src/hooks/useBond.ts` → shim - Modify `apps/frontend/src/hooks/useBondCandles.ts` → shim - Modify `apps/frontend/src/hooks/usePortfolio.ts` → shim - Modify `apps/frontend/src/hooks/usePortfolios.ts` → shim - Modify `apps/frontend/src/hooks/usePortfolioAnalytics.ts` → shim - Modify `apps/frontend/src/hooks/usePortfolioMutations.ts` → shim - Modify `apps/frontend/src/hooks/usePositionMutations.ts` → shim - Modify `apps/frontend/src/api/portfolio.ts` → shim ### Test relocation - Move `apps/frontend/src/hooks/useStock.test.tsx` → `apps/frontend/src/entities/stock/model/useStock.test.tsx` - Move `apps/frontend/src/hooks/useStockCandles.test.tsx` → `apps/frontend/src/entities/stock/model/useStockCandles.test.tsx` - Move `apps/frontend/src/hooks/useStockDividends.test.tsx` → `apps/frontend/src/entities/stock/model/useStockDividends.test.tsx` - Move `apps/frontend/src/hooks/useBond.test.tsx` → `apps/frontend/src/entities/bond/model/useBond.test.tsx` - Move `apps/frontend/src/hooks/useBondCandles.test.tsx` → `apps/frontend/src/entities/bond/model/useBondCandles.test.tsx` --- ## Task 1: entities/stock/ ### Файлы - Create: `src/entities/stock/index.ts` - Create: `src/entities/stock/api/stockApi.ts` - Create: `src/entities/stock/model/useStock.ts` - Create: `src/entities/stock/model/useStockCandles.ts` - Create: `src/entities/stock/model/useStockDividends.ts` - Move: `src/hooks/useStock.test.tsx` → `src/entities/stock/model/useStock.test.tsx` - Move: `src/hooks/useStockCandles.test.tsx` → `src/entities/stock/model/useStockCandles.test.tsx` - Move: `src/hooks/useStockDividends.test.tsx` → `src/entities/stock/model/useStockDividends.test.tsx` ### Связанные изменения - Modify: `src/shared/api/client.ts` — удалить `getShare`, `getShareMarketData`, `getShareDividends`, `getShareHistory`, `getShareCandles` - Modify: `src/shared/api/index.ts` — удалить re-exports stock функций - Modify: `src/api/client.ts` — удалить re-exports stock функций - Modify: `src/hooks/useStock.ts` — заменить на shim - Modify: `src/hooks/useStockCandles.ts` — заменить на shim - Modify: `src/hooks/useStockDividends.ts` — заменить на shim - Modify: `src/pages/StockPage.tsx` — переключить импорты - [ ] **Step 1: Создать api/stockApi.ts с функциями запросов stock** - [ ] **Step 2: Создать model хуки для stock (useStock, useStockCandles, useStockDividends)** - [ ] **Step 3: Создать entities/stock/index.ts barrel** - [ ] **Step 4: Переместить тесты stock в model/ и обновить импорты** - [ ] **Step 5: Удалить stock функции из shared/api/client.ts и обновить barrely (shared/api/index.ts, api/client.ts)** - [ ] **Step 6: Превратить hooks/useStock* в shim-файлы** - [ ] **Step 7: Переключить StockPage.tsx на импорты из ../../entities/stock** - [ ] **Step 8: Запустить тесты: npm test -w apps/frontend -- useStock** - [ ] **Step 9: Закоммитить** ## Task 2: entities/bond/ ### Файлы - Create: `src/entities/bond/index.ts` - Create: `src/entities/bond/api/bondApi.ts` - Create: `src/entities/bond/model/useBond.ts` - Create: `src/entities/bond/model/useBondCandles.ts` - Move: `src/hooks/useBond.test.tsx` → `src/entities/bond/model/useBond.test.tsx` - Move: `src/hooks/useBondCandles.test.tsx` → `src/entities/bond/model/useBondCandles.test.tsx` ### Связанные изменения - Modify: `src/shared/api/client.ts` — удалить `getBond`, `getBondMarketData`, `getBondHistory`, `getBondCandles` - Modify: `src/shared/api/index.ts` — удалить re-exports bond функций - Modify: `src/api/client.ts` — удалить re-exports bond функций - Modify: `src/hooks/useBond.ts` — заменить на shim - Modify: `src/hooks/useBondCandles.ts` — заменить на shim - Modify: `src/pages/BondPage.tsx` — переключить импорты - [ ] **Step 1: Создать api/bondApi.ts с функциями запросов bond** - [ ] **Step 2: Создать model хуки для bond (useBond, useBondCandles)** - [ ] **Step 3: Создать entities/bond/index.ts barrel** - [ ] **Step 4: Переместить тесты bond в model/ и обновить импорты** - [ ] **Step 5: Удалить bond функции из shared/api/client.ts и обновить barrely** - [ ] **Step 6: Превратить hooks/useBond* в shim-файлы** - [ ] **Step 7: Переключить BondPage.tsx на импорты из ../../entities/bond** - [ ] **Step 8: Запустить тесты: npm test -w apps/frontend -- useBond** - [ ] **Step 9: Закоммитить** ## Task 3: entities/portfolio/ ### Файлы - Create: `src/entities/portfolio/index.ts` - Create: `src/entities/portfolio/api/portfolioApi.ts` - Create: `src/entities/portfolio/model/usePortfolio.ts` - Create: `src/entities/portfolio/model/usePortfolios.ts` - Create: `src/entities/portfolio/model/usePortfolioAnalytics.ts` - Create: `src/entities/portfolio/model/usePortfolioMutations.ts` - Create: `src/entities/portfolio/model/usePositionMutations.ts` ### Связанные изменения - Modify: `src/api/portfolio.ts` — заменить на shim (re-export из entities/portfolio/api/portfolioApi) - Modify: `src/hooks/usePortfolio.ts` — заменить на shim - Modify: `src/hooks/usePortfolios.ts` — заменить на shim - Modify: `src/hooks/usePortfolioAnalytics.ts` — заменить на shim - Modify: `src/hooks/usePortfolioMutations.ts` — заменить на shim - Modify: `src/hooks/usePositionMutations.ts` — заменить на shim - Modify: `src/pages/portfolios/PortfolioDetailPage.tsx` — переключить импорты - Modify: `src/pages/portfolios/PortfoliosListPage.tsx` — переключить импорты - [ ] **Step 1: Создать api/portfolioApi.ts — перенести все функции из api/portfolio.ts** - [ ] **Step 2: Создать model хуки для portfolio (5 файлов)** - [ ] **Step 3: Создать entities/portfolio/index.ts barrel** - [ ] **Step 4: Превратить api/portfolio.ts в shim** - [ ] **Step 5: Превратить hooks/usePortfolio* и usePositionMutations в shim-файлы** - [ ] **Step 6: Переключить PortfolioDetailPage.tsx и PortfoliosListPage.tsx на импорты из ../../entities/portfolio** - [ ] **Step 7: Запустить build: npm run build -w apps/frontend** - [ ] **Step 8: Закоммитить** ## Task 4: Финальная проверка - [ ] **Step 1: Полный прогон тестов: npm test -w apps/frontend** - [ ] **Step 2: Линт: npm run lint -w apps/frontend** - [ ] **Step 3: Сборка: npm run build -w apps/frontend** - [ ] **Step 4: Проверить git diff --stat на предмет только целевых изменений** - [ ] **Step 5: Обновить docs/features/fsd-entities-migration/tasks.md**