n8n-nodes-inflow-crm
Version:
Official Inflow CRM integration for n8n. Create, update, search records and handle webhooks with dynamic field support.
116 lines (115 loc) • 5.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeCreateAction = void 0;
const api_1 = require("../../lib/api");
const endpoints_1 = require("../../lib/endpoints");
const logger_1 = require("../../lib/logger");
const helpers_1 = require("../../lib/helpers");
const api_2 = require("../../lib/api");
const fieldsAccess_1 = require("../../access/fieldsAccess");
async function executeCreateAction(itemIndex, moduleName, fields, fileUploads) {
// Context validation
if (!this || typeof this.getNodeParameter !== 'function') {
throw new Error('Context error: IExecuteFunctions context is required');
}
if (!moduleName || typeof moduleName !== 'string') {
throw new Error('module name is required');
}
if (!fields || typeof fields !== 'object' || Object.keys(fields).length === 0) {
throw new Error('fields object is required and must contain at least one field');
}
logger_1.actionsLogger.info('===== STARTING CREATE ACTION =====');
logger_1.actionsLogger.info(`Creating record in module: ${moduleName}`);
logger_1.actionsLogger.info('Fields:', JSON.stringify(fields, null, 2));
logger_1.actionsLogger.info('File uploads:', fileUploads?.length || 0);
try {
logger_1.actionsLogger.info('Starting field validation and processing...');
// Fetch valid API field names for the module
const validFieldNames = await (0, fieldsAccess_1.getValidApiFieldNames)(moduleName, this);
logger_1.actionsLogger.info('Valid API field names:', validFieldNames);
// Filter input fields to only allowed API field names
let filteredFields = (0, fieldsAccess_1.filterFieldsByApiFieldName)(fields, validFieldNames);
logger_1.actionsLogger.info('Filtered fields:', JSON.stringify(filteredFields, null, 2));
// Process fields with relationships (e.g., process fields that need to be split into process ID and stage)
filteredFields = (0, fieldsAccess_1.processFieldsWithRelationships)(filteredFields, validFieldNames);
logger_1.actionsLogger.info('Processed fields:', JSON.stringify(filteredFields, null, 2));
// Check if files are provided
if (fileUploads && fileUploads.length > 0) {
logger_1.actionsLogger.info('Using multipart request with files');
const processedFiles = await helpers_1.processFileUploads.call(this, itemIndex, fileUploads);
// For multipart, all fields must be top-level (not nested under data)
const multipartBody = { module: moduleName, ...filteredFields };
let response;
try {
response = await (0, api_2.inflowApiRequestWithFiles)(this, 'POST', endpoints_1.Endpoints.CREATE_RECORD, multipartBody, processedFiles);
}
catch (apiError) {
logger_1.actionsLogger.error('API request failed with error:', apiError);
if (apiError?.error && apiError.error.code) {
throw new Error(`[${apiError.error.code}] ${apiError.error.message}`);
}
throw apiError;
}
// Expect { data, meta }
if (!response || typeof response !== 'object' || !('data' in response)) {
logger_1.actionsLogger.error('Unexpected API response format:', response);
throw new Error('API returned unexpected response format');
}
return {
json: {
success: true,
operation: 'create',
module: moduleName,
data: response.data,
meta: response.meta,
filesUploaded: processedFiles.length,
},
pairedItem: { item: itemIndex },
};
}
else {
logger_1.actionsLogger.info('Using JSON request (no files)');
const requestBody = {
module: moduleName,
data: filteredFields,
};
logger_1.actionsLogger.info('About to make API request...');
logger_1.actionsLogger.info('Request body:', JSON.stringify(requestBody, null, 2));
let response;
try {
response = await (0, api_1.inflowApiRequest)(this, 'POST', endpoints_1.Endpoints.CREATE_RECORD, requestBody);
logger_1.actionsLogger.info('API request completed successfully');
}
catch (apiError) {
logger_1.actionsLogger.error('API request failed with error:', apiError);
if (apiError?.error && apiError.error.code) {
throw new Error(`[${apiError.error.code}] ${apiError.error.message}`);
}
throw apiError;
}
// Expect { data, meta }
if (!response || typeof response !== 'object' || !('data' in response)) {
logger_1.actionsLogger.error('Unexpected API response format:', response);
throw new Error('API returned unexpected response format');
}
return {
json: {
success: true,
operation: 'create',
module: moduleName,
data: response.data,
meta: response.meta,
},
pairedItem: { item: itemIndex },
};
}
}
catch (error) {
logger_1.actionsLogger.error('Error creating record:', error);
if (error?.error && error.error.code) {
throw new Error(`[${error.error.code}] ${error.error.message}`);
}
throw new Error(`Failed to create record in "${moduleName}": ${error.message || 'unknown error'}`);
}
}
exports.executeCreateAction = executeCreateAction;