# Обновление Response Node в n8n: Добавление unified_id ## Проблема В текущем Response Node отсутствует `unified_id`, который необходим для поиска черновиков на фронтенде. ## Решение ### Шаг 1: Убедитесь, что есть нода `user_get` Это PostgreSQL нода, которая выполняет SQL запрос из `SQL_FIND_OR_CREATE_USER_WEB_FORM.sql`. **Настройки ноды:** - **Name**: `user_get` (или другое имя, но должно совпадать в коде) - **Operation**: Execute Query - **Query**: SQL из `SQL_FIND_OR_CREATE_USER_WEB_FORM.sql` - **Parameters**: `$1 = {{$json.phone}}` (нормализованный телефон) **Результат ноды:** ```json { "unified_id": "usr_90599ff2-ac79-4236-b950-0df85395096c", "user_id": 1 } ``` ### Шаг 2: Обновите Code Node перед Response **Вариант 1: Простая версия** ```javascript // ======================================== // Code Node: Формирование Response для фронта // (перед финальной Response нодой) // ======================================== const claimResult = $node["CreateWebContact"].json.result; const sessionData = JSON.parse($('Code in JavaScript1').first().json.redis_value); const userData = $node["user_get"].json; // ← Данные из PostgreSQL return { success: true, result: { claim_id: sessionData.claim_id, contact_id: sessionData.contact_id, project_id: sessionData.project_id, // Unified ID из PostgreSQL (обязательно!) unified_id: userData.unified_id, // ← ДОБАВЛЕНО! ticket_id: claimResult.ticket_id, ticket_number: claimResult.ticket_number, title: claimResult.title, category: claimResult.category, status: claimResult.status, event_type: sessionData.event_type, current_step: sessionData.current_step, updated_at: sessionData.updated_at, is_new_contact: claimResult.is_new_contact || false } }; ``` **Вариант 2: Безопасная версия с проверками** ```javascript // ======================================== // Code Node: Формирование Response для фронта (безопасная версия) // ======================================== const claimResult = $node["CreateWebContact"]?.json?.result || {}; const sessionDataItem = $('Code in JavaScript1')?.first(); const sessionData = sessionDataItem?.json?.redis_value ? JSON.parse(sessionDataItem.json.redis_value) : {}; const userData = $node["user_get"]?.json || {}; // ← Данные из PostgreSQL // Проверяем наличие unified_id (критически важно!) if (!userData.unified_id) { console.error('❌ ОШИБКА: unified_id не получен из ноды user_get!'); // Можно либо выбросить ошибку, либо продолжить без unified_id (не рекомендуется) } return { success: true, result: { claim_id: sessionData.claim_id || claimResult.claim_id, contact_id: sessionData.contact_id || claimResult.contact_id, project_id: sessionData.project_id, // Unified ID из PostgreSQL (обязательно!) unified_id: userData.unified_id, // ← ДОБАВЛЕНО! ticket_id: claimResult.ticket_id, ticket_number: claimResult.ticket_number, title: claimResult.title, category: claimResult.category, status: claimResult.status, event_type: sessionData.event_type, current_step: sessionData.current_step || 1, updated_at: sessionData.updated_at || new Date().toISOString(), is_new_contact: claimResult.is_new_contact || false } }; ``` ## Порядок нод в workflow 1. **Webhook** → получает `{phone, session_id, form_id}` 2. **Code in JavaScript1** → получает данные из Redis 3. **CreateWebContact** → создает/находит контакт в CRM 4. **user_get** (PostgreSQL) → находит/создает пользователя → возвращает `unified_id` 5. **Code Node** (этот код) → формирует финальный ответ 6. **Response** → возвращает ответ фронтенду ## Важно! 1. **Имя ноды**: Убедитесь, что имя ноды PostgreSQL совпадает с `$node["user_get"]` в коде 2. **unified_id обязателен**: Без него фронтенд не сможет найти черновики 3. **Проверка**: Добавьте проверку на наличие `unified_id` перед возвратом ответа ## Ожидаемый формат ответа ```json { "success": true, "result": { "claim_id": "CLM-2025-11-19-7O55SP", "contact_id": "398644", "project_id": "12345", "unified_id": "usr_90599ff2-ac79-4236-b950-0df85395096c", // ← ОБЯЗАТЕЛЬНО! "ticket_id": "45678", "ticket_number": "HD001234", "title": "Заявка", "category": "Категория", "status": "Новая", "event_type": null, "current_step": 1, "updated_at": "2025-11-19T15:15:07.323Z", "is_new_contact": false } } ```