n8n-nodes-zuckzapgo
Version:
n8n community nodes for ZuckZapGo - WhatsApp Multi-Device REST API
706 lines • 30.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ZuckZapGoNewsletter = void 0;
const GenericFunctions_1 = require("../GenericFunctions");
class ZuckZapGoNewsletter {
constructor() {
this.description = {
displayName: 'ZuckZapGo Newsletter',
name: 'zuckzapgoNewsletter',
icon: 'file:zuckzapgo.svg',
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"]}}',
description: 'Manage WhatsApp newsletters/channels using ZuckZapGo API',
defaults: {
name: 'ZuckZapGo Newsletter',
},
inputs: ["main" /* NodeConnectionType.Main */],
outputs: ["main" /* NodeConnectionType.Main */],
credentials: [
{
name: 'zuckzapgoApi',
required: true,
},
],
properties: [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
options: [
{
name: 'List Newsletters',
value: 'listNewsletters',
description: 'List all newsletters',
action: 'List newsletters',
},
{
name: 'Create Newsletter',
value: 'createNewsletter',
description: 'Create a new newsletter',
action: 'Create newsletter',
},
{
name: 'Get Newsletter Info',
value: 'getNewsletterInfo',
description: 'Get information about a specific newsletter',
action: 'Get newsletter info',
},
{
name: 'Get Subscribed Newsletters',
value: 'getSubscribedNewsletters',
description: 'Get list of subscribed newsletters',
action: 'Get subscribed newsletters',
},
{
name: 'Send Newsletter Message',
value: 'sendNewsletterMessage',
description: 'Send a message to newsletter',
action: 'Send newsletter message',
},
{
name: 'Subscribe Newsletter',
value: 'subscribeNewsletter',
description: 'Subscribe to a newsletter',
action: 'Subscribe newsletter',
},
{
name: 'Subscribe with Invite',
value: 'subscribeNewsletterInvite',
description: 'Subscribe using invite code',
action: 'Subscribe with invite',
},
{
name: 'Unsubscribe Newsletter',
value: 'unsubscribeNewsletter',
description: 'Unsubscribe from newsletter',
action: 'Unsubscribe newsletter',
},
{
name: 'Unsubscribe with Invite',
value: 'unsubscribeNewsletterInvite',
description: 'Unsubscribe using invite code',
action: 'Unsubscribe with invite',
},
{
name: 'Mute Newsletter',
value: 'muteNewsletter',
description: 'Mute/unmute newsletter notifications',
action: 'Mute newsletter',
},
{
name: 'Get Newsletter Messages',
value: 'getNewsletterMessages',
description: 'Get messages from newsletter',
action: 'Get newsletter messages',
},
{
name: 'Send Newsletter Reaction',
value: 'sendNewsletterReaction',
description: 'React to newsletter message',
action: 'Send newsletter reaction',
},
{
name: 'Mark Newsletter Viewed',
value: 'markNewsletterViewed',
description: 'Mark newsletter messages as viewed',
action: 'Mark newsletter viewed',
},
{
name: 'Subscribe Live Updates',
value: 'subscribeNewsletterLiveUpdates',
description: 'Subscribe to live updates',
action: 'Subscribe live updates',
},
{
name: 'Get Message Updates',
value: 'getNewsletterMessageUpdates',
description: 'Get newsletter message updates',
action: 'Get message updates',
},
{
name: 'Accept TOS Notice',
value: 'acceptTOSNotice',
description: 'Accept terms of service notice',
action: 'Accept tos notice',
},
{
name: 'Send Admin Invite',
value: 'sendNewsletterAdminInvite',
description: 'Send admin invite to newsletter',
action: 'Send admin invite',
},
],
default: 'listNewsletters',
},
// Create Newsletter fields
{
displayName: 'Newsletter Name',
name: 'name',
type: 'string',
default: '',
placeholder: 'My Newsletter',
description: 'Name of the newsletter (max 25 characters)',
required: true,
displayOptions: {
show: {
operation: ['createNewsletter'],
},
},
},
{
displayName: 'Description',
name: 'description',
type: 'string',
default: '',
placeholder: 'Newsletter description',
description: 'Description of the newsletter (optional)',
displayOptions: {
show: {
operation: ['createNewsletter'],
},
},
},
{
displayName: 'Picture',
name: 'picture',
type: 'string',
default: '',
placeholder: 'data:image/jpeg;base64,... or https://...',
description: 'Base64 encoded image or URL for newsletter picture (optional)',
displayOptions: {
show: {
operation: ['createNewsletter'],
},
},
},
// Newsletter JID field (common)
{
displayName: 'Newsletter JID',
name: 'newsletterJid',
type: 'string',
default: '',
placeholder: '120363025246943103@newsletter',
description: 'The JID of the newsletter',
required: true,
displayOptions: {
show: {
operation: [
'getNewsletterInfo',
'sendNewsletterMessage',
'subscribeNewsletter',
'unsubscribeNewsletter',
'muteNewsletter',
'getNewsletterMessages',
'sendNewsletterReaction',
'markNewsletterViewed',
'subscribeNewsletterLiveUpdates',
'getNewsletterMessageUpdates',
'sendNewsletterAdminInvite',
],
},
},
},
// Invite Code field
{
displayName: 'Invite Code',
name: 'inviteCode',
type: 'string',
default: '',
placeholder: 'ABCD1234EFGH',
description: 'Newsletter invite code',
required: true,
displayOptions: {
show: {
operation: ['subscribeNewsletterInvite', 'unsubscribeNewsletterInvite'],
},
},
},
// Send Message fields
{
displayName: 'Message Type',
name: 'messageType',
type: 'options',
default: 'text',
options: [
{
name: 'Text',
value: 'text',
description: 'Send text message',
},
{
name: 'Image',
value: 'image',
description: 'Send image message',
},
{
name: 'Video',
value: 'video',
description: 'Send video message',
},
{
name: 'Document',
value: 'document',
description: 'Send document message',
},
{
name: 'Audio',
value: 'audio',
description: 'Send audio message',
},
],
displayOptions: {
show: {
operation: ['sendNewsletterMessage'],
},
},
},
{
displayName: 'Message',
name: 'message',
type: 'string',
default: '',
placeholder: 'Your newsletter message',
description: 'Text message content',
required: true,
displayOptions: {
show: {
operation: ['sendNewsletterMessage'],
messageType: ['text'],
},
},
},
{
displayName: 'Media',
name: 'media',
type: 'string',
default: '',
placeholder: 'data:image/jpeg;base64,... or https://...',
description: 'Base64 encoded media or URL',
required: true,
displayOptions: {
show: {
operation: ['sendNewsletterMessage'],
messageType: ['image', 'video', 'document', 'audio'],
},
},
},
{
displayName: 'Caption',
name: 'caption',
type: 'string',
default: '',
placeholder: 'Media caption',
description: 'Caption for media messages (optional)',
displayOptions: {
show: {
operation: ['sendNewsletterMessage'],
messageType: ['image', 'video', 'document', 'audio'],
},
},
},
{
displayName: 'File Name',
name: 'fileName',
type: 'string',
default: '',
placeholder: 'document.pdf',
description: 'File name for document messages',
displayOptions: {
show: {
operation: ['sendNewsletterMessage'],
messageType: ['document'],
},
},
},
// Mute Newsletter field
{
displayName: 'Mute',
name: 'mute',
type: 'boolean',
default: true,
description: 'Whether to mute or unmute the newsletter',
displayOptions: {
show: {
operation: ['muteNewsletter'],
},
},
},
// Get Messages fields
{
displayName: 'Count',
name: 'count',
type: 'number',
default: 25,
description: 'Number of messages to retrieve',
displayOptions: {
show: {
operation: ['getNewsletterMessages', 'getNewsletterMessageUpdates'],
},
},
},
{
displayName: 'Before Message ID',
name: 'before',
type: 'string',
default: '',
placeholder: '123456',
description: 'Get messages before this message server ID (optional)',
displayOptions: {
show: {
operation: ['getNewsletterMessages'],
},
},
},
// Reaction fields
{
displayName: 'Server ID',
name: 'serverId',
type: 'number',
default: 0,
description: 'Server ID of the message to react to',
required: true,
displayOptions: {
show: {
operation: ['sendNewsletterReaction'],
},
},
},
{
displayName: 'Reaction',
name: 'reaction',
type: 'string',
default: '',
placeholder: '👍',
description: 'Emoji reaction to send',
required: true,
displayOptions: {
show: {
operation: ['sendNewsletterReaction'],
},
},
},
// Mark Viewed fields
{
displayName: 'Server IDs',
name: 'serverIds',
type: 'string',
default: '',
placeholder: '123,456,789',
description: 'Comma-separated list of server IDs to mark as viewed',
required: true,
displayOptions: {
show: {
operation: ['markNewsletterViewed'],
},
},
},
// Message Updates fields
{
displayName: 'Since Timestamp',
name: 'since',
type: 'number',
default: 0,
description: 'Unix timestamp to get updates since (optional)',
displayOptions: {
show: {
operation: ['getNewsletterMessageUpdates'],
},
},
},
{
displayName: 'After Server ID',
name: 'after',
type: 'number',
default: 0,
description: 'Get updates after this server ID (optional)',
displayOptions: {
show: {
operation: ['getNewsletterMessageUpdates'],
},
},
},
// TOS Notice fields
{
displayName: 'Notice ID',
name: 'noticeId',
type: 'string',
default: '20601218',
description: 'Notice ID for TOS acceptance (default for newsletter creation)',
displayOptions: {
show: {
operation: ['acceptTOSNotice'],
},
},
},
{
displayName: 'Stage',
name: 'stage',
type: 'string',
default: '5',
description: 'Stage for TOS acceptance (default for newsletter creation)',
displayOptions: {
show: {
operation: ['acceptTOSNotice'],
},
},
},
// Admin Invite fields
{
displayName: 'Phone Number',
name: 'phone',
type: 'string',
default: '',
placeholder: '5491155553934',
description: 'Phone number to send admin invite to',
required: true,
displayOptions: {
show: {
operation: ['sendNewsletterAdminInvite'],
},
},
},
{
displayName: 'Image',
name: 'inviteImage',
type: 'string',
default: '',
placeholder: 'data:image/jpeg;base64,... or https://...',
description: 'Base64 encoded image or URL for invite',
required: true,
displayOptions: {
show: {
operation: ['sendNewsletterAdminInvite'],
},
},
},
{
displayName: 'Invite Caption',
name: 'inviteCaption',
type: 'string',
default: '',
placeholder: 'Join as admin to our newsletter!',
description: 'Caption for the admin invite',
required: true,
displayOptions: {
show: {
operation: ['sendNewsletterAdminInvite'],
},
},
},
{
displayName: 'Newsletter Name',
name: 'inviteName',
type: 'string',
default: '',
placeholder: 'My Newsletter',
description: 'Name of the newsletter for the invite',
required: true,
displayOptions: {
show: {
operation: ['sendNewsletterAdminInvite'],
},
},
},
],
};
}
async execute() {
const items = this.getInputData();
const returnData = [];
for (let i = 0; i < items.length; i++) {
try {
const operation = this.getNodeParameter('operation', i);
let endpoint = '';
let method = 'GET';
let body = {};
switch (operation) {
case 'listNewsletters':
endpoint = '/newsletter/list';
method = 'GET';
break;
case 'createNewsletter':
endpoint = '/newsletter/create';
method = 'POST';
body = {
name: this.getNodeParameter('name', i),
};
const description = this.getNodeParameter('description', i);
if (description) {
body.description = description;
}
const picture = this.getNodeParameter('picture', i);
if (picture) {
body.picture = picture;
}
break;
case 'getNewsletterInfo':
endpoint = '/newsletter/info';
method = 'POST';
body = {
NewsletterID: this.getNodeParameter('newsletterJid', i),
};
break;
case 'getSubscribedNewsletters':
endpoint = '/newsletter/subscribed';
method = 'GET';
break;
case 'sendNewsletterMessage':
endpoint = '/newsletter/send';
method = 'POST';
const messageType = this.getNodeParameter('messageType', i);
const newsletterJid = this.getNodeParameter('newsletterJid', i);
body = { jid: newsletterJid };
if (messageType === 'text') {
body.message = this.getNodeParameter('message', i);
}
else {
const media = this.getNodeParameter('media', i);
const caption = this.getNodeParameter('caption', i);
body[messageType] = media;
if (caption) {
body.caption = caption;
}
if (messageType === 'document') {
const fileName = this.getNodeParameter('fileName', i);
if (fileName) {
body.file_name = fileName;
}
}
}
break;
case 'subscribeNewsletter':
endpoint = '/newsletter/follow';
method = 'POST';
body = {
NewsletterID: this.getNodeParameter('newsletterJid', i),
};
break;
case 'subscribeNewsletterInvite':
endpoint = '/newsletter/follow-invite';
method = 'POST';
body = {
NewsletterInviteCode: this.getNodeParameter('inviteCode', i),
};
break;
case 'unsubscribeNewsletter':
endpoint = '/newsletter/unfollow';
method = 'POST';
body = {
NewsletterID: this.getNodeParameter('newsletterJid', i),
};
break;
case 'unsubscribeNewsletterInvite':
endpoint = '/newsletter/unfollow-invite';
method = 'POST';
body = {
NewsletterInviteCode: this.getNodeParameter('inviteCode', i),
};
break;
case 'muteNewsletter':
endpoint = '/newsletter/mute';
method = 'POST';
body = {
jid: this.getNodeParameter('newsletterJid', i),
mute: this.getNodeParameter('mute', i),
};
break;
case 'getNewsletterMessages':
endpoint = '/newsletter/messages';
method = 'POST';
body = {
NewsletterID: this.getNodeParameter('newsletterJid', i),
};
const count = this.getNodeParameter('count', i);
if (count) {
body.count = count;
}
const before = this.getNodeParameter('before', i);
if (before) {
body.before = before;
}
break;
case 'sendNewsletterReaction':
endpoint = '/newsletter/reaction';
method = 'POST';
body = {
jid: this.getNodeParameter('newsletterJid', i),
server_id: this.getNodeParameter('serverId', i),
reaction: this.getNodeParameter('reaction', i),
};
break;
case 'markNewsletterViewed':
endpoint = '/newsletter/mark-viewed';
method = 'POST';
const serverIds = this.getNodeParameter('serverIds', i);
body = {
jid: this.getNodeParameter('newsletterJid', i),
server_ids: serverIds.split(',').map(id => parseInt(id.trim(), 10)),
};
break;
case 'subscribeNewsletterLiveUpdates':
endpoint = '/newsletter/subscribe-live-updates';
method = 'POST';
body = {
jid: this.getNodeParameter('newsletterJid', i),
};
break;
case 'getNewsletterMessageUpdates':
endpoint = '/newsletter/message-updates';
method = 'POST';
body = {
jid: this.getNodeParameter('newsletterJid', i),
};
const countUpdates = this.getNodeParameter('count', i);
if (countUpdates) {
body.count = countUpdates;
}
const since = this.getNodeParameter('since', i);
if (since) {
body.since = since;
}
const after = this.getNodeParameter('after', i);
if (after) {
body.after = after;
}
break;
case 'acceptTOSNotice':
endpoint = '/newsletter/accept-tos';
method = 'POST';
body = {
notice_id: this.getNodeParameter('noticeId', i),
stage: this.getNodeParameter('stage', i),
};
break;
case 'sendNewsletterAdminInvite':
endpoint = '/newsletter/admin-invite';
method = 'POST';
body = {
phone: this.getNodeParameter('phone', i),
newsletter_jid: this.getNodeParameter('newsletterJid', i),
image: this.getNodeParameter('inviteImage', i),
caption: this.getNodeParameter('inviteCaption', i),
name: this.getNodeParameter('inviteName', i),
};
break;
}
const responseData = await GenericFunctions_1.zuckzapgoApiRequest.call(this, method, endpoint, body);
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionErrorData);
continue;
}
throw error;
}
}
return [returnData];
}
}
exports.ZuckZapGoNewsletter = ZuckZapGoNewsletter;
//# sourceMappingURL=ZuckZapGoNewsletter.node.js.map