134 lines
3.9 KiB
Markdown
134 lines
3.9 KiB
Markdown
|
|
# Инструкция для n8n: Создание/поиск пользователя web_form
|
|||
|
|
|
|||
|
|
## Контекст
|
|||
|
|
После создания контакта в CRM через `CreateWebContact`, нужно найти или создать пользователя в PostgreSQL и получить `unified_id` для связи с черновиками.
|
|||
|
|
|
|||
|
|
## Шаги в n8n workflow
|
|||
|
|
|
|||
|
|
### 1. После CreateWebContact
|
|||
|
|
- Получен `contact_id` из CRM
|
|||
|
|
- Есть `phone` из запроса
|
|||
|
|
|
|||
|
|
### 2. PostgreSQL Node: Find or Create User
|
|||
|
|
|
|||
|
|
**Настройки:**
|
|||
|
|
- **Operation**: Execute Query
|
|||
|
|
- **Query**: Использовать запрос из `SQL_FIND_OR_CREATE_USER_WEB_FORM.sql`
|
|||
|
|
- **Parameters**:
|
|||
|
|
- `$1` = `{{$json.phone}}` (или `{{$('CreateWebContact').item.json.phone}}`)
|
|||
|
|
|
|||
|
|
**Запрос:**
|
|||
|
|
```sql
|
|||
|
|
WITH existing AS (
|
|||
|
|
SELECT u.id AS user_id, u.unified_id
|
|||
|
|
FROM clpr_user_accounts ua
|
|||
|
|
JOIN clpr_users u ON u.id = ua.user_id
|
|||
|
|
WHERE ua.channel = 'web_form'
|
|||
|
|
AND ua.channel_user_id = $1
|
|||
|
|
LIMIT 1
|
|||
|
|
),
|
|||
|
|
create_user AS (
|
|||
|
|
INSERT INTO clpr_users (unified_id, phone, created_at, updated_at)
|
|||
|
|
SELECT
|
|||
|
|
'usr_' || gen_random_uuid()::text,
|
|||
|
|
$1,
|
|||
|
|
now(),
|
|||
|
|
now()
|
|||
|
|
WHERE NOT EXISTS (SELECT 1 FROM existing)
|
|||
|
|
RETURNING id AS user_id, unified_id
|
|||
|
|
),
|
|||
|
|
final_user AS (
|
|||
|
|
SELECT * FROM existing
|
|||
|
|
UNION ALL
|
|||
|
|
SELECT * FROM create_user
|
|||
|
|
),
|
|||
|
|
update_unified AS (
|
|||
|
|
UPDATE clpr_users
|
|||
|
|
SET unified_id = COALESCE(
|
|||
|
|
unified_id,
|
|||
|
|
'usr_' || gen_random_uuid()::text
|
|||
|
|
),
|
|||
|
|
updated_at = now()
|
|||
|
|
WHERE id = (SELECT user_id FROM final_user LIMIT 1)
|
|||
|
|
AND unified_id IS NULL
|
|||
|
|
RETURNING id AS user_id, unified_id
|
|||
|
|
),
|
|||
|
|
final_unified_id AS (
|
|||
|
|
SELECT unified_id FROM update_unified
|
|||
|
|
UNION ALL
|
|||
|
|
SELECT unified_id FROM final_user
|
|||
|
|
WHERE NOT EXISTS (SELECT 1 FROM update_unified)
|
|||
|
|
LIMIT 1
|
|||
|
|
),
|
|||
|
|
create_account AS (
|
|||
|
|
INSERT INTO clpr_user_accounts(user_id, channel, channel_user_id)
|
|||
|
|
SELECT
|
|||
|
|
(SELECT user_id FROM final_user LIMIT 1),
|
|||
|
|
'web_form',
|
|||
|
|
$1
|
|||
|
|
ON CONFLICT (channel, channel_user_id) DO UPDATE
|
|||
|
|
SET user_id = EXCLUDED.user_id
|
|||
|
|
RETURNING user_id, channel, channel_user_id
|
|||
|
|
)
|
|||
|
|
SELECT
|
|||
|
|
(SELECT unified_id FROM final_unified_id LIMIT 1) AS unified_id,
|
|||
|
|
(SELECT user_id FROM final_user LIMIT 1) AS user_id;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Результат:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"unified_id": "usr_b2fd7f73-c238-4fde-949b-c404cded12f3",
|
|||
|
|
"user_id": 106
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. Сохранение unified_id в Redis
|
|||
|
|
|
|||
|
|
**Set Node (Redis)** или **Code Node**:
|
|||
|
|
```javascript
|
|||
|
|
const unified_id = $input.item.json.unified_id;
|
|||
|
|
const claim_id = $('CreateWebContact').item.json.claim_id; // или откуда берете claim_id
|
|||
|
|
|
|||
|
|
// Сохранить в Redis
|
|||
|
|
await redis.set(`claim:${claim_id}`, JSON.stringify({
|
|||
|
|
...existing_data,
|
|||
|
|
unified_id: unified_id
|
|||
|
|
}));
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. Возврат unified_id в ответе frontend
|
|||
|
|
|
|||
|
|
**Response Node** или в **Code Node** перед возвратом:
|
|||
|
|
```javascript
|
|||
|
|
return {
|
|||
|
|
success: true,
|
|||
|
|
result: {
|
|||
|
|
contact_id: $('CreateWebContact').item.json.contact_id,
|
|||
|
|
claim_id: $('CreateWebContact').item.json.claim_id,
|
|||
|
|
unified_id: $('PostgreSQL').item.json.unified_id, // ← ВАЖНО!
|
|||
|
|
is_new_contact: $('CreateWebContact').item.json.is_new_contact
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Важно!
|
|||
|
|
|
|||
|
|
1. **unified_id должен быть в ответе** - frontend сохраняет его в `formData.unified_id`
|
|||
|
|
2. **При создании/обновлении черновика** - заполнять `clpr_claims.unified_id = unified_id`
|
|||
|
|
3. **Формат телефона**: `79991234567` (11 цифр, начинается с 7)
|
|||
|
|
|
|||
|
|
## Проверка работы
|
|||
|
|
|
|||
|
|
После выполнения запроса проверьте:
|
|||
|
|
```sql
|
|||
|
|
SELECT u.unified_id, u.phone, ua.channel, ua.channel_user_id
|
|||
|
|
FROM clpr_users u
|
|||
|
|
JOIN clpr_user_accounts ua ON u.id = ua.user_id
|
|||
|
|
WHERE ua.channel = 'web_form'
|
|||
|
|
AND ua.channel_user_id = '79991234567';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Должна быть запись с `unified_id` в формате `usr_...`.
|
|||
|
|
|