121 lines
4.4 KiB
JavaScript
121 lines
4.4 KiB
JavaScript
|
|
// ========================================
|
|||
|
|
// Code Node: Мерж данных проекта в сессию
|
|||
|
|
// ========================================
|
|||
|
|
|
|||
|
|
// 1. Берём первый item
|
|||
|
|
const inputItem = $input.all()[0];
|
|||
|
|
|
|||
|
|
if (!inputItem || !inputItem.json) {
|
|||
|
|
throw new Error('Пустой input в Code Node (нет json)');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// root — то, что реально пришло в эту ноду
|
|||
|
|
const root = inputItem.json;
|
|||
|
|
|
|||
|
|
// 2. Универсально получаем body
|
|||
|
|
// - если нода стоит сразу после Webhook → данные лежат в root.body
|
|||
|
|
// - если кто-то выше уже отдал только body → root и есть body
|
|||
|
|
const body = root.body || root;
|
|||
|
|
|
|||
|
|
// 3. Парсим body.other (если есть) как сессию
|
|||
|
|
let sessionData = {};
|
|||
|
|
const rawOther = body.other;
|
|||
|
|
|
|||
|
|
if (rawOther) {
|
|||
|
|
if (typeof rawOther === 'string') {
|
|||
|
|
try {
|
|||
|
|
sessionData = JSON.parse(rawOther);
|
|||
|
|
} catch (e) {
|
|||
|
|
throw new Error('Не смог распарсить body.other как JSON: ' + e.message + '. rawOther: ' + rawOther);
|
|||
|
|
}
|
|||
|
|
} else if (typeof rawOther === 'object') {
|
|||
|
|
sessionData = rawOther;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 4. Определяем claimId (основной путь)
|
|||
|
|
let claimId = body.claim_id || sessionData.claim_id || null;
|
|||
|
|
|
|||
|
|
// 5. Fallback: пробуем достать claim_id напрямую из Webhook, если его до сих пор нет
|
|||
|
|
if (!claimId) {
|
|||
|
|
try {
|
|||
|
|
const webhookNodeJson = $('Webhook').first()?.json;
|
|||
|
|
if (webhookNodeJson?.body?.claim_id) {
|
|||
|
|
claimId = webhookNodeJson.body.claim_id;
|
|||
|
|
}
|
|||
|
|
} catch (e) {
|
|||
|
|
// молча игнорируем, просто не удалось взять из Webhook
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 6. Если всё ещё нет claimId — это реально критичная ситуация
|
|||
|
|
if (!claimId) {
|
|||
|
|
throw new Error(
|
|||
|
|
'Нет claim_id ни в body, ни в sessionData, ни в Webhook. ' +
|
|||
|
|
'body: ' + JSON.stringify(body) +
|
|||
|
|
', sessionData: ' + JSON.stringify(sessionData)
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 7. Забираем результат ноды CreateClientProject (или CreateWebPorject, если опечатка в названии ноды)
|
|||
|
|
let projectNode = null;
|
|||
|
|
let projectNodeName = null;
|
|||
|
|
|
|||
|
|
// Пробуем найти ноду безопасно
|
|||
|
|
try {
|
|||
|
|
projectNode = $node["CreateClientProject"];
|
|||
|
|
if (projectNode && projectNode.json) {
|
|||
|
|
projectNodeName = "CreateClientProject";
|
|||
|
|
}
|
|||
|
|
} catch (e) {
|
|||
|
|
// Нода CreateClientProject не найдена, пробуем альтернативное название
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!projectNode || !projectNode.json) {
|
|||
|
|
try {
|
|||
|
|
projectNode = $node["CreateWebPorject"];
|
|||
|
|
if (projectNode && projectNode.json) {
|
|||
|
|
projectNodeName = "CreateWebPorject";
|
|||
|
|
}
|
|||
|
|
} catch (e) {
|
|||
|
|
// Нода CreateWebPorject тоже не найдена
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!projectNode || !projectNode.json) {
|
|||
|
|
throw new Error('Нет данных от ноды CreateClientProject/CreateWebPorject. Убедитесь, что нода существует и выполнена.');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const projectResult = projectNode.json.result;
|
|||
|
|
// Ожидаем что-то типа: { "project_id": "398095", "project_name": "Иванов_КлиентПрав", "is_new": false }
|
|||
|
|
|
|||
|
|
if (!projectResult || !projectResult.project_id) {
|
|||
|
|
throw new Error('Нет projectResult.project_id. result: ' + JSON.stringify(projectNode.json));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 8. Собираем обновлённую сессию
|
|||
|
|
const updatedSession = {
|
|||
|
|
...sessionData, // всё, что было в other
|
|||
|
|
claim_id: claimId, // актуальный claim_id
|
|||
|
|
project_id: projectResult.project_id, // id проекта из CRM
|
|||
|
|
project_name: projectResult.project_name || null, // название проекта из CRM (новое поле)
|
|||
|
|
is_new_project: projectResult.is_new, // флаг новый/старый
|
|||
|
|
current_step: 2, // двигаем визард на шаг 2
|
|||
|
|
updated_at: new Date().toISOString(),
|
|||
|
|
// опционально дотащим полезные поля из body:
|
|||
|
|
problem: body.problem ?? sessionData.problem,
|
|||
|
|
last_analysis_output: body.output ?? sessionData.last_analysis_output,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 9. Возвращаем один item для Redis SET
|
|||
|
|
return [
|
|||
|
|
{
|
|||
|
|
json: {
|
|||
|
|
redis_key: `claim:${claimId}`,
|
|||
|
|
redis_value: JSON.stringify(updatedSession),
|
|||
|
|
ttl: 604800, // 7 дней
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
];
|
|||
|
|
|