✅ Что сделано:
- app/page.tsx: Проверка source/utm_source параметров (n8n, chat, from_n8n)
- app/plans/page.tsx: Аналогичная проверка для 3-step flow
- app/api/create-user/route.ts: Разрешение создания без telegramId если source=n8n
🔓 ИСКЛЮЧЕНИЯ для n8n:
- ?source=n8n
- ?utm_source=n8n
- ?utm_source=chat
- ?from_n8n=true
🎯 ЛОГИКА:
1. Переход через Telegram Mini App → требуется tgUser.id ✅
2. Переход из n8n (прямая ссылка) → НЕ требуется, генерируется временный ID ✅
3. Переход из браузера напрямую → блокируется ❌💡 Для временных ID используется Date.now() но только если fromN8n=true
✅ Что сделано:
- app/page.tsx: Добавлена проверка tgUser?.id перед созданием trial
- app/plans/page.tsx: Добавлена валидация user?.id в createUser()
- app/api/create-user/route.ts: Серверная валидация telegramId (400 если отсутствует)
- types/telegram.ts: Расширен TelegramWebApp интерфейс (MainButton, BackButton, HapticFeedback)
- types/telegram.d.ts: Глобальная декларация Window.Telegram
- hooks/useTelegramWebApp.ts: Упрощено - использует (window as any)
❌ ПРОБЛЕМА (user_... имена):
Имена вида user_1770605873419 появляются когда Telegram WebApp не передает данные пользователя.
Теперь система блокирует создание trial/подписки если нет tgUser.id
✅ РЕШЕНИЕ:
Приложение должно быть открыто ВНУТРИ Telegram Mini App, а не в браузере!
Если пользователь видит user_..., значит открыто не через бота.
Создан новый endpoint /api/nodes:
- Получает список нод из Marzban API
- Фильтрует только connected ноды
- Форматирует для фронтенда (id, name, country, flag, ping)
Обновлен /api/create-user:
- Новые параметры: period ('1month'|'3months'|'6months'|'1year')
- Новые параметры: locationIds (массив ID выбранных нод)
- Динамический расчет expire с учетом периода
- Автоматическое определение inbounds для выбранных нод
- Fallback на дефолтные inbounds при ошибке
Функция getPlanConfig обновлена:
- Поддержка множителей периодов (1/3/6/12 месяцев)
- Расчет totalDays для корректного expire
Ready for: Frontend UI integration (Week 2)
**Проблема:**
- Реферальные API падали в dev режиме из-за хардкода DB подключения
- Невозможно было запустить на локальном сервере без доступа к production БД
**Решение:**
- Вынесены DB credentials в ENV переменные:
- DB_HOST, DB_USER, DB_PASSWORD, DB_NAME
- Добавлена проверка isDbConfigured в API endpoints
- Mock ответы для dev режима (когда DB не настроена)
**Изменения:**
- .env.example: добавлены DB переменные
- .env.local: пустые DB переменные (dev mode)
- /api/referral/track: graceful fallback без DB
- /api/referral/stats: mock данные без DB
**Результат:**
- ✅ Dev сервер работает без production DB
- ✅ Production будет использовать DB из ENV
- ✅ Логи предупреждают о dev режиме
- ✅ Реферальная система опциональна для разработки
**База данных:**
- Создана таблица referrals в MariaDB (193.168.175.128)
- Поля: username, referrer_username, referral_count, bonus_days_earned
- Foreign keys к users таблице с CASCADE/SET NULL
**API Endpoints:**
- POST /api/referral/track - отслеживание новых рефералов
- Автоматический расчёт бонусов: +7 дней за каждого
- Milestone bonus: +30 дней за каждые 5 рефералов
- Обновление expire даты реферера в users таблице
- GET /api/referral/stats?username=xxx - статистика
- Возвращает количество рефералов, бонусные дни
- Список приглашённых пользователей со статусами
**Интеграция:**
- POST /api/create-user принимает referrerId параметр
- Автоматический вызов /api/referral/track после создания юзера
- Параметр ref из URL при активации trial
**UI:**
- /app/referral/page.tsx - страница статистики
- 3 KPI карточки: рефералов, бонусных дней, milestone
- Реферальная ссылка с кнопкой копирования
- Список приглашённых юзеров с иконками статуса
- Инфоблок о механике начисления бонусов
**ReferralModal обновлён:**
- Добавлена кнопка «Моя статистика» → /referral
- Перенос Share/Copy кнопок на второй/третий план
**Зависимости:**
- mysql2@3.16.3 - для подключения к MariaDB
**Логика бонусов:**
- +7 дней за каждого успешного реферала
- +30 дней бонус за каждые 5 рефералов (milestone)
- Автоматическое обновление expire поля в users таблице
- Сохранение всех бонусов в bonus_days_earned
- Заменены все хардкоды umbrix_bot на process.env.NEXT_PUBLIC_TELEGRAM_BOT_USERNAME
- Fallback на Dorod_vps_bot если ENV не задана
- Теперь реферальные ссылки динамически генерируются: t.me/${botUsername}?start=ref_${userId}
- Обновлено 3 места: shareReferralLink(), ReferralModal props, onCopy callback
- Выбор устройства (💻 Компьютер / 📱 Телефон)
- Проверка наличия приложения
- Выбор локаций для Extended тарифа (3 из списка)
- Показ ссылки/QR кода
- Автоматическое открытие после активации Trial
- Прогресс бар для отслеживания шагов