UNPKG

n8n-nodes-walichat

Version:

n8n plugin for WaliChat

724 lines (723 loc) 23.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeUserStatusOperations = exports.userStatusProperties = void 0; const request_1 = require("../request"); exports.userStatusProperties = [ { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['user-status'], }, }, options: [ { name: 'Get User Status', value: 'getUserStatus', description: 'Get user status stories', }, { name: 'Get User Status by ID', value: 'getUserStatusById', description: 'Get a specific user status by ID', }, { name: 'Update User Status', value: 'updateUserStatus', description: 'Publish a new WhatsApp Status', }, { name: 'Delete User Status', value: 'deleteUserStatus', description: 'Delete user status stories', }, ], default: 'getUserStatus', }, { displayName: 'WhatsApp Number', name: 'device', type: 'options', typeOptions: { loadOptionsMethod: 'getDevices', }, required: true, default: '', displayOptions: { show: { resource: ['user-status'], }, }, description: 'The ID of the WhatsApp number', }, // GET USER STATUS BY ID OPTIONS { displayName: 'Status ID', name: 'statusId', type: 'string', required: true, default: '', displayOptions: { show: { resource: ['user-status'], operation: ['getUserStatusById'], }, }, description: 'The ID of the status (20-22 hexadecimal length value or 24-length hexadecimal value)', }, // GET USER STATUS OPTIONS { displayName: 'Filters', name: 'filters', type: 'collection', placeholder: 'Add Filter', default: {}, displayOptions: { show: { resource: ['user-status'], operation: ['getUserStatus'], }, }, options: [ { displayName: 'Flow', name: 'flow', type: 'options', options: [ { name: 'Inbound', value: 'inbound' }, { name: 'Outbound', value: 'outbound' }, ], default: '', description: 'Filter by inbound or outbound messages', }, { displayName: 'My Status Only', name: 'mine', type: 'boolean', default: false, description: 'Return only statuses published by your own WhatsApp number', }, { displayName: 'Scheduled Only', name: 'scheduled', type: 'boolean', default: false, description: 'Return only scheduled status to be published in the future', }, { displayName: 'Delivery Status', name: 'ack', 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 ACK status', }, { displayName: 'WhatsApp IDs', name: 'wid', type: 'string', typeOptions: { multipleValues: true, }, default: [], description: 'Filter status by WID (WhatsApp ID)', }, { displayName: 'Search', name: 'search', type: 'string', default: '', description: 'Search status by partial text content, contact name or media filename', }, { displayName: 'Chat ID', name: 'chat', type: 'string', default: '', description: 'Filter status by chat WhatsApp ID', }, { displayName: 'Phone Number', name: 'phone', type: 'string', default: '', description: 'Return status sent from a given phone number or WhatsApp WID', }, { displayName: 'Reference', name: 'reference', type: 'string', default: '', description: 'Filter messages by reference field exact match', }, { displayName: 'Type', name: 'type', type: 'multiOptions', options: [ { name: 'Text', value: 'text' }, { name: 'Image', value: 'image' }, { name: 'Video', value: 'video' }, ], default: [], description: 'Filter message by entry kind', }, { displayName: 'Begin From Message ID', name: 'begin', type: 'string', default: '', description: 'Return newest messages starting from the given message ID', }, { displayName: 'End At Message ID', name: 'end', type: 'string', default: '', description: 'Return oldest messages starting from the given message ID', }, { displayName: 'Created After', name: 'after', type: 'dateTime', default: '', description: 'Messages created after the given date', }, { displayName: 'Created Before', name: 'before', type: 'dateTime', default: '', description: 'Messages created before the given 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 messages by date', }, { 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)', }, ], }, // UPDATE USER STATUS OPTIONS { displayName: 'Content Type', name: 'contentType', type: 'options', required: true, default: 'text', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], }, }, options: [ { name: 'Text', value: 'text', }, { name: 'Media', value: 'media', }, ], description: 'Type of content for the status update', }, { displayName: 'Message', name: 'message', type: 'string', required: true, default: '', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], contentType: ['text'], }, }, description: 'Text content of the status update (max 650 characters)', }, { displayName: 'Font Style', name: 'font', type: 'options', required: false, default: 'helvetica', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], contentType: ['text'], }, }, options: [ { name: 'Helvetica', value: 'helvetica' }, { name: 'Serif', value: 'serif' }, { name: 'Norican', value: 'norican' }, ], description: 'Font style for the text status', }, { displayName: 'Background Color', name: 'color', type: 'options', required: false, default: 'sky_blue', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], contentType: ['text'], }, }, options: [ { name: 'Red Purple', value: 'red_purple' }, { name: 'Moss Green', value: 'moss_green' }, { name: 'Dark Khaki', value: 'dark_khaki' }, { name: 'Wine Red', value: 'wine_red' }, { name: 'Light Taupe', value: 'light_taupe' }, { name: 'Goldenrod', value: 'goldenrod' }, { name: 'Olive Green', value: 'olive_green' }, { name: 'Light Plum', value: 'light_plum' }, { name: 'Dark Purple', value: 'dark_purple' }, { name: 'Light Coral', value: 'light_coral' }, { name: 'Medium Sea Green', value: 'medium_sea_green' }, { name: 'Salmon', value: 'salmon' }, { name: 'Sky Blue', value: 'sky_blue' }, { name: 'Light Sky Blue', value: 'light_sky_blue' }, { name: 'Dark Taupe', value: 'dark_taupe' }, { name: 'Slate Gray', value: 'slate_gray' }, { name: 'Dodger Blue', value: 'dodger_blue' }, { name: 'Dark Magenta', value: 'dark_magenta' }, { name: 'Seafoam Green', value: 'seafoam_green' }, { name: 'Charcoal', value: 'charcoal' }, { name: 'Periwinkle', value: 'periwinkle' }, ], description: 'Background color for the text status', }, { displayName: 'Reference', name: 'reference', type: 'string', required: false, default: '', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], }, }, description: 'Optional user-defined reference for traceability (max 150 characters)', }, // MEDIA OPTIONS { displayName: 'Media Source', name: 'mediaSource', type: 'options', required: true, default: 'url', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], contentType: ['media'], }, }, options: [ { name: 'URL', value: 'url', }, { name: 'File ID', value: 'file', }, ], description: 'Source of the media file', }, { displayName: 'File URL', name: 'url', type: 'string', required: true, default: '', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], contentType: ['media'], mediaSource: ['url'], }, }, description: 'URL of the media file (image or video)', }, { displayName: 'File ID', name: 'file', type: 'options', typeOptions: { loadOptionsMethod: 'getFiles', }, required: true, default: '', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], contentType: ['media'], mediaSource: ['file'], }, }, description: 'ID of the previously uploaded file', }, { displayName: 'Caption', name: 'mediaMessage', type: 'string', required: false, default: '', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], contentType: ['media'], }, }, description: 'Optional caption for the media file', }, { displayName: 'File Name', name: 'filename', type: 'string', required: false, default: '', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], contentType: ['media'], }, }, description: 'Optional filename for the media file', }, { displayName: 'Format', name: 'format', type: 'options', required: false, default: 'native', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], contentType: ['media'], }, }, options: [ { name: 'Native', value: 'native' }, { name: 'GIF', value: 'gif' }, { name: 'Voice Recording', value: 'ptt' }, ], description: 'Format for displaying the media file', }, // SCHEDULING OPTIONS { displayName: 'Schedule Status', name: 'scheduleStatus', type: 'boolean', default: false, displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], }, }, description: 'Whether to schedule the status for later publication', }, { displayName: 'Schedule Type', name: 'scheduleType', type: 'options', required: true, default: 'delay', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], scheduleStatus: [true], }, }, options: [ { name: 'Delay (Seconds)', value: 'delay', }, { name: 'Delay (Time Notation)', value: 'delayTo', }, { name: 'Specific Date/Time', value: 'date', }, ], description: 'How to schedule the status', }, { displayName: 'Delay (Seconds)', name: 'delay', type: 'number', required: true, default: 60, displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], scheduleStatus: [true], scheduleType: ['delay'], }, }, description: 'Delay in seconds before publishing the status', }, { displayName: 'Delay (Time Notation)', name: 'delayTo', type: 'options', required: true, default: '1h', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], scheduleStatus: [true], scheduleType: ['delayTo'], }, }, options: [ { name: '15 Minutes', value: '15m' }, { name: '30 Minutes', value: '30m' }, { name: '1 Hour', value: '1h' }, { name: '2 Hours', value: '2h' }, { name: '6 Hours', value: '6h' }, { name: '12 Hours', value: '12h' }, { name: '1 Day', value: '1d' }, { name: '2 Days', value: '2d' }, { name: '3 Days', value: '3d' }, { name: '1 Week', value: '1w' }, ], description: 'Delay using time notation (e.g., 1h, 2d)', }, { displayName: 'Date/Time', name: 'date', type: 'dateTime', required: true, default: '', displayOptions: { show: { resource: ['user-status'], operation: ['updateUserStatus'], scheduleStatus: [true], scheduleType: ['date'], }, }, description: 'Specific date and time to publish the status', }, // DELETE USER STATUS OPTIONS { displayName: 'Delete Method', name: 'deleteMethod', type: 'options', required: true, default: 'selective', displayOptions: { show: { resource: ['user-status'], operation: ['deleteUserStatus'], }, }, options: [ { name: 'Delete All', value: 'all', }, { name: 'Delete Scheduled Status', value: 'scheduled', }, { name: 'Delete Specific Status', value: 'status', }, ], description: 'Method to use for deleting status', }, { displayName: 'Scheduled Status IDs', name: 'scheduled', type: 'string', typeOptions: { multipleValues: true, }, required: true, default: [], displayOptions: { show: { resource: ['user-status'], operation: ['deleteUserStatus'], deleteMethod: ['scheduled'], }, }, description: 'IDs of scheduled status to delete (24-length hexadecimal values)', }, { displayName: 'Status IDs', name: 'status', type: 'string', typeOptions: { multipleValues: true, }, required: true, default: [], displayOptions: { show: { resource: ['user-status'], operation: ['deleteUserStatus'], deleteMethod: ['status'], }, }, description: 'WhatsApp IDs (WID) of status to delete', }, ]; async function executeUserStatusOperations(index) { const operation = this.getNodeParameter('operation', index); const device = this.getNodeParameter('device', index); // GET USER STATUS BY ID if (operation === 'getUserStatusById') { const statusId = this.getNodeParameter('statusId', index); return (0, request_1.request)(this, 'GET', `/chat/${device}/status/${statusId}`); } // GET USER STATUS if (operation === 'getUserStatus') { 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', `/chat/${device}/status`, undefined, queryParameters); } // UPDATE USER STATUS if (operation === 'updateUserStatus') { const contentType = this.getNodeParameter('contentType', index); const reference = this.getNodeParameter('reference', index, ''); const scheduleStatus = this.getNodeParameter('scheduleStatus', index, false); const body = {}; // Add reference if provided if (reference) { body.reference = reference; } // Add scheduling if enabled if (scheduleStatus) { const scheduleType = this.getNodeParameter('scheduleType', index); body.schedule = {}; if (scheduleType === 'delay') { const delay = this.getNodeParameter('delay', index); body.schedule.delay = delay; } else if (scheduleType === 'delayTo') { const delayTo = this.getNodeParameter('delayTo', index); body.schedule.delayTo = delayTo; } else if (scheduleType === 'date') { const date = this.getNodeParameter('date', index); body.schedule.date = date; } } // Add content based on type if (contentType === 'text') { const message = this.getNodeParameter('message', index); const font = this.getNodeParameter('font', index, 'helvetica'); const color = this.getNodeParameter('color', index, 'sky_blue'); body.message = message; body.font = font; body.color = color; } else if (contentType === 'media') { const mediaSource = this.getNodeParameter('mediaSource', index); const mediaMessage = this.getNodeParameter('mediaMessage', index, ''); const filename = this.getNodeParameter('filename', index, ''); const format = this.getNodeParameter('format', index, 'native'); body.media = {}; if (mediaSource === 'url') { const url = this.getNodeParameter('url', index); body.media.url = url; } else if (mediaSource === 'file') { const file = this.getNodeParameter('file', index); body.media.file = file; } if (mediaMessage) { body.media.message = mediaMessage; } if (filename) { body.media.filename = filename; } if (format !== 'native') { body.media.format = format; } } return (0, request_1.request)(this, 'POST', `/chat/${device}/status`, body); } // DELETE USER STATUS if (operation === 'deleteUserStatus') { const deleteMethod = this.getNodeParameter('deleteMethod', index); const body = {}; if (deleteMethod === 'all') { body.all = true; } else if (deleteMethod === 'scheduled') { const scheduled = this.getNodeParameter('scheduled', index, []); body.scheduled = scheduled; } else if (deleteMethod === 'status') { const status = this.getNodeParameter('status', index, []); body.status = status; } return (0, request_1.request)(this, 'DELETE', `/chat/${device}/status`, body); } throw new Error(`The operation "${operation}" is not supported for user status!`); } exports.executeUserStatusOperations = executeUserStatusOperations;