179 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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**