179 lines
10 KiB
Markdown
179 lines
10 KiB
Markdown
# 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**
|