w-funnel/docs/MONGODB_SCHEMA_UPDATE.md
2025-10-22 22:42:01 +02:00

4.2 KiB
Raw Blame History

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:

Было:

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 });

Стало:

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 режиме:

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

Действия:

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

Production:

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

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

Проверка

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

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

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

{
  "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
Статус: Готово