# MongoDB Schema Update - Unleash Support

## 🐛 Проблема

При сохранении воронки с AB тестами в правилах навигации возникала ошибка:

```
Error: Funnel validation failed: 
funnelData.screens.1.navigation.rules.0.conditions.0.conditionType: 
`unleash` is not a valid enum value for path `conditionType`.
```

## ✅ Решение

Обновлена схема MongoDB в `src/lib/models/Funnel.ts`:

### Было:

```typescript
const NavigationConditionSchema = new Schema({
  screenId: { type: String, required: true },
  conditionType: {
    type: String,
    enum: ["options", "values"], // ❌ "unleash" отсутствует
    default: "options",
  },
  operator: {
    type: String,
    enum: ["includesAny", "includesAll", "includesExactly", "equals"],
    default: "includesAny",
  },
  optionIds: [{ type: String }],
  values: [{ type: String }],
  // ❌ Нет полей для Unleash
}, { _id: false });
```

### Стало:

```typescript
const NavigationConditionSchema = new Schema({
  screenId: { type: String, required: true },
  conditionType: {
    type: String,
    enum: ["options", "values", "unleash"], // ✅ Добавлен "unleash"
    default: "options",
  },
  operator: {
    type: String,
    enum: ["includesAny", "includesAll", "includesExactly", "equals"],
    default: "includesAny",
  },
  optionIds: [{ type: String }],
  values: [{ type: String }],
  // ✅ Добавлены поля для Unleash AB тестов
  unleashFlag: { type: String },
  unleashVariants: [{ type: String }],
}, { _id: false });
```

## 📋 Изменения

1. **conditionType enum** - добавлен `"unleash"`
2. **unleashFlag** - название флага из Unleash (String)
3. **unleashVariants** - массив ожидаемых вариантов (Array of Strings)

## 🔄 Применение изменений

### Development:

Модель автоматически пересоздается в dev режиме:

```typescript
if (process.env.NODE_ENV !== "production" && 
    typeof mongoose.models.Funnel !== "undefined") {
  mongoose.deleteModel("Funnel");
}
```

**Действия:**
1. Остановите dev сервер (если запущен)
2. Запустите заново: `npm run dev:full`
3. Схема обновится автоматически

### Production:

В production моделям нужна миграция или ручное обновление:

```bash
# Если нужно, можно добавить миграцию
# Но благодаря { strict: false } новые поля будут приниматься
```

## ✅ Проверка

После обновления схемы:

```bash
npm run dev:full
# Откройте админку
# Создайте правило навигации с AB тестом
# Сохраните воронку
# ✅ Должно сохраниться без ошибок
```

## 📊 Пример данных в MongoDB

```json
{
  "navigation": {
    "rules": [
      {
        "conditions": [
          {
            "screenId": "gender",
            "conditionType": "unleash",
            "operator": "equals",
            "unleashFlag": "onboarding-flow-test",
            "unleashVariants": ["short"]
          }
        ],
        "nextScreenId": "payment"
      }
    ]
  }
}
```

## 🎯 Совместимость

### Обратная совместимость:

✅ **Существующие воронки продолжают работать:**
- `conditionType: "options"` - работает как прежде
- `conditionType: "values"` - работает как прежде
- Новые поля опциональны

### Схема FunnelHistory:

❌ **Не требует изменений:**
- Использует `Schema.Types.Mixed` для `funnelSnapshot`
- Нет жесткой валидации enum

## 📝 Связанные файлы

- `/src/lib/models/Funnel.ts` - ✏️ Обновлена схема
- `/src/lib/models/FunnelHistory.ts` - ✅ Изменений не требуется
- `/src/lib/funnel/types.ts` - ✅ TypeScript типы уже обновлены

---

**Дата:** 2025-01-20  
**Статус:** ✅ Готово
