@kadam-net/n8n-nodes-kadam
Version:
Kadam node for n8n to manage campaigns, creatives, and more.
242 lines • 10.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createCreative = createCreative;
exports.updateCreative = updateCreative;
exports.deleteCreative = deleteCreative;
exports.getCreatives = getCreatives;
exports.getBannerSizes = getBannerSizes;
exports.uploadMedia = uploadMedia;
const utils_1 = require("./utils");
const form_data_1 = __importDefault(require("form-data"));
async function createCreative(i, baseUrl, headers, appId) {
try {
const campaignId = this.getNodeParameter('campaignId', i);
const title = this.getNodeParameter('title', i);
const text = this.getNodeParameter('text', i, '');
const linkUrl = this.getNodeParameter('linkUrl', i);
const linkMedia = this.getNodeParameter('linkMedia', i);
const linkMediaRect = this.getNodeParameter('linkMediaRect', i, '');
const pauseAfterModerate = this.getNodeParameter('pauseAfterModerate', i, false);
const size = this.getNodeParameter('size', i, '');
const bidsCollection = this.getNodeParameter('bidsCollection', i, { bidsValues: [] });
const bids = {};
for (const item of bidsCollection.bidsValues || []) {
bids[item.countryId] = { bid: item.bid };
}
const creativeData = {
campaign_id: campaignId,
title,
link_url: linkUrl,
link_media: linkMedia,
client_id: appId,
};
if (text)
creativeData.text = text;
if (linkMediaRect)
creativeData.link_media_rect = linkMediaRect;
if (pauseAfterModerate)
creativeData.pause_after_moderate = 1;
if (size)
creativeData.size = size;
if (Object.keys(bids).length > 0)
creativeData.bids = bids;
const data = [creativeData];
this.logger.debug(`Creating creative with data: ${JSON.stringify(data)}`);
const response = await utils_1.makeApiRequest.call(this, 'put', `${baseUrl}/ads.materials.put`, headers, { app_id: appId }, { data: JSON.stringify(data) });
if (response && typeof response === 'object') {
if ('data' in response) {
return response.data;
}
else if ('response' in response) {
return response.response;
}
}
return response;
}
catch (error) {
this.logger.error(`Error in createCreative: ${error.message}`);
throw error;
}
}
async function updateCreative(i, baseUrl, headers, appId) {
const data = this.getNodeParameter('data', i);
if (Array.isArray(data)) {
data.forEach(item => item.client_id = appId);
}
else if (typeof data === 'object' && data !== null) {
data.client_id = appId;
}
return utils_1.makeApiRequest.call(this, 'post', `${baseUrl}/ads.materials.update`, headers, { app_id: appId }, { data });
}
async function deleteCreative(i, baseUrl, headers, appId) {
try {
const ids = this.getNodeParameter('ids', i);
let formattedIds = ids;
if (!ids.startsWith('[') && !ids.startsWith('"')) {
if (ids.includes(',')) {
formattedIds = JSON.stringify(ids.split(',').map(id => id.trim()));
}
else {
formattedIds = `"${ids}"`;
}
}
const params = {
app_id: appId,
client_id: appId,
account_id: appId,
ids: formattedIds,
};
this.logger.debug(`Deleting creatives with params: ${JSON.stringify(params)}`);
const response = await utils_1.makeApiRequest.call(this, 'delete', `${baseUrl}/ads.materials.delete`, headers, params);
if (response && typeof response === 'object') {
if ('data' in response) {
return response.data;
}
else if ('response' in response) {
return response.response;
}
}
return response;
}
catch (error) {
this.logger.error(`Error in deleteCreative: ${error.message}`);
throw error;
}
}
async function getCreatives(i, baseUrl, headers, appId) {
try {
const archiveStatus = this.getNodeParameter('archive', i, false) ? 1 : 0;
const selectedCampaignIds = this.getNodeParameter('campaignIds', i, []);
const selectedCreativeIds = this.getNodeParameter('creativeIds', i, []);
const adFormat = this.getNodeParameter('adFormat', i);
const params = {
app_id: appId,
account_id: appId,
client_id: appId,
archive: archiveStatus,
ad_format: adFormat,
};
if (selectedCampaignIds && selectedCampaignIds.length > 0) {
params.campaign_ids = selectedCampaignIds.join(',');
this.logger.debug(`Filtering creatives by campaigns: ${params.campaign_ids}`);
}
if (selectedCreativeIds && selectedCreativeIds.length > 0) {
params.material_ids = selectedCreativeIds.join(',');
this.logger.debug(`Filtering creatives by IDs: ${params.material_ids}`);
}
this.logger.debug(`Getting creatives with params: ${JSON.stringify(params)}`);
const returnAll = this.getNodeParameter('returnAll', i, false);
if (!returnAll) {
const limit = this.getNodeParameter('limit', i, 10);
params.limit = limit;
const offset = this.getNodeParameter('offset', i, 0);
if (offset > 0) {
params.offset = offset;
}
this.logger.debug(`Pagination: limit=${limit}, offset=${offset || 0}`);
}
const response = await utils_1.fetchAll.call(this, `${baseUrl}/ads.materials.get`, headers, params);
let creatives = [];
if (response && typeof response === 'object') {
const responseObj = response;
if (responseObj.response && Array.isArray(responseObj.response.items)) {
creatives = responseObj.response.items;
}
else if (Array.isArray(responseObj)) {
creatives = responseObj;
}
else if (responseObj.items && Array.isArray(responseObj.items)) {
creatives = responseObj.items;
}
}
const cleanCreatives = creatives.map((creative) => {
if (creative.id !== undefined && typeof creative.id !== 'string') {
creative.id = String(creative.id);
}
if (creative.status !== undefined) {
creative.status_text = creative.status === 1 ? 'Active' : 'Paused';
}
return creative;
});
this.logger.debug(`Retrieved ${cleanCreatives.length} creatives`);
return cleanCreatives;
}
catch (error) {
this.logger.error(`Error in getCreatives: ${error.message}`);
throw error;
}
}
async function getBannerSizes(i, baseUrl, headers, appId) {
try {
const params = { app_id: appId, client_id: appId };
this.logger.debug(`Getting banner sizes with params: ${JSON.stringify(params)}`);
const response = await utils_1.makeApiRequest.call(this, 'get', `${baseUrl}/ads.materials.banner.sizes.get`, headers, params);
let bannerSizes = [];
if (response && typeof response === 'object') {
const responseObj = response;
if (responseObj.response && typeof responseObj.response === 'object') {
const responseData = responseObj.response;
if (Array.isArray(responseData.items)) {
bannerSizes = responseData.items;
}
else if (Array.isArray(responseData.sizes)) {
bannerSizes = responseData.sizes;
}
}
else if (Array.isArray(responseObj.items)) {
bannerSizes = responseObj.items;
}
}
this.logger.debug(`Retrieved ${bannerSizes.length} banner sizes`);
return bannerSizes;
}
catch (error) {
this.logger.error(`Error in getBannerSizes: ${error.message}`);
throw error;
}
}
async function uploadMedia(i, baseUrl, headers, appId) {
try {
const binaryPropertyName = this.getNodeParameter('file', i);
if (!binaryPropertyName) {
throw new Error('Binary property name is required for uploadMedia operation');
}
const adFormat = this.getNodeParameter('adFormat', i);
this.logger.debug(`Uploading media with format ${adFormat}`);
const binaryData = await this.helpers.getBinaryDataBuffer(i, binaryPropertyName);
if (!binaryData) {
throw new Error(`No binary data found in property '${binaryPropertyName}'`);
}
const binaryProperty = this.helpers.assertBinaryData(i, binaryPropertyName);
const fileName = binaryProperty.fileName || 'file';
const mimeType = binaryProperty.mimeType || 'application/octet-stream';
const formData = new form_data_1.default();
formData.append('file', new Blob([binaryData], { type: mimeType }), fileName);
formData.append('app_id', appId);
formData.append('ad_format', adFormat);
this.logger.debug(`Uploading media file: ${fileName} (${mimeType})`);
const response = await utils_1.makeApiRequest.call(this, 'post', `${baseUrl}/data.upload.media`, { ...headers, 'Content-Type': 'multipart/form-data' }, undefined, formData);
if (response && typeof response === 'object') {
const responseObj = response;
this.logger.debug('Media upload successful');
if (responseObj.response && typeof responseObj.response === 'object') {
const responseData = responseObj.response;
if (responseData.id) {
this.logger.info(`Uploaded media ID: ${responseData.id}`);
return { id: responseData.id, ...responseData };
}
return responseData;
}
return responseObj;
}
return response;
}
catch (error) {
this.logger.error(`Error in uploadMedia: ${error.message}`);
throw error;
}
}
//# sourceMappingURL=creatives.js.map