docs: Add n8n workflow documentation for form approval
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
This commit is contained in:
120
docs/N8N_FORM_APPROVAL_WORKFLOW.md
Normal file
120
docs/N8N_FORM_APPROVAL_WORKFLOW.md
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
# Настройка 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)
|
||||||
|
|
||||||
Reference in New Issue
Block a user