Files
aiform_prod/docs/N8N_CODE_IN_JAVASCRIPT_КЛИЕНТПРАВ_FULL.js

265 lines
9.0 KiB
JavaScript
Raw Normal View History

// ========================================
// Code Node: Code in JavaScriptКлиентправ
// Формирование Response для фронтенда с поддержкой cf_2624
// ========================================
// --- 1. Генерация UUIDv4 ---
function generateUUIDv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : ((r & 0x3) | 0x8);
return v.toString(16);
});
}
// --- 2. Парсим контакт из CreateWebContacКлиентправ ---
const createWebContactNode = $node["CreateWebContacКлиентправ"] || $node["CreateWebContact"];
const rawResult = createWebContactNode?.json?.result || "";
let contactData = {};
try {
contactData = typeof rawResult === 'string'
? JSON.parse(rawResult)
: rawResult;
} catch (e) {
console.error('❌ Ошибка парсинга CreateWebContact:', e);
contactData = {};
}
// ✅ Извлекаем cf_2624 (Данные подтверждены) из CreateWebContact
// "1" = данные подтверждены, "0" = не подтверждены
const cf_2624 = contactData.cf_2624 || "0";
const contact_data_confirmed = cf_2624 === "1" || cf_2624 === "true" || cf_2624 === true;
const contact_data_can_edit = !contact_data_confirmed;
console.log('🔒 Статус данных контакта из CreateWebContact:', {
contact_id: contactData.contact_id,
is_new: contactData.is_new,
cf_2624: cf_2624,
contact_data_confirmed: contact_data_confirmed,
contact_data_can_edit: contact_data_can_edit
});
// --- 2.1. Получаем полные данные контакта из PostgreSQL (если есть) ---
let contactFromDB = null;
try {
// Пытаемся найти ноду PostgreSQL, которая получила данные контакта
const possiblePostgresNodes = [
'PostgreSQL: Get Contact Data',
'Get Contact from DB',
'PostgreSQL',
'Get Contact Details'
];
for (const nodeName of possiblePostgresNodes) {
try {
const node = $(nodeName)?.first();
if (node && node.json) {
// Проверяем, что это данные контакта (есть contactid)
if (node.json.contactid || node.json.contact_id) {
contactFromDB = node.json;
console.log('✅ Получены данные контакта из PostgreSQL:', {
contactid: contactFromDB.contactid || contactFromDB.contact_id,
firstname: contactFromDB.firstname,
lastname: contactFromDB.lastname
});
break;
}
}
} catch (e) {
continue;
}
}
// Альтернативный способ: ищем по структуре данных
if (!contactFromDB) {
// Может быть в предыдущей ноде с результатом запроса
const inputData = $input.all();
for (const item of inputData) {
if (item.json && (item.json.contactid || item.json.contact_id)) {
contactFromDB = item.json;
break;
}
}
}
} catch (e) {
console.warn('⚠️ Не удалось получить данные контакта из PostgreSQL:', e.message);
}
// Если данные из БД получены - используем их для дополнения информации
if (contactFromDB) {
console.log('📋 Данные контакта из БД:', {
contactid: contactFromDB.contactid,
firstname: contactFromDB.firstname,
lastname: contactFromDB.lastname,
email: contactFromDB.email,
mobile: contactFromDB.mobile,
birthday: contactFromDB.birthday,
mailingstreet: contactFromDB.mailingstreet,
middle_name: contactFromDB.middle_name,
birthplace: contactFromDB.birthplace,
inn: contactFromDB.inn
});
}
// --- 3. Телефон из Edit Fields ---
let phone = null;
try {
const editFields = $('Edit Fields')?.first();
if (editFields && editFields.json) {
phone = editFields.json.phone;
}
} catch (e) {
console.warn('⚠️ Не удалось получить phone из Edit Fields:', e.message);
}
// --- 4. unified_id из user_get ---
let unified_id = null;
try {
const possibleUserNodes = ['user_get', 'Find or Create User', 'PostgreSQL: Find User'];
for (const nodeName of possibleUserNodes) {
try {
const node = $node[nodeName];
if (node && node.json && node.json.unified_id) {
unified_id = node.json.unified_id;
break;
}
} catch (e) {
// Нода не существует или не выполнена - продолжаем поиск
continue;
}
}
if (!unified_id) {
console.warn('⚠️ unified_id не получен из ноды user_get. Проверьте, что нода выполнена.');
}
} catch (e) {
console.warn('⚠️ Не удалось получить unified_id:', e.message);
}
// --- 5. Генерируем session_id (если не получен из предыдущих нод) ---
let session_id = null;
// Пытаемся получить session_id из предыдущих нод
try {
const possibleSessionNodes = [
'Code in JavaScript1',
'Code in JavaScript',
'Set Session Data',
'Create Session'
];
for (const nodeName of possibleSessionNodes) {
try {
const node = $(nodeName)?.first();
if (node && node.json) {
if (node.json.session_id) {
session_id = node.json.session_id;
break;
} else if (node.json.redis_value) {
const parsed = JSON.parse(node.json.redis_value);
if (parsed.session_id) {
session_id = parsed.session_id;
break;
}
}
}
} catch (e) {
continue;
}
}
// Пытаемся получить из Edit Fields
if (!session_id) {
try {
const editFields = $('Edit Fields')?.first();
if (editFields && editFields.json && editFields.json.session_id) {
session_id = editFields.json.session_id;
}
} catch (e) {
// Игнорируем
}
}
} catch (e) {
console.warn('⚠️ Не удалось получить session_id из предыдущих нод:', e.message);
}
// Если session_id не найден - генерируем новый
if (!session_id) {
session_id = 'sess_' + generateUUIDv4();
console.log('✅ Сгенерирован новый session_id:', session_id);
}
// --- 6. Формируем sessionData для Redis ---
const sessionData = {
session_id, // ← теперь сохраняем внутрь
unified_id,
contact_id: contactData.contact_id,
phone,
is_new_contact: contactData.is_new || contactData.is_new_contact || false,
// ✅ Флаги подтверждения данных контакта (из cf_2624)
cf_2624: cf_2624,
contact_data_confirmed: contact_data_confirmed,
contact_data_can_edit: contact_data_can_edit,
// ✅ Данные контакта из PostgreSQL (если получены)
contact_from_db: contactFromDB ? {
contactid: contactFromDB.contactid || contactFromDB.contact_id,
firstname: contactFromDB.firstname,
lastname: contactFromDB.lastname,
email: contactFromDB.email,
mobile: contactFromDB.mobile,
phone: contactFromDB.phone,
birthday: contactFromDB.birthday,
mailingstreet: contactFromDB.mailingstreet,
mailingcity: contactFromDB.mailingcity,
mailingstate: contactFromDB.mailingstate,
mailingzip: contactFromDB.mailingzip,
mailingcountry: contactFromDB.mailingcountry,
middle_name: contactFromDB.middle_name,
birthplace: contactFromDB.birthplace,
inn: contactFromDB.inn,
requisites: contactFromDB.requisites,
code: contactFromDB.code,
sms: contactFromDB.sms
} : null,
status: "draft",
current_step: 1,
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
documents: {},
email: contactFromDB?.email || null,
bank_name: null
};
// --- 7. Возвращаем результат в формате items ---
const result = {
json: {
session: session_id,
session_id,
unified_id,
contact_id: contactData.contact_id,
is_new_contact: contactData.is_new || contactData.is_new_contact || false,
phone,
// ✅ Флаги подтверждения данных контакта (из cf_2624)
cf_2624: cf_2624,
contact_data_confirmed: contact_data_confirmed,
contact_data_can_edit: contact_data_can_edit,
redis_key: `session:${session_id}`,
redis_value: JSON.stringify(sessionData),
ttl: 604800
}
};
// Логируем финальный ответ для отладки
console.log('✅ Сформирован ответ для фронтенда:', {
session_id: result.json.session_id,
has_unified_id: !!result.json.unified_id,
has_contact_id: !!result.json.contact_id,
contact_data_confirmed: result.json.contact_data_confirmed,
cf_2624: result.json.cf_2624,
is_new_contact: result.json.is_new_contact
});
return [result];