# 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 **Статус:** ✅ Готово