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