UNPKG

n8n-nodes-mautic-advanced

Version:

Enhanced n8n node for Mautic with comprehensive API coverage including tags, campaigns, categories, and advanced contact management

194 lines (193 loc) 9.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.deleteTagV2 = exports.getAllTagsV2 = exports.getTagV2 = exports.updateTagV2 = exports.createTagV2 = exports.deleteTagV1 = exports.getAllTagsV1 = exports.getTagV1 = exports.updateTagV1 = exports.createTagV1 = exports.getMauticVersion = void 0; const ApiHelpers_1 = require("../utils/ApiHelpers"); const DataHelpers_1 = require("../utils/DataHelpers"); const GenericFunctions_1 = require("../GenericFunctions"); Object.defineProperty(exports, "getMauticVersion", { enumerable: true, get: function () { return GenericFunctions_1.getMauticVersion; } }); // ----------------------------- // v1 tag helpers (legacy API) // ----------------------------- async function createTagV1(context, itemIndex) { const tag = (0, ApiHelpers_1.getRequiredParam)(context, 'tag', itemIndex); const body = { tag }; // v1 API ignores description for tags, so we do not send it to avoid confusion. const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', '/tags/new', body); return response.tag; } exports.createTagV1 = createTagV1; async function updateTagV1(context, itemIndex) { const tagId = (0, ApiHelpers_1.getRequiredParam)(context, 'tagId', itemIndex); const createIfNotFound = (0, ApiHelpers_1.getOptionalParam)(context, 'createIfNotFound', itemIndex, false); const updateFields = (0, ApiHelpers_1.getOptionalParam)(context, 'updateFields', itemIndex, {}); const body = {}; if (updateFields.tag) { body.tag = updateFields.tag; } // v1 API ignores description for tags, so we do not send it. const method = createIfNotFound ? 'PUT' : 'PATCH'; const response = await (0, ApiHelpers_1.makeApiRequest)(context, method, `/tags/${tagId}/edit`, body); return response.tag; } exports.updateTagV1 = updateTagV1; async function getTagV1(context, itemIndex) { const tagId = (0, ApiHelpers_1.getRequiredParam)(context, 'tagId', itemIndex); const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'GET', `/tags/${tagId}`); return (0, DataHelpers_1.convertNumericStrings)(response.tag); } exports.getTagV1 = getTagV1; async function getAllTagsV1(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'; if (returnAll) { const limit = (0, ApiHelpers_1.getOptionalParam)(context, 'limit', itemIndex, undefined); const result = await (0, ApiHelpers_1.makePaginatedRequest)(context, 'tags', 'GET', '/tags', {}, qs, limit); return (0, DataHelpers_1.convertNumericStrings)(result); } qs.limit = (0, ApiHelpers_1.getOptionalParam)(context, 'limit', itemIndex, 50); const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'GET', '/tags', {}, qs); const data = response.tags ? Object.values(response.tags) : []; return (0, DataHelpers_1.convertNumericStrings)(data); } exports.getAllTagsV1 = getAllTagsV1; async function deleteTagV1(context, itemIndex) { const tagId = (0, ApiHelpers_1.getRequiredParam)(context, 'tagId', itemIndex); const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'DELETE', `/tags/${tagId}/delete`); return response.tag ?? { success: true }; } exports.deleteTagV1 = deleteTagV1; // ----------------------------- // v2 tag helpers (Mautic 7+) // ----------------------------- function normaliseV2Tag(response) { if (!response) return {}; // JSON:API style if (response.data && typeof response.data === 'object') { const data = response.data; const attributes = (data.attributes || {}); const id = data.id; return (0, DataHelpers_1.convertNumericStrings)({ id, ...attributes, }); } // Plain JSON array or object as per application/json schema if (Array.isArray(response)) { return (0, DataHelpers_1.convertNumericStrings)(response[0] || {}); } if (response.attributes) { return (0, DataHelpers_1.convertNumericStrings)({ id: response.id, ...response.attributes, }); } return (0, DataHelpers_1.convertNumericStrings)(response); } function normaliseV2TagCollection(response) { if (!response) return []; // JSON:API collection if (response.data && Array.isArray(response.data)) { return response.data.map((entry) => normaliseV2Tag({ data: entry })); } // application/json array if (Array.isArray(response)) { return response.map((entry) => (0, DataHelpers_1.convertNumericStrings)(entry)); } // Hydra collection under member if (Array.isArray(response.member)) { return response.member.map((entry) => (0, DataHelpers_1.convertNumericStrings)(entry)); } return []; } async function createTagV2(context, itemIndex) { const tag = (0, ApiHelpers_1.getRequiredParam)(context, 'tag', itemIndex); const description = (0, ApiHelpers_1.getOptionalParam)(context, 'description', itemIndex, ''); const body = { tag, }; if (description) { body.description = description; } const headers = { 'Content-Type': 'application/json' }; const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'POST', '/v2/tags', body, {}, undefined, headers); return normaliseV2Tag(response); } exports.createTagV2 = createTagV2; async function updateTagV2(context, itemIndex) { const tagId = (0, ApiHelpers_1.getRequiredParam)(context, 'tagId', itemIndex); const createIfNotFound = (0, ApiHelpers_1.getOptionalParam)(context, 'createIfNotFound', itemIndex, false); const updateFields = (0, ApiHelpers_1.getOptionalParam)(context, 'updateFields', itemIndex, {}); const body = {}; if (updateFields.tag) { body.tag = updateFields.tag; } if (updateFields.description) { body.description = updateFields.description; } // PUT creates if not found, PATCH only updates existing // v2 API requires specific Content-Type headers const method = createIfNotFound ? 'PUT' : 'PATCH'; const contentType = method === 'PATCH' ? 'application/merge-patch+json' : 'application/json'; const headers = { 'Content-Type': contentType }; const response = await (0, ApiHelpers_1.makeApiRequest)(context, method, `/v2/tags/${tagId}`, body, {}, undefined, headers); return normaliseV2Tag(response); } exports.updateTagV2 = updateTagV2; async function getTagV2(context, itemIndex) { const tagId = (0, ApiHelpers_1.getRequiredParam)(context, 'tagId', itemIndex); const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'GET', `/v2/tags/${tagId}`); return normaliseV2Tag(response); } exports.getTagV2 = getTagV2; async function getAllTagsV2(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); // v2 uses page-based pagination; keep it simple and either: // - fetch once with optional limit // - or loop pages until we reach the requested limit const results = []; let page = 1; const limit = returnAll ? (0, ApiHelpers_1.getOptionalParam)(context, 'limit', itemIndex, undefined) : (0, ApiHelpers_1.getOptionalParam)(context, 'limit', itemIndex, 30); // Basic loop with page parameter; stops when no data or limit reached. // This relies on Mautic's v2 default page size. // We avoid overcomplicating until more pagination tweaking is needed. while (true) { qs.page = page; const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'GET', '/v2/tags', {}, qs); const pageItems = normaliseV2TagCollection(response); if (!pageItems.length) { break; } if (limit !== undefined && results.length + pageItems.length > limit) { const needed = limit - results.length; results.push(...pageItems.slice(0, needed)); break; } else { results.push(...pageItems); } if (limit !== undefined && results.length >= limit) { break; } page += 1; } return results; } exports.getAllTagsV2 = getAllTagsV2; async function deleteTagV2(context, itemIndex) { const tagId = (0, ApiHelpers_1.getRequiredParam)(context, 'tagId', itemIndex); const response = await (0, ApiHelpers_1.makeApiRequest)(context, 'DELETE', `/v2/tags/${tagId}`); // v2 typically returns empty body or JSON-API meta; provide a simple success flag. return response ?? { success: true }; } exports.deleteTagV2 = deleteTagV2;