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

154 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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