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
JavaScript
;
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;