n8n-nodes-mautic-advanced
Version:
Enhanced n8n node for Mautic with comprehensive API coverage including tags, campaigns, categories, and advanced contact management
249 lines (248 loc) • 12.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeCompanyContactOperation = exports.executeCampaignContactOperation = exports.executeContactSegmentOperation = exports.executeSegmentEmailOperation = exports.executeCategoryOperation = exports.executeTagOperation = void 0;
const n8n_workflow_1 = require("n8n-workflow");
const ApiHelpers_1 = require("../utils/ApiHelpers");
const DataHelpers_1 = require("../utils/DataHelpers");
const TagOperations_1 = require("./TagOperations");
// Public execute entry points
async function executeTagOperation(context, operation, i) {
try {
const mauticVersion = await (0, TagOperations_1.getMauticVersion)(context);
const useV2Tags = mauticVersion === 'v7';
let responseData;
switch (operation) {
case 'create':
responseData = useV2Tags ? await (0, TagOperations_1.createTagV2)(context, i) : await (0, TagOperations_1.createTagV1)(context, i);
break;
case 'update':
responseData = useV2Tags ? await (0, TagOperations_1.updateTagV2)(context, i) : await (0, TagOperations_1.updateTagV1)(context, i);
break;
case 'get':
responseData = useV2Tags ? await (0, TagOperations_1.getTagV2)(context, i) : await (0, TagOperations_1.getTagV1)(context, i);
break;
case 'getAll':
responseData = useV2Tags ? await (0, TagOperations_1.getAllTagsV2)(context, i) : await (0, TagOperations_1.getAllTagsV1)(context, i);
break;
case 'delete':
responseData = useV2Tags ? await (0, TagOperations_1.deleteTagV2)(context, i) : await (0, TagOperations_1.deleteTagV1)(context, i);
break;
default:
throw new n8n_workflow_1.NodeOperationError(context.getNode(), `Operation '${operation}' is not supported for Tag resource.`, { itemIndex: i });
}
return context.helpers.returnJsonArray((0, DataHelpers_1.wrapSingleItem)(responseData));
}
catch (error) {
return (0, ApiHelpers_1.handleApiError)(context, error, operation, 'Tag');
}
}
exports.executeTagOperation = executeTagOperation;
async function executeCategoryOperation(context, operation, i) {
try {
let responseData;
switch (operation) {
case 'create':
responseData = await createCategory(context, i);
break;
case 'update':
responseData = await updateCategory(context, i);
break;
case 'get':
responseData = await getCategory(context, i);
break;
case 'getAll':
responseData = await getAllCategories(context, i);
break;
case 'delete':
responseData = await deleteCategory(context, i);
break;
default:
throw new n8n_workflow_1.NodeOperationError(context.getNode(), `Operation '${operation}' is not supported for Category resource.`, { itemIndex: i });
}
return context.helpers.returnJsonArray((0, DataHelpers_1.wrapSingleItem)(responseData));
}
catch (error) {
return (0, ApiHelpers_1.handleApiError)(context, error, operation, 'Category');
}
}
exports.executeCategoryOperation = executeCategoryOperation;
async function executeSegmentEmailOperation(context, operation, i) {
try {
let responseData;
switch (operation) {
case 'send':
responseData = await sendEmail(context, i);
break;
default:
throw new n8n_workflow_1.NodeOperationError(context.getNode(), `Operation '${operation}' is not supported for Segment Email resource.`, { itemIndex: i });
}
return context.helpers.returnJsonArray((0, DataHelpers_1.wrapSingleItem)(responseData));
}
catch (error) {
return (0, ApiHelpers_1.handleApiError)(context, error, operation, 'Segment Email');
}
}
exports.executeSegmentEmailOperation = executeSegmentEmailOperation;
async function executeContactSegmentOperation(context, operation, i) {
try {
let responseData;
switch (operation) {
case 'add':
responseData = await addContactToSegment(context, i);
break;
case 'remove':
responseData = await removeContactFromSegment(context, i);
break;
default:
throw new n8n_workflow_1.NodeOperationError(context.getNode(), `Operation '${operation}' is not supported for Contact Segment resource.`, { itemIndex: i });
}
return context.helpers.returnJsonArray((0, DataHelpers_1.wrapSingleItem)(responseData));
}
catch (error) {
return (0, ApiHelpers_1.handleApiError)(context, error, operation, 'Contact Segment');
}
}
exports.executeContactSegmentOperation = executeContactSegmentOperation;
async function executeCampaignContactOperation(context, operation, i) {
try {
let responseData;
switch (operation) {
case 'add':
responseData = await addContactToCampaign(context, i);
break;
case 'remove':
responseData = await removeContactFromCampaign(context, i);
break;
default:
throw new n8n_workflow_1.NodeOperationError(context.getNode(), `Operation '${operation}' is not supported for Campaign Contact resource.`, { itemIndex: i });
}
return context.helpers.returnJsonArray((0, DataHelpers_1.wrapSingleItem)(responseData));
}
catch (error) {
return (0, ApiHelpers_1.handleApiError)(context, error, operation, 'Campaign Contact');
}
}
exports.executeCampaignContactOperation = executeCampaignContactOperation;
async function executeCompanyContactOperation(context, operation, i) {
try {
let responseData;
switch (operation) {
case 'add':
responseData = await addContactToCompany(context, i);
break;
case 'remove':
responseData = await removeContactFromCompany(context, i);
break;
default:
throw new n8n_workflow_1.NodeOperationError(context.getNode(), `Operation '${operation}' is not supported for Company Contact resource.`, { itemIndex: i });
}
return context.helpers.returnJsonArray((0, DataHelpers_1.wrapSingleItem)(responseData));
}
catch (error) {
return (0, ApiHelpers_1.handleApiError)(context, error, operation, 'Company Contact');
}
}
exports.executeCompanyContactOperation = executeCompanyContactOperation;
// Category operations
async function createCategory(context, itemIndex) {
const body = {
title: (0, ApiHelpers_1.getRequiredParam)(context, 'title', itemIndex),
bundle: (0, ApiHelpers_1.getRequiredParam)(context, 'bundle', itemIndex),
};
const description = (0, ApiHelpers_1.getOptionalParam)(context, 'description', itemIndex, '');
if (description)
body.description = description;
const color = (0, ApiHelpers_1.getOptionalParam)(context, 'color', itemIndex, '');
if (color) {
// Mautic API expects hex color without # prefix (e.g., "b36262")
// n8n color picker returns with # prefix, so we strip it if present
body.color = color.startsWith('#') ? color.substring(1) : color;
}
const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', '/categories/new', body);
return response.category;
}
async function updateCategory(context, itemIndex) {
const categoryId = (0, ApiHelpers_1.getRequiredParam)(context, 'categoryId', itemIndex);
const createIfNotFound = (0, ApiHelpers_1.getOptionalParam)(context, 'createIfNotFound', itemIndex, false);
const updateFields = (0, ApiHelpers_1.getOptionalParam)(context, 'updateFields', itemIndex, {});
const body = {};
if (updateFields.title)
body.title = updateFields.title;
if (updateFields.description)
body.description = updateFields.description;
if (updateFields.color) {
// Mautic API expects hex color without # prefix (e.g., "b36262")
// n8n color picker returns with # prefix, so we strip it if present
const color = updateFields.color;
body.color = color.startsWith('#') ? color.substring(1) : color;
}
if (updateFields.bundle)
body.bundle = updateFields.bundle;
const method = createIfNotFound ? 'PUT' : 'PATCH';
const response = await (0, ApiHelpers_1.makeApiRequest)(context, method, `/categories/${categoryId}/edit`, body);
return response.category;
}
async function getCategory(context, itemIndex) {
const categoryId = (0, ApiHelpers_1.getRequiredParam)(context, 'categoryId', itemIndex);
const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'GET', `/categories/${categoryId}`);
return (0, DataHelpers_1.convertNumericStrings)(response.category);
}
async function getAllCategories(context, itemIndex) {
const returnAll = (0, ApiHelpers_1.getOptionalParam)(context, 'returnAll', itemIndex, false);
const options = (0, ApiHelpers_1.getOptionalParam)(context, 'options', itemIndex, {});
const qs = (0, DataHelpers_1.buildQueryFromOptions)(options);
if (!qs.orderBy)
qs.orderBy = 'id';
if (!qs.orderByDir)
qs.orderByDir = 'asc';
let limit = undefined;
if (!returnAll) {
limit = (0, ApiHelpers_1.getOptionalParam)(context, 'limit', itemIndex, 30);
}
const result = await (0, ApiHelpers_1.makePaginatedRequest)(context, 'categories', 'GET', '/categories', {}, qs, limit);
return (0, DataHelpers_1.convertNumericStrings)(result);
}
async function deleteCategory(context, itemIndex) {
const categoryId = (0, ApiHelpers_1.getRequiredParam)(context, 'categoryId', itemIndex);
const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'DELETE', `/categories/${categoryId}/delete`);
return response.category ?? { success: true };
}
// Email operations
async function sendEmail(context, itemIndex) {
const segmentEmailId = (0, ApiHelpers_1.getRequiredParam)(context, 'segmentEmailId', itemIndex);
const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', `/emails/${segmentEmailId}/send`);
return response;
}
// Contact-Segment relationships
async function addContactToSegment(context, itemIndex) {
const contactId = (0, ApiHelpers_1.getRequiredParam)(context, 'contactId', itemIndex);
const segmentId = (0, ApiHelpers_1.getRequiredParam)(context, 'segmentId', itemIndex);
return await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', `/segments/${segmentId}/contact/${contactId}/add`);
}
async function removeContactFromSegment(context, itemIndex) {
const contactId = (0, ApiHelpers_1.getRequiredParam)(context, 'contactId', itemIndex);
const segmentId = (0, ApiHelpers_1.getRequiredParam)(context, 'segmentId', itemIndex);
return await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', `/segments/${segmentId}/contact/${contactId}/remove`);
}
// Campaign-Contact relationships
async function addContactToCampaign(context, itemIndex) {
const contactId = (0, ApiHelpers_1.getRequiredParam)(context, 'contactId', itemIndex);
const campaignId = (0, ApiHelpers_1.getRequiredParam)(context, 'campaignId', itemIndex);
return await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', `/campaigns/${campaignId}/contact/${contactId}/add`);
}
async function removeContactFromCampaign(context, itemIndex) {
const contactId = (0, ApiHelpers_1.getRequiredParam)(context, 'contactId', itemIndex);
const campaignId = (0, ApiHelpers_1.getRequiredParam)(context, 'campaignId', itemIndex);
return await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', `/campaigns/${campaignId}/contact/${contactId}/remove`);
}
// Company-Contact relationships
async function addContactToCompany(context, itemIndex) {
const contactId = (0, ApiHelpers_1.getRequiredParam)(context, 'contactId', itemIndex);
const companyId = (0, ApiHelpers_1.getRequiredParam)(context, 'companyId', itemIndex);
return await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', `/companies/${companyId}/contact/${contactId}/add`, {});
}
async function removeContactFromCompany(context, itemIndex) {
const contactId = (0, ApiHelpers_1.getRequiredParam)(context, 'contactId', itemIndex);
const companyId = (0, ApiHelpers_1.getRequiredParam)(context, 'companyId', itemIndex);
return await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', `/companies/${companyId}/contact/${contactId}/remove`, {});
}