UNPKG

n8n-nodes-inflow-crm

Version:

Official Inflow CRM integration for n8n. Create, update, search records and handle webhooks with dynamic field support.

160 lines (159 loc) 7.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processFieldsWithRelationships = exports.filterFieldsByApiFieldName = exports.loadProcessOptions = exports.getValidApiFieldNames = exports.loadUserOptions = void 0; const api_1 = require("../lib/api"); const logger_1 = require("../lib/logger"); const endpoints_1 = require("../lib/endpoints"); async function loadUserOptions() { try { logger_1.apiLogger.info('Loading users from /api/getUserList endpoint'); const response = await (0, api_1.inflowApiRequest)(this, 'GET', endpoints_1.Endpoints.GET_USER_LIST); logger_1.apiLogger.info('API Response:', JSON.stringify(response, null, 2)); let users; if (response && typeof response === 'object' && 'data' in response) { users = response.data; } else if (Array.isArray(response)) { users = response; } else { logger_1.apiLogger.warn('Unexpected response format from getUserList:', response); return []; } if (!users || !Array.isArray(users)) { logger_1.apiLogger.warn('No valid users array found'); return []; } const userOptions = users.map((user) => { const systemLabel = user.systemLabel || 'Unknown User'; const email = user.email || 'no-email'; const label = `${systemLabel} (${email})`; return { name: label, value: user.id, }; }); logger_1.apiLogger.info(`Successfully loaded ${userOptions.length} user options`); return userOptions; } catch (error) { logger_1.apiLogger.error('Failed to load user options from getUserList:', error); return []; } } exports.loadUserOptions = loadUserOptions; /** * Fetches valid API field names for a module from /api/getModuleFields. * @param moduleName The module to fetch fields for. * @param context The n8n context (IExecuteFunctions or ILoadOptionsFunctions). * @returns Array of valid apiFieldName strings. */ async function getValidApiFieldNames(moduleName, context) { const logger = context?.logger || console; try { const response = await (0, api_1.inflowApiRequest)(context, 'POST', endpoints_1.Endpoints.GET_MODULE_FIELDS, { module: moduleName }); if (response && Array.isArray(response.data)) { return response.data.map((f) => f.apiFieldName).filter((name) => typeof name === 'string' && !!name); } logger.warn('Unexpected response from getModuleFields:', response); return []; } catch (error) { logger.error('Failed to fetch valid API field names:', error); return []; } } exports.getValidApiFieldNames = getValidApiFieldNames; /** * Loads process options for potential and order modules from the API. * For each process, creates an option for each stage in the format: * "Proces: <process label> z etapu: <stage name>" with the process MongoDB ID as the value. * @returns Array of process stage options in INodePropertyOptions format. */ async function loadProcessOptions() { try { const moduleName = this.getCurrentNodeParameter('module'); if (!moduleName || (moduleName !== 'potential' && moduleName !== 'order')) { logger_1.apiLogger.info(`Module "${moduleName}" does not support processes. Only potential and order modules support processes.`); return []; } logger_1.apiLogger.info(`Loading process options for module: ${moduleName}`); const response = await (0, api_1.inflowApiRequest)(this, 'POST', endpoints_1.Endpoints.GET_PROCESSES_FOR_MODULE, { module: moduleName }); logger_1.apiLogger.info('Process options API response:', JSON.stringify(response, null, 2)); if (response && typeof response === 'object' && 'data' in response) { const { data } = response; if (!Array.isArray(data)) { logger_1.apiLogger.warn('Process options API returned non-array data'); return []; } const processOptions = []; for (const process of data) { const processLabel = process.systemLabel || process.label || `Process ${process.id}`; const stages = process.stagesNames || []; for (const stageName of stages) { processOptions.push({ name: `Proces: ${processLabel} z etapu: ${stageName}`, value: `${process.id}|${stageName}`, }); } } logger_1.apiLogger.info(`Successfully loaded ${processOptions.length} process stage options for ${moduleName}`); return processOptions; } logger_1.apiLogger.warn('Unexpected response format from process options API:', response); return []; } catch (error) { logger_1.apiLogger.error('Failed to load process options:', error); return []; } } exports.loadProcessOptions = loadProcessOptions; /** * Filters an object to only include keys present in validFieldNames. * @param fields The input fields object. * @param validFieldNames Array of allowed field names. * @returns Filtered fields object. */ function filterFieldsByApiFieldName(fields, validFieldNames) { if (!fields || typeof fields !== 'object') return {}; return Object.fromEntries(Object.entries(fields).filter(([key]) => validFieldNames.includes(key))); } exports.filterFieldsByApiFieldName = filterFieldsByApiFieldName; /** * Processes fields to handle process/stage field format. * Extracts process ID and stage name from encoded value (format: "processId|stageName") * and sets both fields accordingly. * * @param fields The input fields object. * @param validFieldNames Array of valid field names from the API. * @returns Processed fields object with process and stage fields properly set. */ function processFieldsWithRelationships(fields, validFieldNames) { if (!fields || typeof fields !== 'object') return fields; const processedFields = { ...fields }; const processFields = validFieldNames.filter(field => /process/i.test(field)); const stageFields = validFieldNames.filter(field => /stage/i.test(field)); for (const processField of processFields) { const prefix = processField.replace(/process/gi, ''); const stageField = stageFields.find(field => field === `${prefix}Stage`) || stageFields.find(field => field === `${prefix}stage`) || stageFields.find(field => field === 'Stage') || stageFields.find(field => field === 'stage'); if (!stageField) continue; if (processField in processedFields && typeof processedFields[processField] === 'string') { const value = processedFields[processField]; if (value.includes('|')) { const [processId, stageName] = value.split('|'); processedFields[processField] = processId; processedFields[stageField] = stageName; logger_1.apiLogger.info(`Processed ${processField}: split "${value}" into processId="${processId}" and ${stageField}="${stageName}"`); } } } return processedFields; } exports.processFieldsWithRelationships = processFieldsWithRelationships;