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
4.3 KiB
4.3 KiB
Настройка n8n Workflow для обработки подтвержденных форм
Описание
После того, как пользователь подтвердил форму и прошел SMS-верификацию, данные публикуются в Redis канал clientright:webform:approve. n8n workflow должен:
- Подписаться на Redis канал
clientright:webform:approve - Обработать данные формы
- Отметить форму как подтвержденную в PostgreSQL (чтобы она больше не показывалась в черновиках)
Структура данных в Redis канале
{
"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
- Добавьте Redis Subscribe node
- Настройте подключение к Redis:
- Host:
crm.clientright.ru(или IP вашего Redis) - Port:
6379 - Password:
CRM_Redis_Pass_2025_Secure!
- Host:
- Channel:
clientright:webform:approve - Output:
JSON
Шаг 2: Обработка данных
После получения данных из Redis канала:
- Parse JSON (если нужно)
- Обработайте данные формы (сохранение в CRM, отправка уведомлений и т.д.)
- Отметьте форму как подтвержденную (см. Шаг 3)
Шаг 3: Отметка формы как подтвержденной
Используйте PostgreSQL node с SQL скриптом из SQL_MARK_FORM_APPROVED.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:
-
Проверьте, что запись в
clpr_claimsобновлена:SELECT id, status_code, is_confirmed, updated_at FROM clpr_claims WHERE payload->>'claim_id' = 'YOUR_CLAIM_ID'; -
Проверьте, что форма не показывается в черновиках:
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)