UNPKG

n8n-nodes-wuzapi

Version:

n8n community nodes for Wuzapi - WhatsApp Multi-Device REST API

215 lines 9.07 kB
"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}@s.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}@s.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