93 lines
5.2 KiB
Markdown
93 lines
5.2 KiB
Markdown
# Frontend FSD App + Auth
|
||
|
||
Дата: 2026-06-20
|
||
Статус: спецификация
|
||
|
||
## Концепт
|
||
|
||
Frontend проекта прошёл три итерации FSD-миграции: broker pilot, shared layer, entities migration.
|
||
Теперь существующие FSD-слои (entities, widgets, shared) не имеют соответствующей
|
||
инфраструктуры `app/` — корневого слоя приложения, в который выносятся entry point, routing,
|
||
провайдеры и layout. Параллельно auth-домен остаётся в legacy-структуре (`api/auth.ts`,
|
||
`context/AuthContext.tsx`, `hooks/useAuth.ts`), что не позволяет завершить вертикальный срез
|
||
auth/user session.
|
||
|
||
## Цель
|
||
|
||
Создать FSD-слой `app/` и мигрировать auth-домен в `entities/session/` и `app/providers/`,
|
||
завершив тем сквозной путь от корня приложения до domain entities через все FSD-слои.
|
||
|
||
## Область изменений
|
||
|
||
### Входит
|
||
|
||
- Создание `app/` layer: entry point (`App.tsx`), routing (`AppRoutes`, `ProtectedRoute`),
|
||
providers (`SessionProvider`, `AppProviders`), layout (`AppLayout`)
|
||
- Создание `entities/session/` для auth-домена: session API, session context, useSession hook
|
||
- Перенос тестов вслед за кодом
|
||
- Превращение исходных legacy-файлов в re-export shims
|
||
- Обновление импортов в auth-страницах
|
||
|
||
### Не входит
|
||
|
||
- Миграция `api/screener.ts`, `hooks/useScreener.ts`, `components/screener/*` — следующий этап
|
||
- Миграция `api/broker.ts`, `api/broker.test.ts` — dead code, удаление в отдельной задаче
|
||
- Миграция `components/SearchBar.tsx`, `hooks/useSearch.ts` — следующий этап
|
||
- Миграция `components/portfolios/*`, `pages/portfolios/*` — следующий этап
|
||
- Миграция `pages/StockPage.tsx`, `pages/BondPage.tsx`, `pages/HomePage.tsx` — следующий этап
|
||
- Изменение backend-контрактов, Swagger, CI/CD
|
||
- Введение import guards или ESLint boundaries
|
||
|
||
## Требования
|
||
|
||
### 1. App-слой приложения
|
||
|
||
- `app/App.tsx` — entry point: BrowserRouter + AppRoutes, без провайдеров
|
||
- `app/routing/AppRoutes.tsx` — все route definitions (аналог текущего `routes.tsx`)
|
||
- `app/routing/ProtectedRoute.tsx` — guard для аутентифицированных маршрутов
|
||
- `app/layouts/AppLayout.tsx` — корневой layout (header, навигация, outlet)
|
||
- `app/providers/AppProviders.tsx` — композиция корневых провайдеров: QueryClientProvider + SessionProvider
|
||
- `app/providers/SessionProvider.tsx` — провайдер сессии (управление жизненным циклом auth)
|
||
- `main.tsx` — использует AppProviders вместо ручной композиции
|
||
|
||
### 2. Session-слой
|
||
|
||
- `entities/session/api/sessionApi.ts` — чистые функции запросов
|
||
(login, register, refresh, logout, getMe, updateProfile) через shared/api/client
|
||
- `entities/session/model/sessionContext.ts` — SessionContext + SessionContextValue
|
||
- `entities/session/model/useSession.ts` — хук доступа к контексту
|
||
- `entities/session/index.ts` — barrel export
|
||
|
||
### 3. Coexistence через shims
|
||
|
||
Все старые файлы становятся re-export шимами:
|
||
|
||
- `api/auth.ts` → shim для entities/session/api/sessionApi
|
||
- `hooks/useAuth.ts` → shim для entities/session/model/useSession
|
||
- `context/AuthContext.tsx` → shim для app/providers/SessionProvider + entities/session/model/sessionContext
|
||
- `routes.tsx` → shim для app/routing/AppRoutes
|
||
- `App.tsx` → shim для app/App
|
||
- `components/Layout.tsx` → shim для app/layouts/AppLayout
|
||
- `components/ProtectedRoute.tsx` → shim для app/routing/ProtectedRoute
|
||
|
||
### 4. Тесты следуют за кодом
|
||
|
||
- `api/auth.test.ts` → `entities/session/api/sessionApi.test.ts`
|
||
- `context/AuthContext.test.tsx` → `app/providers/SessionProvider.test.tsx`
|
||
- `hooks/useAuth.test.tsx` → `entities/session/model/useSession.test.tsx`
|
||
|
||
### 5. Поведение не меняется
|
||
|
||
Никакой функциональности не добавляется и не изменяется. Только перегруппировка кода.
|
||
|
||
## Acceptance Criteria
|
||
|
||
- `app/App.tsx`, `app/providers/`, `app/routing/`, `app/layouts/` существуют с указанной структурой
|
||
- `entities/session/` существует с api/model/index.ts
|
||
- Все тесты проходят (`npm test -w apps/frontend`)
|
||
- Lint проходит (`npm run lint -w apps/frontend`)
|
||
- Build проходит (`npm run build -w apps/frontend`)
|
||
- Все legacy файлы стали re-export шимами
|
||
- Экраны входа, регистрации и профиля работают как раньше
|
||
- Страницы брокера (защищённые) работают как раньше
|