10 KiB
Raw Permalink Blame History

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.tsxapps/frontend/src/entities/stock/model/useStock.test.tsx
  • Move apps/frontend/src/hooks/useStockCandles.test.tsxapps/frontend/src/entities/stock/model/useStockCandles.test.tsx
  • Move apps/frontend/src/hooks/useStockDividends.test.tsxapps/frontend/src/entities/stock/model/useStockDividends.test.tsx
  • Move apps/frontend/src/hooks/useBond.test.tsxapps/frontend/src/entities/bond/model/useBond.test.tsx
  • Move apps/frontend/src/hooks/useBondCandles.test.tsxapps/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.tsxsrc/entities/stock/model/useStock.test.tsx
  • Move: src/hooks/useStockCandles.test.tsxsrc/entities/stock/model/useStockCandles.test.tsx
  • Move: src/hooks/useStockDividends.test.tsxsrc/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.tsxsrc/entities/bond/model/useBond.test.tsx
  • Move: src/hooks/useBondCandles.test.tsxsrc/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