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