n8n-nodes-wuzapi
Version:
n8n community nodes for Wuzapi - WhatsApp Multi-Device REST API
215 lines • 9.07 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sanitizePhoneNumber = void 0;
exports.setMessageType = setMessageType;
exports.setRecipient = setRecipient;
exports.setTextMessage = setTextMessage;
exports.setMediaMessage = setMediaMessage;
exports.setLocationMessage = setLocationMessage;
exports.setContactMessage = setContactMessage;
exports.setButtonMessage = setButtonMessage;
exports.setListMessage = setListMessage;
exports.uploadMediaFromItem = uploadMediaFromItem;
exports.cleanPhoneNumber = cleanPhoneNumber;
exports.handleWuzapiError = handleWuzapiError;
const lodashUtils_1 = require("../lodashUtils");
const n8n_workflow_1 = require("n8n-workflow");
const MediaFunctions_1 = require("./MediaFunctions");
async function setMessageType(requestOptions) {
const messageType = this.getNodeParameter('messageType');
if (!requestOptions.body) {
requestOptions.body = {};
}
// Set the message type in the request body
Object.assign(requestOptions.body, { messageType });
return requestOptions;
}
async function setRecipient(requestOptions) {
const phoneNumber = this.getNodeParameter('phoneNumber');
const chatJid = this.getNodeParameter('chatJid', null);
if (!requestOptions.body) {
requestOptions.body = {};
}
// Use chatJid if provided, otherwise format phone number
if (chatJid) {
(0, lodashUtils_1.set)(requestOptions.body, 'chatJid', chatJid);
}
else {
// Format phone number for WhatsApp (add @s.whatsapp.net if not a group)
const formattedPhone = phoneNumber.includes('@') ? phoneNumber : `${phoneNumber}.whatsapp.net`;
(0, lodashUtils_1.set)(requestOptions.body, 'chatJid', formattedPhone);
}
return requestOptions;
}
async function setTextMessage(requestOptions) {
const message = this.getNodeParameter('message');
if (!requestOptions.body) {
requestOptions.body = {};
}
(0, lodashUtils_1.set)(requestOptions.body, 'message', message);
return requestOptions;
}
async function setMediaMessage(requestOptions) {
const mediaUrl = this.getNodeParameter('mediaUrl', null);
const caption = this.getNodeParameter('caption', '');
if (!requestOptions.body) {
requestOptions.body = {};
}
if (mediaUrl) {
(0, lodashUtils_1.set)(requestOptions.body, 'mediaUrl', mediaUrl);
}
if (caption) {
(0, lodashUtils_1.set)(requestOptions.body, 'caption', caption);
}
return requestOptions;
}
async function setLocationMessage(requestOptions) {
const latitude = this.getNodeParameter('latitude');
const longitude = this.getNodeParameter('longitude');
const locationName = this.getNodeParameter('locationName', '');
if (!requestOptions.body) {
requestOptions.body = {};
}
(0, lodashUtils_1.set)(requestOptions.body, 'latitude', latitude);
(0, lodashUtils_1.set)(requestOptions.body, 'longitude', longitude);
if (locationName) {
(0, lodashUtils_1.set)(requestOptions.body, 'locationName', locationName);
}
return requestOptions;
}
async function setContactMessage(requestOptions) {
const contactName = this.getNodeParameter('contactName');
const contactPhone = this.getNodeParameter('contactPhone');
if (!requestOptions.body) {
requestOptions.body = {};
}
(0, lodashUtils_1.set)(requestOptions.body, 'contactName', contactName);
(0, lodashUtils_1.set)(requestOptions.body, 'contactPhone', contactPhone);
return requestOptions;
}
async function setButtonMessage(requestOptions) {
const message = this.getNodeParameter('message');
const buttons = this.getNodeParameter('buttons');
if (!requestOptions.body) {
requestOptions.body = {};
}
(0, lodashUtils_1.set)(requestOptions.body, 'message', message);
if (buttons?.button) {
const buttonArray = buttons.button.map((btn) => ({
buttonId: btn.buttonId,
buttonText: btn.buttonText,
type: btn.type || 1,
}));
(0, lodashUtils_1.set)(requestOptions.body, 'buttons', buttonArray);
}
return requestOptions;
}
async function setListMessage(requestOptions) {
const message = this.getNodeParameter('message');
const buttonText = this.getNodeParameter('buttonText');
const sections = this.getNodeParameter('sections');
if (!requestOptions.body) {
requestOptions.body = {};
}
(0, lodashUtils_1.set)(requestOptions.body, 'message', message);
(0, lodashUtils_1.set)(requestOptions.body, 'buttonText', buttonText);
if (sections?.section) {
const sectionArray = sections.section.map((section) => ({
title: section.title,
rows: section.rows.row || [],
}));
(0, lodashUtils_1.set)(requestOptions.body, 'sections', sectionArray);
}
return requestOptions;
}
async function uploadMediaFromItem(requestOptions) {
const uploadData = await MediaFunctions_1.getUploadFormData.call(this);
// Upload media to Wuzapi first
const credentials = await this.getCredentials('wuzapiApi');
const uploadResult = (await this.helpers.httpRequestWithAuthentication.call(this, 'wuzapiApi', {
url: '/media/upload',
method: 'POST',
body: uploadData.formData,
headers: uploadData.formData.getHeaders(),
}));
const messageType = this.getNodeParameter('messageType');
if (!requestOptions.body) {
requestOptions.body = {};
}
// Set the media URL from upload response
if (uploadResult.mediaUrl) {
(0, lodashUtils_1.set)(requestOptions.body, 'mediaUrl', uploadResult.mediaUrl);
}
// Set filename for document type
if (messageType === 'document') {
(0, lodashUtils_1.set)(requestOptions.body, 'fileName', uploadData.fileName);
}
return requestOptions;
}
const sanitizePhoneNumber = (phoneNumber) => phoneNumber.replace(/[\-\(\)\+\s]/g, '');
exports.sanitizePhoneNumber = sanitizePhoneNumber;
async function cleanPhoneNumber(requestOptions) {
const phoneNumber = (0, exports.sanitizePhoneNumber)(this.getNodeParameter('phoneNumber'));
const isGroup = phoneNumber.includes('@g.us');
if (!requestOptions.body) {
requestOptions.body = {};
}
// Format for WhatsApp
const formattedPhone = isGroup ? phoneNumber : `${phoneNumber}.whatsapp.net`;
(0, lodashUtils_1.set)(requestOptions.body, 'chatJid', formattedPhone);
return requestOptions;
}
async function handleWuzapiError(data, response) {
if (response.statusCode >= 400) {
const error = response.body?.error;
if (response.statusCode === 401) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), {}, {
message: 'Authentication failed',
description: 'Invalid API token or session not connected to WhatsApp',
httpCode: '401',
});
}
else if (response.statusCode === 404) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), {}, {
message: 'Endpoint not found',
description: 'The requested API endpoint was not found',
httpCode: '404',
});
}
else if (response.statusCode === 429) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), {}, {
message: 'Rate limit exceeded',
description: 'Too many requests. Please wait before sending more messages.',
httpCode: '429',
});
}
else if (error) {
const messageType = this.getNodeParameter('messageType', 'message');
if (error.message?.includes('not connected')) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), { error }, {
message: 'WhatsApp not connected',
description: 'Please connect your WhatsApp session first using the Session node',
httpCode: response.statusCode.toString(),
});
}
else if (error.message?.includes('invalid phone')) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), { error }, {
message: 'Invalid phone number',
description: 'Please provide a valid phone number in international format',
httpCode: response.statusCode.toString(),
});
}
else if (error.message?.includes('media')) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), { error }, {
message: `Invalid ${messageType} media`,
description: error.message,
httpCode: response.statusCode.toString(),
});
}
throw new n8n_workflow_1.NodeApiError(this.getNode(), { ...response, body: { error } }, {});
}
throw new n8n_workflow_1.NodeApiError(this.getNode(), response);
}
return data;
}
//# sourceMappingURL=WuzapiFunctions.js.map