Changed from dynamic channel form_approve:{claim_id} to fixed channel:
- Channel: clientright:webform:approve
- Simpler n8n subscription (no need for dynamic channel name)
- All form approvals go to the same channel
Files:
- backend/app/api/claims.py
- frontend/src/components/form/StepClaimConfirmation.tsx
- docs/REDIS_FORM_APPROVE.md
4.8 KiB
4.8 KiB
Redis канал для подтверждения формы (form_approve)
📋 Описание
После SMS-апрува данные подтвержденной формы публикуются в Redis канал clientright:webform:approve для обработки в n8n workflow.
🔄 Архитектура
Frontend (StepClaimConfirmation)
→ POST /api/v1/claims/approve
→ Backend публикует в Redis канал clientright:webform:approve
→ n8n подписывается на канал и обрабатывает данные
📡 Endpoint
POST /api/v1/claims/approve
Request Body
{
"claim_id": "0eb051ec-23a6-4e06-8b98-f02d20d35f68",
"session_token": "sess_c9e7c0c2-de2e-40cd-ab7c-3bdc40282d34",
"session_id": "sess_c9e7c0c2-de2e-40cd-ab7c-3bdc40282d34",
"unified_id": "usr_90599ff2-ac79-4236-b950-0df85395096c",
"user_id": "user_123",
"phone": "79262306381",
"form_data": {
"user": {...},
"project": {...},
"offenders": [...],
"meta": {...}
},
"user": {...},
"project": {...},
"offenders": [...],
"meta": {...},
"original_data": {...}
}
Response
{
"success": true,
"channel": "clientright:webform:approve",
"idempotency_key": "0eb051ec-23a6-4e06-8b98-f02d20d35f68_1735123456789_user_123",
"message": "Данные формы отправлены на обработку"
}
📢 Redis канал
Канал: clientright:webform:approve
Формат сообщения:
{
"event_type": "form_approve",
"status": "approved",
"message": "Форма подтверждена после SMS-верификации",
"claim_id": "0eb051ec-23a6-4e06-8b98-f02d20d35f68",
"session_token": "sess_c9e7c0c2-de2e-40cd-ab7c-3bdc40282d34",
"unified_id": "usr_90599ff2-ac79-4236-b950-0df85395096c",
"phone": "79262306381",
"sms_verified": true,
"idempotency_key": "0eb051ec-23a6-4e06-8b98-f02d20d35f68_1735123456789_user_123",
"timestamp": "2025-11-24T14:15:26.03297+03:00",
"form_data": {...},
"user": {...},
"project": {...},
"offenders": [...],
"meta": {...},
"original_data": {...}
}
🔐 Idempotency Key
Для защиты от дублей генерируется idempotency_key:
{claim_id}_{timestamp_ms}_{user_id}
Этот ключ можно использовать в будущем для интеграции с RabbitMQ:
- Проверка дублей перед обработкой
- Дедупликация в очереди
- Гарантия идемпотентности
🚀 Настройка n8n
1. Redis Subscribe Node
Operation: Subscribe
Channel: clientright:webform:approve
2. Обработка события
После получения события из Redis:
- Проверить
idempotency_key(для защиты от дублей) - Обработать данные формы
- Сохранить в БД через SQL запрос
- Отправить уведомления (если нужно)
3. Пример workflow
[Redis Subscribe] → [Check Idempotency] → [Process Form Data] → [Save to DB] → [Send Notifications]
🔮 Будущая интеграция с RabbitMQ
При необходимости можно подключить RabbitMQ для:
- Очереди: Гарантированная обработка всех событий
- Защита от дублей: Проверка
idempotency_keyперед добавлением в очередь - Retry механизм: Автоматические повторы при ошибках
- Масштабирование: Несколько воркеров для обработки
Структура для RabbitMQ
{
"queue": "form_approve",
"message": {
"idempotency_key": "...",
"claim_id": "...",
"data": {...}
},
"headers": {
"idempotency-key": "...",
"retry-count": 0
}
}
📊 Мониторинг
Проверка канала в Redis
redis-cli -h crm.clientright.ru -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' \
MONITOR | grep clientright:webform:approve
Подписка на канал (тест)
redis-cli -h crm.clientright.ru -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' \
SUBSCRIBE clientright:webform:approve
✅ Преимущества
- Высокая производительность: Redis Pub/Sub очень быстрый
- Не блокирует фронтенд: Fire-and-forget подход
- Масштабируемость: Можно добавить несколько подписчиков
- Готовность к RabbitMQ: Idempotency key уже включен
- Простота отладки: Можно мониторить через Redis MONITOR