# 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 шимами - Экраны входа, регистрации и профиля работают как раньше - Страницы брокера (защищённые) работают как раньше