5.2 KiB
Raw Blame History

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.tsentities/session/api/sessionApi.test.ts
  • context/AuthContext.test.tsxapp/providers/SessionProvider.test.tsx
  • hooks/useAuth.test.tsxentities/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 шимами
  • Экраны входа, регистрации и профиля работают как раньше
  • Страницы брокера (защищённые) работают как раньше