feat: migrate from useAuth to AuthContext for centralized auth state
• Полная миграция 64 компонентов с useAuth на AuthContext • Исправлена race condition в SMS регистрации • Улучшена SSR совместимость с таймаутами • Удалена дублирующая система регистрации • Обновлена документация архитектуры аутентификации Технические изменения: - AuthContext.tsx: централизованная система состояния - auth-flow.tsx: убрана агрессивная логика logout - confirmation-step.tsx: исправлена передача телефона - page.tsx: добавлена синхронизация состояния - 64 файла: миграция useAuth → useAuthContext 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
294
2025-09-18/ROUTING_ARCHITECTURE_FIX_PLAN.md
Normal file
294
2025-09-18/ROUTING_ARCHITECTURE_FIX_PLAN.md
Normal file
@ -0,0 +1,294 @@
|
||||
# 🎯 ПЛАН ИСПРАВЛЕНИЯ АРХИТЕКТУРЫ РОУТИНГА SFERA
|
||||
|
||||
> **Цель:** Исправить критическую ошибку архитектуры где регистрация происходит на `/dashboard`
|
||||
|
||||
---
|
||||
|
||||
## 🚨 ТЕКУЩАЯ ПРОБЛЕМА
|
||||
|
||||
### ❌ Что не работает:
|
||||
- **Регистрация идет на `/dashboard`** - семантически неправильно
|
||||
- **AuthGuard создает второй AuthFlow** на dashboard при незавершенной регистрации
|
||||
- **Логическое противоречие:** dashboard = для авторизованных, но используется для регистрации
|
||||
- **Пользователь запутывается** в flow регистрации
|
||||
|
||||
### 🔍 Корневая причина:
|
||||
```
|
||||
SMS верификация → токен есть → isAuthenticated: true
|
||||
AuthContext → user: {...} НО user.organization: null
|
||||
AuthGuard → видит "незавершенная регистрация" → создает НОВЫЙ AuthFlow
|
||||
Результат → сброс на step: "phone" вместо продолжения регистрации
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 ЦЕЛЕВАЯ АРХИТЕКТУРА
|
||||
|
||||
### ✅ Правильная структура URL:
|
||||
|
||||
| URL | Назначение | Пользователи | Компонент |
|
||||
|-----|------------|--------------|-----------|
|
||||
| `/` | Корневая страница (роутер) | Все | `app/page.tsx` - логика перенаправления |
|
||||
| `/login` | Вход в систему | Неавторизованные | `AuthFlow` без параметров |
|
||||
| `/register` | Регистрация | Неавторизованные + незавершенная регистрация | `AuthFlow` с поддержкой кодов |
|
||||
| `/dashboard` | Панель управления | ✅ Авторизованные с организацией | `DashboardHome` через `AuthGuard` |
|
||||
|
||||
### 🔄 Логика перенаправлений:
|
||||
|
||||
```typescript
|
||||
// app/page.tsx
|
||||
if (isLoading) return <Loading />
|
||||
|
||||
if (user?.organization) {
|
||||
// Полностью авторизован → в dashboard
|
||||
router.replace('/dashboard')
|
||||
} else if (user && !user.organization) {
|
||||
// Незавершенная регистрация → продолжить на /register
|
||||
router.replace('/register')
|
||||
} else {
|
||||
// Не авторизован → на /login
|
||||
router.replace('/login')
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 ДЕТАЛЬНЫЙ ПЛАН РЕАЛИЗАЦИИ
|
||||
|
||||
### **PHASE 1: ПОДГОТОВКА И АНАЛИЗ**
|
||||
|
||||
#### 1.1 Анализ текущих страниц авторизации
|
||||
```bash
|
||||
# Проверить содержимое:
|
||||
- src/app/login/page.tsx
|
||||
- src/app/register/page.tsx
|
||||
- src/app/dashboard/page.tsx
|
||||
- src/components/auth-guard.tsx
|
||||
```
|
||||
|
||||
#### 1.2 Анализ AuthFlow размещения
|
||||
- Где сейчас рендерится AuthFlow
|
||||
- Какие параметры принимает
|
||||
- Как обрабатывает незавершенную регистрацию
|
||||
|
||||
#### 1.3 Проверка всех redirect/router.replace
|
||||
```bash
|
||||
# Найти все места перенаправлений
|
||||
grep -r "router.replace\|redirect" src/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **PHASE 2: СОЗДАНИЕ НОВОЙ АРХИТЕКТУРЫ**
|
||||
|
||||
#### 2.1 Исправить app/page.tsx (корневой роутер)
|
||||
**БЫЛО:**
|
||||
```typescript
|
||||
if (user) {
|
||||
router.replace('/dashboard') // Неправильно!
|
||||
} else {
|
||||
router.replace('/login')
|
||||
}
|
||||
```
|
||||
|
||||
**БУДЕТ:**
|
||||
```typescript
|
||||
if (isLoading) return <LoadingSpinner />
|
||||
|
||||
if (user?.organization) {
|
||||
// Пользователь полностью зарегистрирован
|
||||
router.replace('/dashboard')
|
||||
} else if (user && !user.organization) {
|
||||
// Пользователь авторизован, но регистрация не завершена
|
||||
router.replace('/register')
|
||||
} else {
|
||||
// Пользователь не авторизован
|
||||
router.replace('/login')
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2 Исправить /dashboard/page.tsx
|
||||
**БЫЛО:**
|
||||
```typescript
|
||||
<AuthGuard> {/* Показывает AuthFlow при незавершенной регистрации */}
|
||||
<DashboardHome />
|
||||
</AuthGuard>
|
||||
```
|
||||
|
||||
**БУДЕТ:**
|
||||
```typescript
|
||||
<AuthGuard fallback={<RedirectToRegister />}>
|
||||
<DashboardHome />
|
||||
</AuthGuard>
|
||||
```
|
||||
|
||||
#### 2.3 Обновить /register/page.tsx
|
||||
**Должен обрабатывать:**
|
||||
- Новую регистрацию (нет токена)
|
||||
- Незавершенную регистрацию (есть токен, нет организации)
|
||||
- Параметры партнерских/реферальных кодов
|
||||
|
||||
#### 2.4 Обновить /login/page.tsx
|
||||
**Только для входа** (без регистрации)
|
||||
|
||||
---
|
||||
|
||||
### **PHASE 3: ОБНОВЛЕНИЕ КОМПОНЕНТОВ**
|
||||
|
||||
#### 3.1 Создать RedirectToRegister компонент
|
||||
```typescript
|
||||
// components/auth/redirect-to-register.tsx
|
||||
export function RedirectToRegister() {
|
||||
const router = useRouter()
|
||||
|
||||
useEffect(() => {
|
||||
router.replace('/register')
|
||||
}, [])
|
||||
|
||||
return <div>Перенаправление на регистрацию...</div>
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2 Обновить AuthGuard логику
|
||||
- НЕ показывать AuthFlow на /dashboard
|
||||
- Перенаправлять на /register при незавершенной регистрации
|
||||
- Добавить проверку pathname
|
||||
|
||||
#### 3.3 Обновить AuthFlow состояния
|
||||
- Правильно обрабатывать состояние при незавершенной регистрации
|
||||
- Убрать конфликты между экземплярами AuthFlow
|
||||
|
||||
---
|
||||
|
||||
### **PHASE 4: ИСПРАВЛЕНИЕ AUTH-FLOW**
|
||||
|
||||
#### 4.1 Убрать window.location.href
|
||||
**БЫЛО:**
|
||||
```typescript
|
||||
window.location.href = '/dashboard'
|
||||
```
|
||||
|
||||
**БУДЕТ:**
|
||||
```typescript
|
||||
router.push('/dashboard')
|
||||
```
|
||||
|
||||
#### 4.2 Исправить логику завершения регистрации
|
||||
- После создания организации → redirect на `/dashboard`
|
||||
- При ошибке → остаться на `/register`
|
||||
|
||||
#### 4.3 Обновить логику инициализации AuthFlow
|
||||
- Определять текущий шаг на основе состояния пользователя
|
||||
- Учитывать что пользователь может попасть на /register с токеном
|
||||
|
||||
---
|
||||
|
||||
## 🧪 ПЛАН ТЕСТИРОВАНИЯ
|
||||
|
||||
### **TEST CASE 1: Новый пользователь**
|
||||
```
|
||||
1. Открыть / → перенаправление на /login
|
||||
2. Ввести телефон → SMS step
|
||||
3. Ввести SMS → cabinet-select step
|
||||
4. Выбрать тип → inn/api step
|
||||
5. Завершить → /dashboard
|
||||
```
|
||||
|
||||
### **TEST CASE 2: Незавершенная регистрация**
|
||||
```
|
||||
1. Пользователь с токеном без организации
|
||||
2. Открыть / → перенаправление на /register
|
||||
3. AuthFlow определяет нужный шаг
|
||||
4. Продолжить с правильного места
|
||||
5. Завершить → /dashboard
|
||||
```
|
||||
|
||||
### **TEST CASE 3: Авторизованный пользователь**
|
||||
```
|
||||
1. Пользователь с токеном и организацией
|
||||
2. Открыть / → перенаправление на /dashboard
|
||||
3. Открыть /register → перенаправление на /dashboard
|
||||
4. Открыть /login → перенаправление на /dashboard
|
||||
```
|
||||
|
||||
### **TEST CASE 4: Партнерские коды**
|
||||
```
|
||||
1. Открыть /register?partner=FF_123_456
|
||||
2. AuthFlow получает partnerCode
|
||||
3. Проходит регистрацию с партнерским кодом
|
||||
4. Завершить → /dashboard
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ КРИТИЧЕСКИЕ МОМЕНТЫ
|
||||
|
||||
### 🔒 Безопасность:
|
||||
- `/dashboard` должен быть доступен ТОЛЬКО авторизованным с организацией
|
||||
- AuthGuard НЕ должен показывать формы регистрации на защищенных страницах
|
||||
- Проверить все места где используется AuthGuard
|
||||
|
||||
### 🔄 Обратная совместимость:
|
||||
- Существующие ссылки на `/dashboard` должны работать
|
||||
- Незавершенные регистрации не должны ломаться
|
||||
- SMS коды и токены должны продолжать работать
|
||||
|
||||
### 📱 UX:
|
||||
- Пользователь не должен видеть мерцания и перезагрузки
|
||||
- Четкие состояния загрузки
|
||||
- Понятные сообщения об ошибках
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ ФАЙЛЫ ДЛЯ ИЗМЕНЕНИЯ
|
||||
|
||||
### Обязательные изменения:
|
||||
- `src/app/page.tsx` - корневая логика роутинга
|
||||
- `src/app/dashboard/page.tsx` - убрать AuthFlow fallback
|
||||
- `src/app/register/page.tsx` - обработка незавершенной регистрации
|
||||
- `src/app/login/page.tsx` - только для входа
|
||||
- `src/components/auth-guard.tsx` - новая логика перенаправлений
|
||||
- `src/components/auth/auth-flow.tsx` - убрать window.location.href
|
||||
|
||||
### Новые компоненты:
|
||||
- `src/components/auth/redirect-to-register.tsx` - компонент перенаправления
|
||||
|
||||
### Тестирование:
|
||||
- Все flow регистрации
|
||||
- Все типы пользователей
|
||||
- Партнерские и реферальные коды
|
||||
|
||||
---
|
||||
|
||||
## 📊 КРИТЕРИИ УСПЕХА
|
||||
|
||||
✅ **Функциональные:**
|
||||
- Новая регистрация проходит полностью
|
||||
- Незавершенная регистрация продолжается с нужного шага
|
||||
- Авторизованные пользователи попадают в dashboard
|
||||
- Партнерские коды работают
|
||||
|
||||
✅ **Технические:**
|
||||
- Нет создания второго AuthFlow
|
||||
- Нет бесконечных перенаправлений
|
||||
- ESLint и TypeScript без ошибок
|
||||
- Приложение собирается
|
||||
|
||||
✅ **UX:**
|
||||
- Логичные URL для пользователей
|
||||
- Никаких неожиданных сбросов формы
|
||||
- Плавные переходы между шагами
|
||||
|
||||
---
|
||||
|
||||
## 🚀 ГОТОВНОСТЬ К РЕАЛИЗАЦИИ
|
||||
|
||||
План детально проработан. Готов к пошаговой реализации:
|
||||
|
||||
1. ✅ Анализ проблемы завершен
|
||||
2. ✅ Архитектура спроектирована
|
||||
3. ✅ План реализации детализирован
|
||||
4. ✅ Тест-кейсы подготовлены
|
||||
5. ✅ Критерии успеха определены
|
||||
|
||||
**Следующий шаг:** Начать PHASE 1 - Подготовка и анализ
|
250
2025-09-18/SMS_REGISTRATION_DEBUG_PLAN.md
Normal file
250
2025-09-18/SMS_REGISTRATION_DEBUG_PLAN.md
Normal file
@ -0,0 +1,250 @@
|
||||
# 🔍 ПЛАН ИСПРАВЛЕНИЯ SMS РЕГИСТРАЦИИ - ДЕТАЛЬНЫЙ АНАЛИЗ ПРОБЛЕМЫ
|
||||
|
||||
> **Дата:** 2025-09-18
|
||||
> **Проблема:** После SMS верификации пользователь перебрасывается на `/` вместо продолжения регистрации
|
||||
|
||||
---
|
||||
|
||||
## 🚨 ОПИСАНИЕ ПРОБЛЕМЫ
|
||||
|
||||
### 📱 Что должно происходить (правильная логика SFERA):
|
||||
|
||||
**ЕДИНЫЙ FLOW авторизации/регистрации:**
|
||||
1. Пользователь вводит номер телефона → SMS отправляется
|
||||
2. Пользователь вводит SMS код → код верифицируется
|
||||
3. **Определяется сценарий:**
|
||||
- **СЦЕНАРИЙ A:** Пользователь существует + есть организация → **Dashboard**
|
||||
- **СЦЕНАРИЙ B:** Пользователь существует + НЕТ организации → **Cabinet-select** (выбор типа кабинета)
|
||||
- **СЦЕНАРИЙ C:** Новый пользователь → **Cabinet-select** (выбор типа кабинета)
|
||||
|
||||
### ❌ Что происходит сейчас (баг):
|
||||
|
||||
```
|
||||
1. Пользователь вводит телефон → ✅ SMS отправляется
|
||||
2. Пользователь вводит SMS код → ✅ код верифицируется успешно
|
||||
3. ❌ Пользователь перебрасывается на главную страницу `/`
|
||||
4. ❌ AuthFlow сбрасывается на step: "phone"
|
||||
5. ❌ Пользователь вынужден начинать регистрацию заново
|
||||
```
|
||||
|
||||
### 🔍 Логи ошибки:
|
||||
|
||||
```javascript
|
||||
// SMS verification прошла успешно:
|
||||
🌐 GraphQL REQUEST: { operationName: 'VerifySmsCode', variables: { phone: '76657584949', code: '1234' } }
|
||||
POST /api/graphql 200 in 1295ms
|
||||
|
||||
// Но после этого:
|
||||
AppShell state: { pathname: '/', isAuthenticated: false, hasUser: false }
|
||||
🎢 AuthFlow - useEffect triggered with: { isAuthenticated: false, hasUser: false, currentStep: "phone" }
|
||||
🎢 AuthFlow - User not authenticated, setting step to phone
|
||||
```
|
||||
|
||||
**КЛЮЧЕВАЯ ПРОБЛЕМА:** `isAuthenticated: false` после успешной SMS верификации!
|
||||
|
||||
---
|
||||
|
||||
## 🔍 КОРНЕВАЯ ПРИЧИНА
|
||||
|
||||
### 🎯 Диагноз:
|
||||
|
||||
**AuthContext не обновляется после SMS верификации**, поэтому:
|
||||
1. SMS верификация успешна → токен сохраняется в localStorage
|
||||
2. НО AuthContext остается `isAuthenticated: false, user: null`
|
||||
3. app/page.tsx видит неавторизованного пользователя → redirect на `/login`
|
||||
4. AuthFlow инициализируется заново → step: "phone"
|
||||
|
||||
### 🔧 Предполагаемые причины:
|
||||
|
||||
**1. Timing issue в AuthContext:**
|
||||
- SMS-step сохраняет токен через `verifySmsCode()`
|
||||
- AuthContext не успевает обновить состояние
|
||||
- useEffect в AuthFlow срабатывает с устаревшими данными
|
||||
|
||||
**2. Конфликт между экземплярами AuthFlow:**
|
||||
- AuthGuard на `/dashboard` может создавать второй AuthFlow
|
||||
- Два AuthFlow конфликтуют между собой
|
||||
|
||||
**3. Проблема в app/page.tsx:**
|
||||
- Слишком быстро перенаправляет до обновления AuthContext
|
||||
- Не учитывает `isLoading` состояние
|
||||
|
||||
---
|
||||
|
||||
## 📋 ПЛАН ИСПРАВЛЕНИЯ
|
||||
|
||||
### **PHASE 1: ДИАГНОСТИКА И ЛОГИРОВАНИЕ**
|
||||
|
||||
#### 1.1 Добавить детальное логирование в AuthContext
|
||||
```typescript
|
||||
// В verifySmsCode после успешной верификации:
|
||||
console.warn('🔑 AuthContext - BEFORE setState:', {
|
||||
isAuthenticated: this.isAuthenticated,
|
||||
hasUser: !!this.user
|
||||
})
|
||||
|
||||
setUser(result.user)
|
||||
setIsAuthenticated(true)
|
||||
|
||||
console.warn('🔑 AuthContext - AFTER setState:', {
|
||||
isAuthenticated: true,
|
||||
hasUser: !!result.user,
|
||||
userOrganization: result.user.organization
|
||||
})
|
||||
```
|
||||
|
||||
#### 1.2 Добавить логирование в AuthFlow useEffect
|
||||
```typescript
|
||||
useEffect(() => {
|
||||
console.warn('🎢 AuthFlow - useEffect DETAILED:', {
|
||||
isAuthenticated,
|
||||
hasUser: !!user,
|
||||
hasOrganization: !!user?.organization,
|
||||
userFromContext: user,
|
||||
currentStep: step,
|
||||
timestamp: new Date().toISOString()
|
||||
})
|
||||
|
||||
// Существующая логика...
|
||||
}, [isAuthenticated, user])
|
||||
```
|
||||
|
||||
#### 1.3 Добавить логирование в app/page.tsx
|
||||
```typescript
|
||||
useEffect(() => {
|
||||
console.warn('📍 app/page.tsx - routing decision:', {
|
||||
isLoading,
|
||||
hasUser: !!user,
|
||||
hasOrganization: !!user?.organization,
|
||||
currentPath: window.location.pathname
|
||||
})
|
||||
|
||||
// Существующая логика...
|
||||
}, [router, user, isLoading])
|
||||
```
|
||||
|
||||
### **PHASE 2: ИСПРАВЛЕНИЕ TIMING ISSUES**
|
||||
|
||||
#### 2.1 Исправить AuthContext - добавить промисы
|
||||
```typescript
|
||||
const verifySmsCode = async (phone: string, code: string) => {
|
||||
// ... существующий код ...
|
||||
|
||||
if (result.success && result.token && result.user) {
|
||||
setAuthToken(result.token)
|
||||
setUserData(result.user)
|
||||
|
||||
// Синхронно обновляем состояние
|
||||
setUser(result.user)
|
||||
setIsAuthenticated(true)
|
||||
|
||||
// ЖДЕМ обновления Apollo Client
|
||||
await refreshApolloClient()
|
||||
|
||||
// Возвращаем промис когда все готово
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve({ success: true, message: result.message, user: result.user })
|
||||
}, 100) // Небольшая задержка для обновления состояния
|
||||
})
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2 Добавить isLoading в app/page.tsx
|
||||
```typescript
|
||||
const { user, isLoading, isAuthenticated } = useAuthContext()
|
||||
|
||||
useEffect(() => {
|
||||
// КРИТИЧНО: ждем завершения всех проверок
|
||||
if (isLoading) {
|
||||
console.warn('📍 app/page.tsx - still loading, waiting...')
|
||||
return
|
||||
}
|
||||
|
||||
// Только после isLoading: false делаем redirect
|
||||
if (user?.organization) {
|
||||
router.replace('/dashboard')
|
||||
} else if (isAuthenticated) {
|
||||
router.replace('/login') // Продолжить на странице регистрации
|
||||
} else {
|
||||
router.replace('/login')
|
||||
}
|
||||
}, [router, user, isLoading, isAuthenticated])
|
||||
```
|
||||
|
||||
### **PHASE 3: УСТРАНЕНИЕ КОНФЛИКТОВ**
|
||||
|
||||
#### 3.1 Исправить AuthGuard
|
||||
```typescript
|
||||
// НЕ создавать новый AuthFlow на dashboard
|
||||
if (!isAuthenticated || (isAuthenticated && user && !user.organization)) {
|
||||
// Перенаправить вместо показа AuthFlow
|
||||
const router = useRouter()
|
||||
useEffect(() => {
|
||||
router.replace('/login')
|
||||
}, [])
|
||||
return <div>Перенаправление...</div>
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2 Убрать window.location.href из AuthFlow
|
||||
```typescript
|
||||
// ЗАМЕНИТЬ:
|
||||
window.location.href = '/dashboard'
|
||||
|
||||
// НА:
|
||||
router.push('/dashboard')
|
||||
```
|
||||
|
||||
### **PHASE 4: ТЕСТИРОВАНИЕ**
|
||||
|
||||
#### 4.1 Тест-сценарии:
|
||||
1. **Новый пользователь:** phone → sms → cabinet-select → inn/api → complete → dashboard
|
||||
2. **Существующий без организации:** phone → sms → cabinet-select → inn/api → complete → dashboard
|
||||
3. **Существующий с организацией:** phone → sms → dashboard
|
||||
4. **Партнерские коды:** все сценарии с параметрами
|
||||
|
||||
#### 4.2 Проверки:
|
||||
- ✅ Нет перебросов на `/`
|
||||
- ✅ AuthFlow не сбрасывается на phone
|
||||
- ✅ Состояние AuthContext корректное
|
||||
- ✅ Нет создания второго AuthFlow
|
||||
|
||||
---
|
||||
|
||||
## 🎯 ОЖИДАЕМЫЙ РЕЗУЛЬТАТ
|
||||
|
||||
### ✅ После исправления:
|
||||
|
||||
```
|
||||
1. Пользователь вводит телефон → SMS отправляется
|
||||
2. Пользователь вводит SMS код → код верифицируется
|
||||
3. AuthContext обновляется → isAuthenticated: true, user: {...}
|
||||
4. AuthFlow определяет сценарий:
|
||||
- СЦЕНАРИЙ A: user.organization есть → step: 'complete' → dashboard
|
||||
- СЦЕНАРИЙ B/C: user.organization нет → step: 'cabinet-select'
|
||||
5. Пользователь продолжает регистрацию БЕЗ сброса
|
||||
```
|
||||
|
||||
### 📊 Логи после исправления:
|
||||
|
||||
```javascript
|
||||
🔑 AuthContext - SMS verification successful
|
||||
🔑 AuthContext - State updated: isAuthenticated=true, user=...
|
||||
🎢 AuthFlow - useEffect: { isAuthenticated: true, hasUser: true, hasOrganization: false }
|
||||
🎢 AuthFlow - Setting step to cabinet-select
|
||||
✅ Пользователь видит страницу выбора типа кабинета
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 ГОТОВНОСТЬ К РЕАЛИЗАЦИИ
|
||||
|
||||
**✅ Проблема диагностирована:** Timing issue в AuthContext + конфликт AuthFlow экземпляров
|
||||
|
||||
**✅ План пошаговый:** 4 фазы с детальным логированием и тестированием
|
||||
|
||||
**✅ Минимальные изменения:** Фокус на исправлении, а не переписывании архитектуры
|
||||
|
||||
**🎯 Следующий шаг:** Начать PHASE 1 - добавить детальное логирование для подтверждения диагноза
|
907
2025-09-18/USEAUTH_TO_AUTHCONTEXT_MIGRATION_PLAN.md
Normal file
907
2025-09-18/USEAUTH_TO_AUTHCONTEXT_MIGRATION_PLAN.md
Normal file
@ -0,0 +1,907 @@
|
||||
# 🚨 ПЛАН БЕЗОПАСНОЙ МИГРАЦИИ: useAuth → AuthContext
|
||||
|
||||
**Проект:** SFERA
|
||||
**Дата:** 18.09.2025
|
||||
**Критичность:** ВЫСОКАЯ
|
||||
**Статус:** ЭКСТРЕННАЯ МИГРАЦИЯ
|
||||
|
||||
---
|
||||
|
||||
## 📊 ТЕКУЩАЯ СИТУАЦИЯ
|
||||
|
||||
### ✅ МИГРИРОВАНО (8 компонентов):
|
||||
- `/src/components/layout/app-shell.tsx`
|
||||
- `/src/components/dashboard/sidebar/index.tsx`
|
||||
- `/src/components/dashboard/sidebar/SellerSidebar.tsx`
|
||||
- `/src/components/dashboard/sidebar/FulfillmentSidebar.tsx`
|
||||
- `/src/components/dashboard/sidebar/LogistSidebar.tsx`
|
||||
- `/src/components/dashboard/sidebar/WholesaleSidebar.tsx`
|
||||
- `/src/components/auth-guard.tsx`
|
||||
- `/src/components/seller-statistics/seller-statistics-dashboard.tsx`
|
||||
|
||||
### ❌ ТРЕБУЕТ МИГРАЦИИ (56 компонентов):
|
||||
**🔴 КРИТИЧЕСКИЕ УГРОЗЫ:** 8 компонентов
|
||||
**⚠️ ВЫСОКИЙ РИСК:** 15 компонентов
|
||||
**📋 СРЕДНИЙ РИСК:** 20 компонентов
|
||||
**🟢 НИЗКИЙ РИСК:** 13 компонентов
|
||||
|
||||
---
|
||||
|
||||
## 🚨 КРИТИЧЕСКИЕ УЯЗВИМОСТИ
|
||||
|
||||
### 1. **SECURITY HOLE** - Обход авторизации ролей
|
||||
**Компонент:** `useRoleGuard.ts` (используется на 49 страницах)
|
||||
**Проблема:** Селлеры могут получить доступ к данным фулфилмента
|
||||
**Бизнес-риск:** Нарушение конфиденциальности клиентских данных
|
||||
|
||||
### 2. **INFINITE LOOPS** - Бесконечные циклы регистрации
|
||||
**Компонент:** `auth-flow.tsx`
|
||||
**Проблема:** `window.location.reload()` при рассинхроне состояний
|
||||
**Бизнес-риск:** Потеря новых клиентов, невозможность регистрации
|
||||
|
||||
### 3. **PROFILE CORRUPTION** - Коррупция пользовательских данных
|
||||
**Компонент:** `user-settings.tsx`
|
||||
**Проблема:** Обновления не отражаются в интерфейсе
|
||||
**Бизнес-риск:** Пользователи думают что система не работает
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ СТРАТЕГИЯ БЕЗОПАСНОЙ МИГРАЦИИ
|
||||
|
||||
### 🎯 ПРИНЦИПЫ:
|
||||
1. **Rollback First** - каждое изменение должно иметь план отката
|
||||
2. **Test Everything** - тестирование на каждом этапе
|
||||
3. **Monitor Always** - мониторинг состояния на каждом шаге
|
||||
4. **Backup Critical** - резервные копии критических компонентов
|
||||
5. **Incremental Progress** - поэтапная миграция с проверками
|
||||
|
||||
### 📋 CHECKPOINT SYSTEM:
|
||||
- **Checkpoint Alpha** - после каждого критического компонента
|
||||
- **Checkpoint Beta** - после группы высокого риска
|
||||
- **Checkpoint Gamma** - после средней группы
|
||||
- **Checkpoint Final** - полное тестирование
|
||||
|
||||
---
|
||||
|
||||
## 🔥 ФАЗА 1: ЭКСТРЕННАЯ МИГРАЦИЯ (24 часа)
|
||||
|
||||
### ⚡ ЭТАП 1.1: КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ (2 часа)
|
||||
|
||||
#### 🎯 **ЦЕЛЬ:** Устранить security hole и routing issues
|
||||
|
||||
**1.1.1 useRoleGuard.ts** - КРИТИЧНО (15 минут)
|
||||
```bash
|
||||
# Backup
|
||||
cp src/hooks/useRoleGuard.ts src/hooks/useRoleGuard.ts.backup
|
||||
|
||||
# Rollback plan
|
||||
git stash push -m "useRoleGuard migration rollback point"
|
||||
```
|
||||
|
||||
**Изменения:**
|
||||
```typescript
|
||||
// BEFORE
|
||||
import { useAuth } from '@/hooks/useAuth'
|
||||
const { user } = useAuth()
|
||||
|
||||
// AFTER
|
||||
import { useAuthContext } from '@/contexts/AuthContext'
|
||||
const { user } = useAuthContext()
|
||||
```
|
||||
|
||||
**Тестирование:**
|
||||
- [ ] Селлер не может зайти в /fulfillment/*
|
||||
- [ ] Фулфилмент не может зайти в /seller/*
|
||||
- [ ] Логист не может зайти в /wholesale/*
|
||||
- [ ] Правильные редиректы на home страницы
|
||||
|
||||
**Rollback условия:** Если любой из тестов провален
|
||||
|
||||
---
|
||||
|
||||
**1.1.2 app/page.tsx** - КРИТИЧНО (10 минут)
|
||||
|
||||
**Изменения:**
|
||||
```typescript
|
||||
// BEFORE
|
||||
import { useAuth } from '@/hooks/useAuth'
|
||||
const { user } = useAuth()
|
||||
|
||||
// AFTER
|
||||
import { useAuthContext } from '@/contexts/AuthContext'
|
||||
const { user } = useAuthContext()
|
||||
```
|
||||
|
||||
**Тестирование:**
|
||||
- [ ] Неавторизованные пользователи видят landing
|
||||
- [ ] Авторизованные перенаправляются в dashboard
|
||||
- [ ] Нет infinite redirects
|
||||
|
||||
---
|
||||
|
||||
### ⚡ ЭТАП 1.2: АУТЕНТИФИКАЦИЯ (4 часа)
|
||||
|
||||
#### 🎯 **ЦЕЛЬ:** Исправить flow регистрации и SMS
|
||||
|
||||
**1.2.1 auth-flow.tsx** - КРИТИЧНО (45 минут)
|
||||
|
||||
**Backup и Rollback Plan:**
|
||||
```bash
|
||||
cp src/components/auth/auth-flow.tsx src/components/auth/auth-flow.tsx.backup
|
||||
git stash push -m "auth-flow migration rollback point"
|
||||
```
|
||||
|
||||
**Изменения:**
|
||||
```typescript
|
||||
// ОПАСНЫЙ КОД (УДАЛИТЬ):
|
||||
if (isAuthenticated && user && !user.organization) {
|
||||
localStorage.removeItem('authToken')
|
||||
window.location.reload() // 🚨 CAUSES INFINITE LOOPS
|
||||
}
|
||||
|
||||
// БЕЗОПАСНЫЙ КОД:
|
||||
if (isAuthenticated && user && !user.organization) {
|
||||
logout() // Use AuthContext logout method
|
||||
}
|
||||
```
|
||||
|
||||
**Детальная замена:**
|
||||
```typescript
|
||||
// BEFORE
|
||||
import { useAuth } from '@/hooks/useAuth'
|
||||
const { isAuthenticated, user } = useAuth()
|
||||
|
||||
// AFTER
|
||||
import { useAuthContext } from '@/contexts/AuthContext'
|
||||
const { isAuthenticated, user, logout } = useAuthContext()
|
||||
```
|
||||
|
||||
**Критическое тестирование:**
|
||||
- [ ] Новая регистрация работает без циклов
|
||||
- [ ] Существующие пользователи без организации проходят регистрацию
|
||||
- [ ] Полные пользователи перенаправляются в dashboard
|
||||
- [ ] НЕТ `window.location.reload()` в консоли браузера
|
||||
|
||||
---
|
||||
|
||||
**1.2.2 sms-step.tsx** - ВЫСОКИЙ РИСК (30 минут)
|
||||
|
||||
**Изменения:**
|
||||
```typescript
|
||||
// BEFORE
|
||||
import { useAuth } from '@/hooks/useAuth'
|
||||
const { verifySmsCode } = useAuth()
|
||||
|
||||
// AFTER
|
||||
import { useAuthContext } from '@/contexts/AuthContext'
|
||||
const { verifySmsCode } = useAuthContext()
|
||||
```
|
||||
|
||||
**Тестирование:**
|
||||
- [ ] SMS коды работают для новых пользователей
|
||||
- [ ] SMS коды работают для существующих пользователей
|
||||
- [ ] Правильные редиректы после верификации
|
||||
- [ ] Состояние пользователя синхронизировано
|
||||
|
||||
---
|
||||
|
||||
### 📋 CHECKPOINT ALPHA - КРИТИЧЕСКАЯ ПРОВЕРКА
|
||||
|
||||
**Обязательные тесты перед продолжением:**
|
||||
|
||||
1. **Безопасность ролей:**
|
||||
```bash
|
||||
# Тест: попытка доступа селлера к фулфилменту
|
||||
curl -H "Authorization: Bearer SELLER_TOKEN" http://localhost:3000/fulfillment/dashboard
|
||||
# Ожидаемый результат: 403 или редирект
|
||||
```
|
||||
|
||||
2. **Регистрационный flow:**
|
||||
- Регистрация нового селлера: ✅/❌
|
||||
- Регистрация нового фулфилмента: ✅/❌
|
||||
- SMS верификация: ✅/❌
|
||||
- Завершение регистрации: ✅/❌
|
||||
|
||||
3. **Состояние системы:**
|
||||
- Нет ошибок в консоли: ✅/❌
|
||||
- Сайдбар синхронизирован: ✅/❌
|
||||
- Роутинг работает: ✅/❌
|
||||
|
||||
**🛑 STOP CONDITIONS:**
|
||||
Если любой из тестов провален → ROLLBACK всех изменений фазы 1
|
||||
|
||||
---
|
||||
|
||||
## 🔥 ФАЗА 2: ПРОФИЛИ И НАСТРОЙКИ (24-48 часов)
|
||||
|
||||
### 🎯 ЭТАП 2.1: ПОЛЬЗОВАТЕЛЬСКИЕ ДАННЫЕ
|
||||
|
||||
**2.1.1 user-settings.tsx** - СРЕДНИЙ РИСК (60 минут)
|
||||
|
||||
**Особенности миграции:**
|
||||
- Компонент использует `updateUser` для мгновенного обновления sidebar
|
||||
- Сложная логика сохранения профиля и организации
|
||||
- API ключи должны синхронизироваться с AuthContext
|
||||
|
||||
**Детальный план:**
|
||||
```typescript
|
||||
// КРИТИЧЕСКАЯ ЗАМЕНА:
|
||||
// BEFORE
|
||||
const { user, updateUser } = useAuth()
|
||||
|
||||
// AFTER
|
||||
const { user, updateUser } = useAuthContext()
|
||||
```
|
||||
|
||||
**Тестирование:**
|
||||
- [ ] Изменения профиля отражаются в sidebar немедленно
|
||||
- [ ] API ключи сохраняются и отображаются
|
||||
- [ ] Аватар обновляется корректно
|
||||
- [ ] Организационные данные синхронизируются
|
||||
|
||||
---
|
||||
|
||||
**2.1.2 confirmation-step.tsx** - ВЫСОКАЯ СЛОЖНОСТЬ (120 минут)
|
||||
|
||||
**⚠️ СПЕЦИАЛЬНАЯ ОСТОРОЖНОСТЬ:**
|
||||
Этот компонент содержит критическую бизнес-логику создания организаций с системой rollback.
|
||||
|
||||
**Анализ сложности:**
|
||||
```typescript
|
||||
// Три разных метода регистрации:
|
||||
const {
|
||||
registerFulfillmentOrganization, // Для фулфилмента/логистики/опта
|
||||
registerSellerOrganization, // Для селлеров
|
||||
registerOrganization // Новый универсальный
|
||||
} = useAuth()
|
||||
|
||||
// A/B тестирование между методами (линии 50, 88-111)
|
||||
// Rollback механизм в useAuth (восстановление состояния при ошибках)
|
||||
```
|
||||
|
||||
**Пошаговая миграция:**
|
||||
1. Проверить что все три метода есть в AuthContext ✅
|
||||
2. Заменить импорт
|
||||
3. Протестировать каждый тип организации отдельно
|
||||
4. Проверить rollback механизм работает
|
||||
|
||||
**Критическое тестирование:**
|
||||
- [ ] Фулфилмент регистрация с ИНН
|
||||
- [ ] Селлер регистрация с API ключами
|
||||
- [ ] Универсальная регистрация
|
||||
- [ ] Rollback при ошибках сети
|
||||
- [ ] Партнерские и реферальные коды
|
||||
|
||||
---
|
||||
|
||||
## 🔥 ФАЗА 3: БИЗНЕС-КОМПОНЕНТЫ (48-72 часа)
|
||||
|
||||
### 🎯 ЭТАП 3.1: ДАШБОРДЫ И СТАТИСТИКА
|
||||
|
||||
**Приоритетные компоненты:**
|
||||
1. `dashboard-home.tsx` - главная страница всех ролей
|
||||
2. `economics-page-wrapper.tsx` - экономические данные
|
||||
3. `fulfillment-warehouse-dashboard/index.tsx` - управление складом
|
||||
4. `supplier-orders-tabs-v2.tsx` - заказы поставщиков
|
||||
|
||||
**Стратегия миграции:**
|
||||
- Один дашборд за раз
|
||||
- Полное тестирование каждого типа пользователя
|
||||
- Проверка доступа к данным
|
||||
|
||||
---
|
||||
|
||||
### 🎯 ЭТАП 3.2: КОММУНИКАЦИИ И СЕРВИСЫ
|
||||
|
||||
**Компоненты:**
|
||||
1. `messenger-chat.tsx` - система сообщений
|
||||
2. `file-uploader.tsx` - загрузка файлов
|
||||
3. `voice-recorder.tsx` - голосовые записи
|
||||
|
||||
**Особенности:**
|
||||
- Могут содержать user ID для авторизации запросов
|
||||
- Низкий риск, но важны для UX
|
||||
|
||||
---
|
||||
|
||||
## 🔥 ФАЗА 4: ПОСТАВКИ И ЗАКАЗЫ (72-96 часов)
|
||||
|
||||
### 🎯 МАССОВАЯ МИГРАЦИЯ КОМПОНЕНТОВ ПОСТАВОК
|
||||
|
||||
**Категории:**
|
||||
- **Создание поставок:** 8 компонентов
|
||||
- **Управление поставками:** 12 компонентов
|
||||
- **Отчеты и аналитика:** 6 компонентов
|
||||
|
||||
**Batching strategy:**
|
||||
- Мигрируем по функциональным группам
|
||||
- Тестируем весь workflow поставок сразу
|
||||
|
||||
---
|
||||
|
||||
## 🔥 ФАЗА 5: ДОЛГОСРОЧНЫЕ КОМПОНЕНТЫ (96+ часов)
|
||||
|
||||
### 🎯 ЭТАП 5.1: ДОМАШНИЕ СТРАНИЦЫ
|
||||
- `seller-home-page.tsx`
|
||||
- `fulfillment-home-page.tsx`
|
||||
- `logist-home-page.tsx`
|
||||
- `wholesale-home-page.tsx`
|
||||
|
||||
### 🎯 ЭТАП 5.2: СПЕЦИАЛИЗИРОВАННЫЕ КОМПОНЕНТЫ
|
||||
- Advertising таблицы
|
||||
- Warehouse управление
|
||||
- Logistics заказы
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ СИСТЕМА БЕЗОПАСНОСТИ И ROLLBACK
|
||||
|
||||
### 📋 ROLLBACK TRIGGERS
|
||||
|
||||
**Автоматический rollback при:**
|
||||
- Ошибки аутентификации > 5% пользователей
|
||||
- Невозможность входа в систему
|
||||
- Критические ошибки в console (> 100/минуту)
|
||||
- Жалобы пользователей на недоступность
|
||||
|
||||
### 🔄 ROLLBACK PROCEDURE
|
||||
|
||||
**Для каждой фазы:**
|
||||
```bash
|
||||
# 1. Остановить миграцию
|
||||
git stash push -m "emergency_rollback_$(date)"
|
||||
|
||||
# 2. Вернуться к последнему стабильному состоянию
|
||||
git checkout HEAD~1
|
||||
|
||||
# 3. Быстрый деплой
|
||||
npm run build && npm start
|
||||
|
||||
# 4. Проверить работоспособность
|
||||
curl -f http://localhost:3000/health || echo "ROLLBACK FAILED"
|
||||
|
||||
# 5. Уведомить команду
|
||||
echo "ROLLBACK EXECUTED: $(date)" >> rollback.log
|
||||
```
|
||||
|
||||
### 📊 МОНИТОРИНГ
|
||||
|
||||
**Метрики для отслеживания:**
|
||||
- Успешные аутентификации (должно остаться > 95%)
|
||||
- Время загрузки страниц (не должно увеличиться > 20%)
|
||||
- Ошибки JavaScript в console (< 50/час)
|
||||
- User registration completion rate (> 80%)
|
||||
|
||||
---
|
||||
|
||||
## 🧪 ОБЯЗАТЕЛЬНОЕ ТЕСТИРОВАНИЕ И ДИАГНОСТИКА ПОСЛЕ КАЖДОЙ ФАЗЫ
|
||||
|
||||
### 📋 ПРОТОКОЛ ТЕСТИРОВАНИЯ
|
||||
|
||||
**ПРАВИЛО:** После завершения каждой фазы проводится полная диагностика системы. Переход к следующей фазе ТОЛЬКО после успешного прохождения всех тестов.
|
||||
|
||||
### 🔴 CHECKPOINT ALPHA - ПОСЛЕ ФАЗЫ 1 (Критические исправления)
|
||||
|
||||
#### 🚨 ОБЯЗАТЕЛЬНЫЕ ТЕСТЫ БЕЗОПАСНОСТИ:
|
||||
|
||||
**1. Тест авторизации ролей (КРИТИЧЕСКИЙ):**
|
||||
```bash
|
||||
# Создаем тестовых пользователей каждой роли
|
||||
node scripts/create-test-users.js
|
||||
|
||||
# Тестируем изоляцию ролей
|
||||
curl -H "Authorization: Bearer SELLER_TOKEN" http://localhost:3000/fulfillment/dashboard
|
||||
# Ожидаемо: 403 или редирект на /seller/dashboard
|
||||
|
||||
curl -H "Authorization: Bearer FULFILLMENT_TOKEN" http://localhost:3000/seller/statistics
|
||||
# Ожидаемо: 403 или редирект на /fulfillment/dashboard
|
||||
|
||||
curl -H "Authorization: Bearer WHOLESALE_TOKEN" http://localhost:3000/logist/orders
|
||||
# Ожидаемо: 403 или редирект на /wholesale/dashboard
|
||||
```
|
||||
|
||||
**2. Тест регистрационного потока (КРИТИЧЕСКИЙ):**
|
||||
```javascript
|
||||
// Автоматизированный тест в browser console
|
||||
async function testRegistrationFlow() {
|
||||
const testResults = []
|
||||
|
||||
// Тест 1: Новая регистрация селлера
|
||||
try {
|
||||
await fetch('/api/graphql', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
query: `mutation { sendSmsCode(phone: "79999999999") { success message } }`
|
||||
})
|
||||
})
|
||||
testResults.push('✅ SMS отправка работает')
|
||||
} catch (e) {
|
||||
testResults.push('❌ SMS отправка сломана: ' + e.message)
|
||||
}
|
||||
|
||||
return testResults
|
||||
}
|
||||
```
|
||||
|
||||
**3. Диагностика состояния системы:**
|
||||
```bash
|
||||
# Проверка отсутствия window.location.reload() в auth-flow
|
||||
grep -r "window.location.reload" src/components/auth/
|
||||
# Ожидаемо: НЕТ результатов
|
||||
|
||||
# Проверка использования AuthContext
|
||||
grep -r "useAuthContext" src/components/auth/ | wc -l
|
||||
# Ожидаемо: > 3 (auth-flow, sms-step, confirmation-step)
|
||||
|
||||
# Проверка отсутствия useAuth в критических компонентах
|
||||
grep -r "useAuth" src/hooks/useRoleGuard.ts src/app/page.tsx
|
||||
# Ожидаемо: НЕТ результатов
|
||||
```
|
||||
|
||||
#### 📊 МЕТРИКИ ПРОИЗВОДИТЕЛЬНОСТИ ПОСЛЕ ФАЗЫ 1:
|
||||
```bash
|
||||
# Время загрузки главной страницы
|
||||
curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000/
|
||||
|
||||
# Количество ошибок JavaScript
|
||||
# Мониторинг console.error за 5 минут, должно быть < 10
|
||||
|
||||
# Memory usage
|
||||
node --inspect src/app/page.tsx
|
||||
# Baseline для сравнения с последующими фазами
|
||||
```
|
||||
|
||||
#### 🛑 STOP CONDITIONS ДЛЯ ФАЗЫ 1:
|
||||
- Любой тест авторизации ролей провален → ROLLBACK
|
||||
- Регистрация не работает → ROLLBACK
|
||||
- > 50 JavaScript ошибок в час → ROLLBACK
|
||||
- Infinite redirects обнаружены → ROLLBACK
|
||||
|
||||
---
|
||||
|
||||
### 🔴 CHECKPOINT BETA - ПОСЛЕ ФАЗЫ 2 (Профили и настройки)
|
||||
|
||||
#### 🧪 ТЕСТЫ ПОЛЬЗОВАТЕЛЬСКИХ ДАННЫХ:
|
||||
|
||||
**1. Тест синхронизации профиля:**
|
||||
```javascript
|
||||
// Тест обновления профиля и отражения в sidebar
|
||||
async function testProfileSync() {
|
||||
// 1. Открыть настройки пользователя
|
||||
// 2. Изменить имя/аватар
|
||||
// 3. Сохранить
|
||||
// 4. Проверить что sidebar обновился МГНОВЕННО
|
||||
// 5. Перезагрузить страницу
|
||||
// 6. Проверить что изменения сохранились
|
||||
|
||||
const beforeName = document.querySelector('[data-testid="sidebar-user-name"]').textContent
|
||||
|
||||
// Симуляция изменения профиля
|
||||
await updateProfile({ managerName: 'Test Name Updated' })
|
||||
|
||||
const afterName = document.querySelector('[data-testid="sidebar-user-name"]').textContent
|
||||
|
||||
return beforeName !== afterName ? '✅ Профиль синхронизирован' : '❌ Синхронизация сломана'
|
||||
}
|
||||
```
|
||||
|
||||
**2. Тест API ключей:**
|
||||
```bash
|
||||
# Добавление WB API ключа через настройки
|
||||
# Проверка что ключ появился в статистике
|
||||
curl -X POST http://localhost:3000/api/graphql \
|
||||
-H "Authorization: Bearer USER_TOKEN" \
|
||||
-d '{"query":"mutation { addMarketplaceApiKey(input: {marketplace: WILDBERRIES, apiKey: \"test_key\"}) { success } }"}'
|
||||
|
||||
# Проверка что ключ доступен в статистике
|
||||
curl -X POST http://localhost:3000/api/graphql \
|
||||
-H "Authorization: Bearer USER_TOKEN" \
|
||||
-d '{"query":"query { getWildberriesStatistics(period: \"week\") { success message } }"}'
|
||||
```
|
||||
|
||||
**3. Тест создания организаций:**
|
||||
```javascript
|
||||
// Тест всех трех методов регистрации
|
||||
const testOrganizationCreation = async () => {
|
||||
const results = []
|
||||
|
||||
// Тест универсального метода
|
||||
try {
|
||||
const result = await registerOrganization({
|
||||
phone: '79999999998',
|
||||
type: 'SELLER',
|
||||
wbApiKey: 'test_key'
|
||||
})
|
||||
results.push(result.success ? '✅ Универсальная регистрация' : '❌ Универсальная регистрация')
|
||||
} catch (e) {
|
||||
results.push('❌ Универсальная регистрация: ' + e.message)
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
```
|
||||
|
||||
#### 📊 ДИАГНОСТИКА СОСТОЯНИЯ ПОСЛЕ ФАЗЫ 2:
|
||||
```bash
|
||||
# Проверка количества мигрированных компонентов
|
||||
grep -r "useAuthContext" src/ | grep -v "node_modules" | wc -l
|
||||
# Ожидаемо: ~15-20 (базовые + профильные компоненты)
|
||||
|
||||
# Проверка оставшихся useAuth
|
||||
grep -r "useAuth" src/ | grep -v "useAuthContext" | grep -v "node_modules" | wc -l
|
||||
# Ожидаемо: ~40-45 (уменьшение на 10-15 компонентов)
|
||||
|
||||
# Memory leak detection
|
||||
node --expose-gc --inspect index.js
|
||||
# Проверка отсутствия утечек памяти от дублирующихся состояний
|
||||
```
|
||||
|
||||
#### 🛑 STOP CONDITIONS ДЛЯ ФАЗЫ 2:
|
||||
- Профиль не синхронизируется с sidebar → ROLLBACK
|
||||
- API ключи не сохраняются → ROLLBACK
|
||||
- Регистрация организаций сломана → ROLLBACK
|
||||
- Memory leaks обнаружены → INVESTIGATE & FIX
|
||||
|
||||
---
|
||||
|
||||
### 🔴 CHECKPOINT GAMMA - ПОСЛЕ ФАЗЫ 3 (Бизнес-компоненты)
|
||||
|
||||
#### 🏢 ТЕСТЫ БИЗНЕС-ФУНКЦИЙ:
|
||||
|
||||
**1. Тест дашбордов всех ролей:**
|
||||
```bash
|
||||
# Создаем полный workflow тест
|
||||
node tests/business-dashboard-test.js
|
||||
|
||||
# Тест доступа к экономическим данным
|
||||
# Тест доступа к складским данным
|
||||
# Тест доступа к заказам поставщиков
|
||||
```
|
||||
|
||||
**2. Тест целостности данных:**
|
||||
```javascript
|
||||
// Проверка что все типы пользователей видят правильные данные
|
||||
async function testDataIntegrity() {
|
||||
const roles = ['SELLER', 'FULFILLMENT', 'LOGIST', 'WHOLESALE']
|
||||
const results = []
|
||||
|
||||
for (const role of roles) {
|
||||
const user = await loginAsRole(role)
|
||||
const dashboardData = await fetchDashboardData()
|
||||
|
||||
// Проверяем что данные соответствуют роли
|
||||
if (role === 'SELLER' && !dashboardData.wildberriesStats) {
|
||||
results.push(`❌ ${role}: отсутствуют WB статистики`)
|
||||
} else if (role === 'FULFILLMENT' && !dashboardData.warehouseData) {
|
||||
results.push(`❌ ${role}: отсутствуют складские данные`)
|
||||
} else {
|
||||
results.push(`✅ ${role}: данные корректны`)
|
||||
}
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
```
|
||||
|
||||
#### 📊 ДИАГНОСТИКА ПРОИЗВОДИТЕЛЬНОСТИ ПОСЛЕ ФАЗЫ 3:
|
||||
```bash
|
||||
# Benchmark основных страниц
|
||||
curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000/seller/dashboard
|
||||
curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000/fulfillment/dashboard
|
||||
curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000/warehouse/dashboard
|
||||
|
||||
# Ожидаемо: время загрузки < 2 секунд для каждой
|
||||
|
||||
# API requests count
|
||||
# Мониторинг количества GET_ME запросов
|
||||
# Ожидаемо: 1 запрос на сессию (вместо N на каждый компонент)
|
||||
```
|
||||
|
||||
#### 🛑 STOP CONDITIONS ДЛЯ ФАЗЫ 3:
|
||||
- Любой дашборд недоступен → ROLLBACK
|
||||
- Данные отображаются неправильно → ROLLBACK
|
||||
- Время загрузки > 3 секунд → INVESTIGATE & OPTIMIZE
|
||||
- Critical business functions broken → IMMEDIATE ROLLBACK
|
||||
|
||||
---
|
||||
|
||||
### 🔴 CHECKPOINT DELTA - ПОСЛЕ ФАЗЫ 4 (Поставки и заказы)
|
||||
|
||||
#### 📦 ТЕСТЫ SUPPLY CHAIN:
|
||||
|
||||
**1. End-to-end тест поставок:**
|
||||
```javascript
|
||||
// Полный цикл: создание → управление → отчеты
|
||||
async function testSupplyChain() {
|
||||
const results = []
|
||||
|
||||
// 1. Создание поставки
|
||||
const supply = await createSupply({
|
||||
type: 'FULFILLMENT_GOODS',
|
||||
items: [{ productId: 'test', quantity: 10 }]
|
||||
})
|
||||
results.push(supply.success ? '✅ Создание поставки' : '❌ Создание поставки')
|
||||
|
||||
// 2. Обновление статуса
|
||||
const statusUpdate = await updateSupplyStatus(supply.id, 'IN_PROGRESS')
|
||||
results.push(statusUpdate.success ? '✅ Обновление статуса' : '❌ Обновление статуса')
|
||||
|
||||
// 3. Генерация отчета
|
||||
const report = await generateSupplyReport(supply.id)
|
||||
results.push(report.success ? '✅ Отчеты работают' : '❌ Отчеты сломаны')
|
||||
|
||||
return results
|
||||
}
|
||||
```
|
||||
|
||||
**2. Тест заказов поставщиков:**
|
||||
```bash
|
||||
# Тест workflow заказов
|
||||
node tests/supplier-orders-workflow.js
|
||||
|
||||
# Проверка уведомлений
|
||||
# Проверка статусов заказов
|
||||
# Проверка расчетов
|
||||
```
|
||||
|
||||
#### 📊 ПОЛНАЯ ДИАГНОСТИКА СИСТЕМЫ ПОСЛЕ ФАЗЫ 4:
|
||||
```bash
|
||||
# Состояние миграции
|
||||
echo "=== MIGRATION STATUS ==="
|
||||
grep -r "useAuthContext" src/ | wc -l # Ожидаемо: ~50+
|
||||
grep -r "useAuth" src/ | grep -v "useAuthContext" | wc -l # Ожидаемо: ~10-15
|
||||
|
||||
# Performance metrics
|
||||
echo "=== PERFORMANCE ==="
|
||||
node scripts/performance-benchmark.js
|
||||
|
||||
# Memory usage
|
||||
echo "=== MEMORY ==="
|
||||
node --expose-gc scripts/memory-test.js
|
||||
|
||||
# Error rates
|
||||
echo "=== ERROR MONITORING ==="
|
||||
grep "ERROR" logs/app.log | tail -100
|
||||
```
|
||||
|
||||
#### 🛑 STOP CONDITIONS ДЛЯ ФАЗЫ 4:
|
||||
- Supply chain workflow broken → IMMEDIATE ROLLBACK
|
||||
- Data corruption in orders → IMMEDIATE ROLLBACK
|
||||
- Performance degradation > 50% → INVESTIGATE
|
||||
- Memory usage > baseline + 30% → OPTIMIZE
|
||||
|
||||
---
|
||||
|
||||
### 🔴 CHECKPOINT FINAL - ПОСЛЕ ФАЗЫ 5 (Финализация)
|
||||
|
||||
#### 🎯 ПОЛНОЕ РЕГРЕССИОННОЕ ТЕСТИРОВАНИЕ:
|
||||
|
||||
**1. Автоматизированный тест всех функций:**
|
||||
```bash
|
||||
# Запуск полного test suite
|
||||
npm run test:e2e
|
||||
npm run test:integration
|
||||
npm run test:security
|
||||
|
||||
# Ожидаемо: 100% pass rate
|
||||
```
|
||||
|
||||
**2. Нагрузочное тестирование:**
|
||||
```bash
|
||||
# Симуляция 100 одновременных пользователей
|
||||
npm run test:load
|
||||
|
||||
# Проверка стабильности при нагрузке
|
||||
# Проверка memory leaks
|
||||
# Проверка response times
|
||||
```
|
||||
|
||||
**3. Безопасность финальная:**
|
||||
```bash
|
||||
# Security audit
|
||||
npm audit
|
||||
npm run test:security
|
||||
|
||||
# Проверка отсутствия useAuth
|
||||
grep -r "import.*useAuth" src/ | grep -v "useAuthContext"
|
||||
# Ожидаемо: ТОЛЬКО в useAuth.ts файле (если оставляем для compatibility)
|
||||
```
|
||||
|
||||
#### 📊 ФИНАЛЬНЫЕ МЕТРИКИ:
|
||||
|
||||
```bash
|
||||
echo "=== FINAL MIGRATION REPORT ==="
|
||||
echo "Components migrated: $(grep -r "useAuthContext" src/ | wc -l)"
|
||||
echo "Components remaining: $(grep -r "useAuth" src/ | grep -v "useAuthContext" | wc -l)"
|
||||
echo "Performance improvement: $(node scripts/performance-compare.js)"
|
||||
echo "Memory reduction: $(node scripts/memory-compare.js)"
|
||||
echo "API calls reduction: $(node scripts/api-calls-compare.js)"
|
||||
```
|
||||
|
||||
**Ожидаемые результаты:**
|
||||
- ✅ Components migrated: 56+
|
||||
- ✅ Components remaining: 0 (кроме useAuth.ts если оставляем)
|
||||
- ✅ Performance improvement: 80%+
|
||||
- ✅ Memory reduction: 85%+
|
||||
- ✅ API calls reduction: 90%+
|
||||
|
||||
#### 🛑 FINAL APPROVAL CONDITIONS:
|
||||
- Все e2e тесты пройдены: ✅/❌
|
||||
- Нагрузочные тесты стабильны: ✅/❌
|
||||
- Security audit чистый: ✅/❌
|
||||
- Performance targets достигнуты: ✅/❌
|
||||
- No critical bugs: ✅/❌
|
||||
|
||||
**ТОЛЬКО при 100% SUCCESS → Миграция считается ЗАВЕРШЕННОЙ**
|
||||
|
||||
---
|
||||
|
||||
### 🔴 КРИТИЧЕСКИЕ ТЕСТЫ (ПОСЛЕ КАЖДОГО ЭТАПА)
|
||||
|
||||
**1. Базовая аутентификация:**
|
||||
```javascript
|
||||
// Тест в browser console
|
||||
localStorage.setItem('authToken', 'valid_token')
|
||||
window.location.reload()
|
||||
// Проверить: пользователь автоматически авторизован
|
||||
```
|
||||
|
||||
**2. Переключение ролей:**
|
||||
```bash
|
||||
# Селлер пытается зайти в фулфилмент
|
||||
GET /fulfillment/dashboard
|
||||
# Ожидаемо: редирект на /seller/dashboard
|
||||
```
|
||||
|
||||
**3. Регистрационный flow:**
|
||||
- SMS код → Верификация → Выбор типа → Создание организации → Dashboard
|
||||
|
||||
### 📋 ИНТЕГРАЦИОННЫЕ ТЕСТЫ
|
||||
|
||||
**1. Синхронизация состояния:**
|
||||
- Обновить профиль → Проверить sidebar → Проверить user-settings
|
||||
|
||||
**2. API ключи:**
|
||||
- Добавить WB ключ → Проверить статистику → Проверить настройки
|
||||
|
||||
**3. Роли и доступы:**
|
||||
- Каждая роль → Проверить доступные разделы → Проверить запрещенные разделы
|
||||
|
||||
---
|
||||
|
||||
## 📈 ПЛАН ПРОИЗВОДИТЕЛЬНОСТИ
|
||||
|
||||
### ⚡ ОПТИМИЗАЦИИ
|
||||
|
||||
**1. Устранение дублирования состояния:**
|
||||
- До: 56 компонентов × useState = 56 экземпляров состояния
|
||||
- После: 1 AuthContext = 1 глобальное состояние
|
||||
- Экономия памяти: ~85%
|
||||
|
||||
**2. Уменьшение API запросов:**
|
||||
- До: Каждый useAuth делает GET_ME при монтировании
|
||||
- После: 1 запрос в AuthContext для всех компонентов
|
||||
- Экономия запросов: ~90%
|
||||
|
||||
**3. Улучшение UX:**
|
||||
- Мгновенная синхронизация данных между компонентами
|
||||
- Нет задержек при обновлении профиля
|
||||
- Консистентное состояние загрузки
|
||||
|
||||
---
|
||||
|
||||
## 🎯 SUCCESS CRITERIA
|
||||
|
||||
### ✅ ОБЯЗАТЕЛЬНЫЕ РЕЗУЛЬТАТЫ
|
||||
|
||||
**Безопасность:**
|
||||
- [ ] Нет security holes в авторизации ролей
|
||||
- [ ] Все компоненты используют AuthContext
|
||||
- [ ] Нет утечек состояния между useAuth и AuthContext
|
||||
|
||||
**Функциональность:**
|
||||
- [ ] Все типы регистрации работают
|
||||
- [ ] SMS верификация стабильна
|
||||
- [ ] Профили синхронизируются
|
||||
- [ ] API ключи сохраняются
|
||||
|
||||
**Производительность:**
|
||||
- [ ] Время загрузки < 2 секунд
|
||||
- [ ] Memory usage снижен на 80%+
|
||||
- [ ] API запросы сокращены на 85%+
|
||||
|
||||
**UX:**
|
||||
- [ ] Нет infinite loops
|
||||
- [ ] Мгновенное обновление интерфейса
|
||||
- [ ] Стабильная работа во всех браузерах
|
||||
|
||||
---
|
||||
|
||||
## 📞 ПЛАН КОММУНИКАЦИИ
|
||||
|
||||
### 🚨 КРИТИЧЕСКИЕ УВЕДОМЛЕНИЯ
|
||||
|
||||
**Команде разработки:**
|
||||
- Начало каждой фазы: Slack + Email
|
||||
- Критические проблемы: Немедленный звонок
|
||||
- Успешное завершение: Отчет в Slack
|
||||
|
||||
**Бизнес-команде:**
|
||||
- Ежедневные отчеты о прогрессе
|
||||
- Уведомления о рисках заранее
|
||||
- Финальный отчет с метриками
|
||||
|
||||
### 📅 ГРАФИК УВЕДОМЛЕНИЙ
|
||||
|
||||
| Время | Событие | Кому | Канал |
|
||||
|-------|---------|------|-------|
|
||||
| Старт фазы | Начало миграции | Dev team | Slack |
|
||||
| +2 часа | Checkpoint Alpha | Dev + QA | Slack |
|
||||
| +24 часа | Фаза 1 завершена | Все | Email |
|
||||
| +48 часов | Фаза 2 завершена | Все | Email |
|
||||
| Завершение | Полная миграция | Все | Meeting |
|
||||
|
||||
---
|
||||
|
||||
## 📋 CHECKLIST ВЫПОЛНЕНИЯ
|
||||
|
||||
### 🔥 ФАЗА 1: КРИТИЧЕСКАЯ (24 часа)
|
||||
- [ ] useRoleGuard.ts мигрирован
|
||||
- [ ] app/page.tsx мигрирован
|
||||
- [ ] auth-flow.tsx исправлен (убран window.reload)
|
||||
- [ ] sms-step.tsx мигрирован
|
||||
- [ ] Checkpoint Alpha пройден
|
||||
- [ ] Безопасность ролей работает
|
||||
- [ ] Регистрация стабильна
|
||||
|
||||
### 🔥 ФАЗА 2: ПРОФИЛИ (48 часов)
|
||||
- [ ] user-settings.tsx мигрирован
|
||||
- [ ] confirmation-step.tsx мигрирован
|
||||
- [ ] Профили синхронизируются с sidebar
|
||||
- [ ] API ключи работают
|
||||
- [ ] Все типы регистрации протестированы
|
||||
|
||||
### 🔥 ФАЗА 3: БИЗНЕС (72 часа)
|
||||
- [ ] dashboard-home.tsx мигрирован
|
||||
- [ ] economics компоненты мигрированы
|
||||
- [ ] warehouse дашборды мигрированы
|
||||
- [ ] Все типы пользователей протестированы
|
||||
|
||||
### 🔥 ФАЗА 4: ПОСТАВКИ (96 часов)
|
||||
- [ ] Создание поставок мигрировано
|
||||
- [ ] Управление поставками мигрировано
|
||||
- [ ] Отчеты мигрированы
|
||||
- [ ] Full supply chain workflow протестирован
|
||||
|
||||
### 🔥 ФАЗА 5: ФИНАЛИЗАЦИЯ (120+ часов)
|
||||
- [ ] Все домашние страницы мигрированы
|
||||
- [ ] Специализированные компоненты мигрированы
|
||||
- [ ] useAuth.ts удален из кодовой базы
|
||||
- [ ] Полное регрессионное тестирование
|
||||
|
||||
---
|
||||
|
||||
## 🎯 ЗАКЛЮЧЕНИЕ
|
||||
|
||||
Данный план обеспечивает **безопасную поэтапную миграцию** с минимальным риском для бизнеса.
|
||||
|
||||
**Ключевые принципы:**
|
||||
- **Safety First** - безопасность превыше скорости
|
||||
- **Test Everything** - тестирование на каждом шаге
|
||||
- **Rollback Ready** - готовность к откату в любой момент
|
||||
- **Monitor Always** - постоянный мониторинг состояния
|
||||
|
||||
**Ожидаемые результаты:**
|
||||
- ✅ Устранение критических уязвимостей безопасности
|
||||
- ✅ Стабильная работа всех компонентов
|
||||
- ✅ Улучшение производительности на 80%+
|
||||
- ✅ Единое состояние аутентификации для всего приложения
|
||||
|
||||
**Временные рамки:** 5-7 дней активной разработки + тестирование
|
||||
|
||||
---
|
||||
|
||||
*Документ подготовлен: 18.09.2025*
|
||||
*Статус: ГОТОВ К ВЫПОЛНЕНИЮ*
|
||||
*Приоритет: КРИТИЧЕСКИЙ*
|
Reference in New Issue
Block a user