10 KiB
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