UNPKG

n8n-nodes-walichat

Version:

n8n plugin for WaliChat

552 lines (551 loc) 19.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeOutboundMessageOperations = exports.outboundMessageProperties = void 0; const request_1 = require("../request"); exports.outboundMessageProperties = [ { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['outbound-messages'], }, }, options: [ { name: 'Search Messages', value: 'searchMessages', description: 'Search for outbound messages', }, { name: 'Get Message', value: 'getMessage', description: 'Get a specific outbound message by ID', }, { name: 'Update Message', value: 'updateMessage', description: 'Update a queued message', }, { name: 'Delete Message', value: 'deleteMessage', description: 'Delete a message', }, ], default: 'searchMessages', }, // SEARCH MESSAGES FILTERS { displayName: 'Filters', name: 'filters', type: 'collection', placeholder: 'Add Filter', default: {}, displayOptions: { show: { resource: ['outbound-messages'], operation: ['searchMessages'], }, }, options: [ { displayName: 'Search Term', name: 'search', type: 'string', default: '', description: 'Search messages by text content, phone number, group or message IDs', }, { displayName: 'Status', name: 'status', type: 'multiOptions', options: [ { name: 'Queued', value: 'queued' }, { name: 'Processing', value: 'processing' }, { name: 'Sent', value: 'sent' }, { name: 'Delivered', value: 'delivered' }, { name: 'Read', value: 'read' }, { name: 'Failed', value: 'failed' }, { name: 'Pending', value: 'pending' }, ], default: [], description: 'Filter messages by status', }, { displayName: 'Delivery Status', name: 'deliveryStatus', type: 'multiOptions', options: [ { name: 'Pending', value: 'pending' }, { name: 'Sent', value: 'sent' }, { name: 'Delivered', value: 'delivered' }, { name: 'Read', value: 'read' }, { name: 'Failed', value: 'failed' }, ], default: [], description: 'Filter messages by delivery status', }, { displayName: 'Webhook Status', name: 'webhookStatus', type: 'multiOptions', options: [ { name: 'Pending', value: 'pending' }, { name: 'Success', value: 'success' }, { name: 'Failed', value: 'failed' }, ], default: [], description: 'Filter messages by webhook status', }, { displayName: 'Include', name: 'include', type: 'multiOptions', options: [ { name: 'Device', value: 'device' }, { name: 'Agent', value: 'agent' }, { name: 'Events', value: 'events' }, ], default: [], description: 'Expand subentity documents per message', }, { displayName: 'Message IDs', name: 'ids', type: 'string', typeOptions: { multipleValues: true, }, default: [], description: 'Filter by specific message IDs', }, { displayName: 'Agent IDs', name: 'agents', type: 'string', typeOptions: { multipleValues: true, loadOptionsMethod: 'getTeamAgents', }, default: [], description: 'Filter messages sent by specific agent IDs', }, { displayName: 'Source', name: 'source', type: 'options', options: [ { name: 'API', value: 'api' }, { name: 'Web Chat', value: 'chat' }, ], default: '', description: 'Message creation origin', }, { displayName: 'Target Type', name: 'target', type: 'options', options: [ { name: 'User', value: 'user' }, { name: 'Group', value: 'group' }, { name: 'Channel', value: 'channel' }, ], default: '', description: 'Chat kind of the message target', }, { displayName: 'Message Type', name: 'type', type: 'multiOptions', options: [ { name: 'Text', value: 'text' }, { name: 'Image', value: 'image' }, { name: 'Video', value: 'video' }, { name: 'Audio', value: 'audio' }, { name: 'Voice', value: 'voice' }, { name: 'Document', value: 'document' }, { name: 'Location', value: 'location' }, { name: 'Contact', value: 'contact' }, { name: 'Buttons', value: 'buttons' }, { name: 'List', value: 'list' }, { name: 'Template', value: 'template' }, ], default: [], description: 'Filter messages by type', }, { displayName: 'WhatsApp IDs', name: 'waIds', type: 'string', typeOptions: { multipleValues: true, }, default: [], description: 'Filter by WhatsApp message IDs', }, { displayName: 'Device IDs', name: 'devices', type: 'string', typeOptions: { multipleValues: true, loadOptionsMethod: 'getDevices', }, default: [], description: 'Filter by specific device IDs', }, { displayName: 'Device', name: 'device', type: 'string', typeOptions: { loadOptionsMethod: 'getDevices', }, default: '', description: 'Filter by device ID or phone number', }, { displayName: 'Reference', name: 'reference', type: 'string', typeOptions: { multipleValues: true, }, default: [], description: 'Filter by message reference', }, { displayName: 'Priority', name: 'priority', type: 'multiOptions', options: [ { name: 'Low', value: 'low' }, { name: 'Normal', value: 'normal' }, { name: 'High', value: 'high' }, { name: 'Urgent', value: 'urgent' }, ], default: [], description: 'Filter by message priority', }, { displayName: 'Phone Number', name: 'phone', type: 'string', default: '', description: 'Filter by target phone number (E.164 format)', }, { displayName: 'Group ID', name: 'group', type: 'string', typeOptions: { loadOptionsMethod: 'getGroups', loadOptionsDependsOn: ['device'], }, default: '', description: 'Filter by target group WhatsApp ID', }, { displayName: 'Channel ID', name: 'channel', type: 'string', default: '', description: 'Filter by target channel WhatsApp ID', }, { displayName: 'Delivery After', name: 'after', type: 'dateTime', default: '', description: 'Messages scheduled for delivery after this date', }, { displayName: 'Delivery Before', name: 'before', type: 'dateTime', default: '', description: 'Messages scheduled for delivery before this date', }, { displayName: 'Created After', name: 'createdAfter', type: 'dateTime', default: '', description: 'Messages created after this date', }, { displayName: 'Created Before', name: 'createdBefore', type: 'dateTime', default: '', description: 'Messages created before this date', }, { displayName: 'Sort', name: 'sort', type: 'options', options: [ { name: 'Recent First', value: 'date:desc' }, { name: 'Oldest First', value: 'date:asc' }, ], default: 'date:desc', description: 'Sort order for results', }, { displayName: 'Results Page Size', name: 'size', type: 'number', default: 20, description: 'Number of results per page', }, { displayName: 'Page Number', name: 'page', type: 'number', default: 0, description: 'Page number (starting from 0)', }, ], }, // GET MESSAGE BY ID { displayName: 'Message ID', name: 'messageId', type: 'string', required: true, default: '', displayOptions: { show: { resource: ['outbound-messages'], operation: ['getMessage', 'updateMessage', 'deleteMessage'], }, }, description: 'ID of the message', }, { displayName: 'Include', name: 'include', type: 'multiOptions', displayOptions: { show: { resource: ['outbound-messages'], operation: ['getMessage'], }, }, options: [ { name: 'Device', value: 'device' }, { name: 'Agent', value: 'agent' }, { name: 'Events', value: 'events' }, ], default: [], description: 'Include additional information in the response', }, // UPDATE MESSAGE OPTIONS { displayName: 'Update Fields', name: 'updateFields', type: 'collection', placeholder: 'Add Field', default: {}, displayOptions: { show: { resource: ['outbound-messages'], operation: ['updateMessage'], }, }, options: [ { displayName: 'Message Text', name: 'message', type: 'string', typeOptions: { rows: 4, }, default: '', description: 'New text content for the message', }, { displayName: 'Phone Number', name: 'phone', type: 'string', default: '', description: 'New target phone number in E.164 format (e.g., +447362053576)', }, { displayName: 'Group ID', name: 'group', type: 'string', typeOptions: { loadOptionsMethod: 'getGroups', loadOptionsDependsOn: ['device'], }, default: '', description: 'New target group WhatsApp ID', }, { displayName: 'Channel ID', name: 'channel', type: 'string', default: '', description: 'New target channel WhatsApp ID', }, { displayName: 'Chat ID', name: 'chat', type: 'string', default: '', description: 'New target chat WhatsApp ID', }, { displayName: 'Device ID', name: 'device', type: 'string', typeOptions: { loadOptionsMethod: 'getDevices', }, default: '', description: 'New WhatsApp device ID for message delivery', }, { displayName: 'Agent ID', name: 'agent', type: 'string', typeOptions: { loadOptionsMethod: 'getTeamAgents', loadOptionsDependsOn: ['device'], }, default: '', description: 'New agent ID to send the message on behalf of', }, { displayName: 'Scheduled Delivery', name: 'deliverAt', type: 'dateTime', default: '', description: 'New scheduled delivery date/time', }, { displayName: 'Priority', name: 'priority', type: 'options', options: [ { name: 'Low', value: 'low' }, { name: 'Normal', value: 'normal' }, { name: 'High', value: 'high' }, { name: 'Urgent', value: 'urgent' }, ], default: 'normal', description: 'New message priority', }, { displayName: 'Reference', name: 'reference', type: 'string', default: '', description: 'New message reference for tracking', }, { displayName: 'Remove Fields', name: 'remove', type: 'multiOptions', options: [ { name: 'Reference', value: 'reference' }, { name: 'Media', value: 'media' }, { name: 'Media File', value: 'media.file' }, { name: 'Media Message', value: 'media.message' }, { name: 'Media Reference', value: 'media.reference' }, { name: 'Location', value: 'location' }, { name: 'Location Address', value: 'location.address' }, { name: 'Location Coordinates', value: 'location.coordinates' }, ], default: [], description: 'Fields to remove from the message', }, { displayName: 'Label', name: 'label', type: 'string', typeOptions: { loadOptionsMethod: 'getLabels', loadOptionsDependsOn: ['device'], }, default: '', description: 'Custom label to categorize the message', }, ], }, // DELETE MESSAGE OPTIONS { displayName: 'Force Delete', name: 'force', type: 'boolean', default: false, displayOptions: { show: { resource: ['outbound-messages'], operation: ['deleteMessage'], }, }, description: 'Whether to force message deletion, even if already delivered or processing', }, ]; async function executeOutboundMessageOperations(index) { const operation = this.getNodeParameter('operation', index); // SEARCH MESSAGES if (operation === 'searchMessages') { const filters = this.getNodeParameter('filters', index, {}); const queryParameters = {}; // Add all filters to query parameters for (const [key, value] of Object.entries(filters)) { if (value !== undefined && value !== '' && (typeof value !== 'object' || (Array.isArray(value) && value.length > 0))) { queryParameters[key] = value; } } return (0, request_1.request)(this, 'GET', '/messages', undefined, queryParameters); } // GET MESSAGE if (operation === 'getMessage') { const messageId = this.getNodeParameter('messageId', index); const include = this.getNodeParameter('include', index, []); const queryParameters = {}; if (include && include.length > 0) { queryParameters.include = include.join(','); } return (0, request_1.request)(this, 'GET', `/messages/${messageId}`, undefined, queryParameters); } // UPDATE MESSAGE if (operation === 'updateMessage') { const messageId = this.getNodeParameter('messageId', index); const updateFields = this.getNodeParameter('updateFields', index, {}); const body = {}; // Add update fields to request body for (const [key, value] of Object.entries(updateFields)) { if (key === 'remove') continue; // Handle remove separately if (value !== undefined && value !== '') { body[key] = value; } } // Add remove array if specified if (updateFields.remove && updateFields.remove.length > 0) { body.remove = updateFields.remove; } return (0, request_1.request)(this, 'PATCH', `/messages/${messageId}`, body); } // DELETE MESSAGE if (operation === 'deleteMessage') { const messageId = this.getNodeParameter('messageId', index); const force = this.getNodeParameter('force', index, false); const queryParameters = {}; if (force) { queryParameters.force = 'true'; } return (0, request_1.request)(this, 'DELETE', `/messages/${messageId}`, undefined, queryParameters); } throw new Error(`The operation "${operation}" is not supported for outbound messages!`); } exports.executeOutboundMessageOperations = executeOutboundMessageOperations;