Added documentation for n8n workflow setup: - Redis channel subscription (clientright:webform:approve) - Data structure description - SQL script usage for marking forms as approved - Verification steps Files: - docs/N8N_FORM_APPROVAL_WORKFLOW.md
121 lines
4.3 KiB
Markdown
121 lines
4.3 KiB
Markdown
# Настройка n8n Workflow для обработки подтвержденных форм
|
||
|
||
## Описание
|
||
|
||
После того, как пользователь подтвердил форму и прошел SMS-верификацию, данные публикуются в Redis канал `clientright:webform:approve`. n8n workflow должен:
|
||
|
||
1. Подписаться на Redis канал `clientright:webform:approve`
|
||
2. Обработать данные формы
|
||
3. Отметить форму как подтвержденную в PostgreSQL (чтобы она больше не показывалась в черновиках)
|
||
|
||
## Структура данных в Redis канале
|
||
|
||
```json
|
||
{
|
||
"event_type": "form_approve",
|
||
"status": "approved",
|
||
"message": "Форма подтверждена после SMS-верификации",
|
||
"claim_id": "0eb051ec-23a6-4e06-8b98-f02d20d35f68",
|
||
"session_token": "sess_xxx",
|
||
"unified_id": "usr_xxx",
|
||
"phone": "79262306381",
|
||
"sms_code": "123456",
|
||
"sms_verified": true,
|
||
"idempotency_key": "claim_id_timestamp_user_id",
|
||
"timestamp": "2025-11-25T12:30:36.262855",
|
||
"form_data": { /* данные формы */ },
|
||
"user": { /* данные пользователя */ },
|
||
"project": { /* данные проекта */ },
|
||
"offenders": [ /* нарушители */ ],
|
||
"meta": { /* метаданные */ }
|
||
}
|
||
```
|
||
|
||
## Настройка n8n Workflow
|
||
|
||
### Шаг 1: Redis Subscribe Node
|
||
|
||
1. Добавьте **Redis Subscribe** node
|
||
2. Настройте подключение к Redis:
|
||
- Host: `crm.clientright.ru` (или IP вашего Redis)
|
||
- Port: `6379`
|
||
- Password: `CRM_Redis_Pass_2025_Secure!`
|
||
3. Channel: `clientright:webform:approve`
|
||
4. Output: `JSON`
|
||
|
||
### Шаг 2: Обработка данных
|
||
|
||
После получения данных из Redis канала:
|
||
|
||
1. **Parse JSON** (если нужно)
|
||
2. **Обработайте данные формы** (сохранение в CRM, отправка уведомлений и т.д.)
|
||
3. **Отметьте форму как подтвержденную** (см. Шаг 3)
|
||
|
||
### Шаг 3: Отметка формы как подтвержденной
|
||
|
||
Используйте **PostgreSQL** node с SQL скриптом из `SQL_MARK_FORM_APPROVED.sql`:
|
||
|
||
```sql
|
||
-- Используйте claim_id из данных Redis события
|
||
WITH claim_lookup AS (
|
||
SELECT
|
||
c.id,
|
||
c.payload,
|
||
c.status_code,
|
||
c.is_confirmed
|
||
FROM clpr_claims c
|
||
WHERE c.id::text = '{{ $json.claim_id }}'::text
|
||
OR c.payload->>'claim_id' = '{{ $json.claim_id }}'::text
|
||
ORDER BY
|
||
CASE WHEN c.id::text = '{{ $json.claim_id }}'::text THEN 1 ELSE 2 END,
|
||
c.updated_at DESC
|
||
LIMIT 1
|
||
)
|
||
UPDATE clpr_claims c
|
||
SET
|
||
status_code = 'approved',
|
||
is_confirmed = true,
|
||
updated_at = now()
|
||
FROM claim_lookup cl
|
||
WHERE c.id = cl.id
|
||
RETURNING
|
||
c.id,
|
||
c.payload->>'claim_id' AS claim_id,
|
||
c.status_code,
|
||
c.is_confirmed,
|
||
c.updated_at;
|
||
```
|
||
|
||
**Параметры:**
|
||
- `{{ $json.claim_id }}` - claim_id из данных Redis события
|
||
|
||
**Результат:**
|
||
- Форма помечается как `status_code = 'approved'`
|
||
- Устанавливается `is_confirmed = true`
|
||
- Форма больше не будет показываться в списке черновиков (`/api/v1/claims/drafts/list`)
|
||
|
||
## Проверка работы
|
||
|
||
После обработки события в n8n:
|
||
|
||
1. Проверьте, что запись в `clpr_claims` обновлена:
|
||
```sql
|
||
SELECT id, status_code, is_confirmed, updated_at
|
||
FROM clpr_claims
|
||
WHERE payload->>'claim_id' = 'YOUR_CLAIM_ID';
|
||
```
|
||
|
||
2. Проверьте, что форма не показывается в черновиках:
|
||
```bash
|
||
curl "http://localhost:8200/api/v1/claims/drafts/list?unified_id=YOUR_UNIFIED_ID"
|
||
```
|
||
|
||
## Важные поля из Redis события
|
||
|
||
- `claim_id` - ID заявки (используется для обновления статуса)
|
||
- `sms_code` - SMS код, использованный для верификации (для аудита)
|
||
- `form_data` - данные формы подтверждения
|
||
- `user`, `project`, `offenders` - структурированные данные формы
|
||
- `idempotency_key` - ключ для защиты от дублей (для будущей интеграции с RabbitMQ)
|
||
|