164 lines
4.8 KiB
Markdown
164 lines
4.8 KiB
Markdown
|
|
# 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
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"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
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"channel": "clientright:webform:approve",
|
|||
|
|
"idempotency_key": "0eb051ec-23a6-4e06-8b98-f02d20d35f68_1735123456789_user_123",
|
|||
|
|
"message": "Данные формы отправлены на обработку"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📢 Redis канал
|
|||
|
|
|
|||
|
|
**Канал:** `clientright:webform:approve`
|
|||
|
|
|
|||
|
|
**Формат сообщения:**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"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:
|
|||
|
|
1. Проверить `idempotency_key` (для защиты от дублей)
|
|||
|
|
2. Обработать данные формы
|
|||
|
|
3. Сохранить в БД через SQL запрос
|
|||
|
|
4. Отправить уведомления (если нужно)
|
|||
|
|
|
|||
|
|
### 3. Пример workflow
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
[Redis Subscribe] → [Check Idempotency] → [Process Form Data] → [Save to DB] → [Send Notifications]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔮 Будущая интеграция с RabbitMQ
|
|||
|
|
|
|||
|
|
При необходимости можно подключить RabbitMQ для:
|
|||
|
|
- **Очереди:** Гарантированная обработка всех событий
|
|||
|
|
- **Защита от дублей:** Проверка `idempotency_key` перед добавлением в очередь
|
|||
|
|
- **Retry механизм:** Автоматические повторы при ошибках
|
|||
|
|
- **Масштабирование:** Несколько воркеров для обработки
|
|||
|
|
|
|||
|
|
### Структура для RabbitMQ
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"queue": "form_approve",
|
|||
|
|
"message": {
|
|||
|
|
"idempotency_key": "...",
|
|||
|
|
"claim_id": "...",
|
|||
|
|
"data": {...}
|
|||
|
|
},
|
|||
|
|
"headers": {
|
|||
|
|
"idempotency-key": "...",
|
|||
|
|
"retry-count": 0
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 Мониторинг
|
|||
|
|
|
|||
|
|
### Проверка канала в Redis
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
redis-cli -h crm.clientright.ru -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' \
|
|||
|
|
MONITOR | grep clientright:webform:approve
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Подписка на канал (тест)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
redis-cli -h crm.clientright.ru -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' \
|
|||
|
|
SUBSCRIBE clientright:webform:approve
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## ✅ Преимущества
|
|||
|
|
|
|||
|
|
1. **Высокая производительность:** Redis Pub/Sub очень быстрый
|
|||
|
|
2. **Не блокирует фронтенд:** Fire-and-forget подход
|
|||
|
|
3. **Масштабируемость:** Можно добавить несколько подписчиков
|
|||
|
|
4. **Готовность к RabbitMQ:** Idempotency key уже включен
|
|||
|
|
5. **Простота отладки:** Можно мониторить через Redis MONITOR
|
|||
|
|
|