@pixelinfinito/n8n-nodes-chatwoot
Version:
n8n community node for Chatwoot API integration
1,148 lines (1,147 loc) • 177 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Chatwoot = void 0;
const n8n_workflow_1 = require("n8n-workflow");
class Chatwoot {
constructor() {
this.description = {
displayName: 'Chatwoot',
name: 'chatwoot',
icon: { light: 'file:chatwoot.svg', dark: 'file:chatwoot.svg' },
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
description: 'Interact with Chatwoot API',
defaults: {
name: 'Chatwoot',
},
inputs: ["main"],
outputs: ["main"],
usableAsTool: true,
credentials: [
{
name: 'chatwootApi',
required: true,
},
],
properties: [
{
displayName: 'Resource',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{ name: 'Account', value: 'account' },
{ name: 'Canned Response', value: 'cannedResponse' },
{ name: 'Contact', value: 'contact' },
{ name: 'Conversation', value: 'conversation' },
{ name: 'Inbox', value: 'inbox' },
{ name: 'Label', value: 'label' },
{ name: 'Message', value: 'message' },
{ name: 'Team', value: 'team' },
{ name: 'Webhook', value: 'webhook' },
],
default: 'contact',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['account'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get account details',
action: 'Get account details',
},
],
default: 'get',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['contact'],
},
},
options: [
{
name: 'Add Labels',
value: 'addLabels',
description: 'Add labels to a contact',
action: 'Add labels to a contact',
},
{
name: 'Create',
value: 'create',
description: 'Create a new contact',
action: 'Create a contact',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a contact',
action: 'Delete a contact',
},
{
name: 'Filter',
value: 'filter',
description: 'Filter contacts using custom rules',
action: 'Filter contacts',
},
{
name: 'Get',
value: 'get',
description: 'Get a contact by ID',
action: 'Get a contact',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many contacts',
action: 'Get many contacts',
},
{
name: 'Search',
value: 'search',
description: 'Search contacts',
action: 'Search contacts',
},
{
name: 'Update',
value: 'update',
description: 'Update a contact',
action: 'Update a contact',
},
],
default: 'get',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['conversation'],
},
},
options: [
{
name: 'Add Labels',
value: 'addLabels',
description: 'Add labels to conversation',
action: 'Add labels to conversation',
},
{
name: 'Create',
value: 'create',
description: 'Create a new conversation',
action: 'Create a conversation',
},
{
name: 'Get',
value: 'get',
description: 'Get a conversation by ID',
action: 'Get a conversation',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many conversations',
action: 'Get many conversations',
},
{
name: 'Update Custom Attributes',
value: 'updateCustomAttributes',
action: 'Update custom attributes',
},
{
name: 'Update Status',
value: 'updateStatus',
description: 'Update conversation status',
action: 'Update conversation status',
},
],
default: 'get',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['message'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a new message',
action: 'Create a message',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a message',
action: 'Delete a message',
},
{
name: 'Get',
value: 'get',
description: 'Get a message by ID',
action: 'Get a message',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many messages in a conversation',
action: 'Get many messages',
},
{
name: 'Update',
value: 'update',
description: 'Update a message',
action: 'Update a message',
},
],
default: 'get',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['inbox'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get an inbox by ID',
action: 'Get an inbox',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many inboxes',
action: 'Get many inboxes',
},
],
default: 'get',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['cannedResponse'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a new canned response',
action: 'Create a canned response',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a canned response',
action: 'Delete a canned response',
},
{
name: 'Get',
value: 'get',
description: 'Get a canned response by ID',
action: 'Get a canned response',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many canned responses',
action: 'Get many canned responses',
},
{
name: 'Update',
value: 'update',
description: 'Update a canned response',
action: 'Update a canned response',
},
],
default: 'get',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['webhook'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a new webhook',
action: 'Create a webhook',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a webhook',
action: 'Delete a webhook',
},
{
name: 'Get',
value: 'get',
description: 'Get a webhook by ID',
action: 'Get a webhook',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many webhooks',
action: 'Get many webhooks',
},
{
name: 'Update',
value: 'update',
description: 'Update a webhook',
action: 'Update a webhook',
},
],
default: 'get',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['team'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get a team by ID',
action: 'Get a team',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many teams',
action: 'Get many teams',
},
],
default: 'get',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['label'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get a label by ID',
action: 'Get a label',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many labels',
action: 'Get many labels',
},
],
default: 'get',
},
{
displayName: 'Contact ID',
name: 'contactId',
type: 'number',
default: '',
required: true,
description: 'The numeric ID of the contact',
placeholder: '1',
displayOptions: {
show: {
resource: ['contact'],
operation: ['get', 'update', 'delete', 'addLabels'],
},
},
},
{
displayName: 'Send',
name: 'sendMode',
type: 'options',
options: [
{
name: 'Structured Fields',
value: 'fields',
description: 'Use the structured form fields below',
},
{
name: 'Custom JSON',
value: 'json',
description: 'Provide custom JSON for full control over the request',
},
],
default: 'fields',
description: 'How to send the data',
displayOptions: {
show: {
resource: ['contact'],
operation: ['create', 'update'],
},
},
},
{
displayName: 'Custom JSON',
name: 'customJson',
type: 'json',
default: '{\n "name": "John Doe",\n "email": "john@example.com",\n "phone_number": "+1234567890",\n "inbox_id": 1\n}',
description: 'Custom JSON payload to send with the request. This will override all structured fields.',
displayOptions: {
show: {
resource: ['contact'],
operation: ['create', 'update'],
sendMode: ['json'],
},
},
},
{
displayName: 'Additional Options',
name: 'additionalOptions',
type: 'collection',
placeholder: 'Add Option',
default: {},
displayOptions: {
show: {
resource: ['contact'],
operation: ['create'],
sendMode: ['fields'],
},
},
options: [
{
displayName: 'Additional Attributes',
name: 'additionalAttributes',
type: 'json',
default: '{}',
description: 'Key-value pairs for additional contact attributes (JSON format)',
placeholder: '{"city": "San Francisco", "country": "United States"}',
},
{
displayName: 'Avatar URL',
name: 'avatarUrl',
type: 'string',
default: '',
description: 'URL to a JPG or PNG avatar image',
placeholder: 'https://example.com/avatar.jpg',
},
{
displayName: 'Blocked',
name: 'blocked',
type: 'boolean',
default: false,
description: 'Whether the contact is blocked',
},
{
displayName: 'Custom Attributes',
name: 'customAttributes',
type: 'json',
default: '{}',
description: 'Key-value pairs for predefined custom attributes (JSON format)',
placeholder: '{"user_type": "premium", "subscription": "active"}',
},
{
displayName: 'Email',
name: 'email',
type: 'string',
default: '',
description: 'The email address of the contact',
placeholder: 'john@example.com',
},
{
displayName: 'Identifier',
name: 'identifier',
type: 'string',
default: '',
description: 'A unique identifier for the contact from an external system',
placeholder: 'unique_id_123',
},
{
displayName: 'Inbox ID',
name: 'inboxId',
type: 'number',
default: '',
description: 'ID of the inbox to associate with the contact',
placeholder: '1',
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
description: 'The name of the contact',
placeholder: 'John Doe',
},
{
displayName: 'Phone Number',
name: 'phoneNumber',
type: 'string',
default: '',
description: 'The phone number of the contact',
placeholder: '+1234567890',
},
],
},
{
displayName: 'Conversation ID',
name: 'conversationId',
type: 'number',
default: '',
required: true,
description: 'The numeric ID of the conversation',
placeholder: '1',
displayOptions: {
show: {
resource: ['conversation'],
operation: ['get', 'updateStatus', 'addLabels', 'updateCustomAttributes'],
},
},
},
{
displayName: 'Send',
name: 'sendMode',
type: 'options',
options: [
{
name: 'Structured Fields',
value: 'fields',
description: 'Use the structured form fields below',
},
{
name: 'Custom JSON',
value: 'json',
description: 'Provide custom JSON for full control over the request',
},
],
default: 'fields',
description: 'How to send the data',
displayOptions: {
show: {
resource: ['conversation'],
operation: ['create'],
},
},
},
{
displayName: 'Custom JSON',
name: 'customJson',
type: 'json',
default: `{
"source_id": "1234567890",
"inbox_id": 1,
"contact_id": 1,
"message": {
"content": "Hello, how can I help you?",
"template_params": {
"name": "sample_issue_resolution",
"category": "UTILITY",
"language": "en_US",
"processed_params": {
"1": "Chatwoot"
}
}
}
}`,
description: 'Custom JSON payload to send with the request. This will override all structured fields.',
displayOptions: {
show: {
resource: ['conversation'],
operation: ['create'],
sendMode: ['json'],
},
},
},
{
displayName: 'Source ID',
name: 'sourceId',
type: 'string',
default: '',
required: true,
description: 'The source ID for the conversation',
placeholder: 'source_123',
displayOptions: {
show: {
resource: ['conversation'],
operation: ['create'],
sendMode: ['fields'],
},
},
},
{
displayName: 'Inbox ID',
name: 'inboxId',
type: 'number',
default: '',
required: true,
description: 'The numeric ID of the inbox',
placeholder: '1',
displayOptions: {
show: {
resource: ['conversation'],
operation: ['create'],
sendMode: ['fields'],
},
},
},
{
displayName: 'Initial Message Content',
name: 'initialMessage',
type: 'string',
typeOptions: {
rows: 3,
},
default: '',
required: true,
description: 'Content of the initial message',
placeholder: 'Hello! How can I help you?',
displayOptions: {
show: {
resource: ['conversation'],
operation: ['create'],
sendMode: ['fields'],
},
},
},
{
displayName: 'Additional Options',
name: 'additionalOptions',
type: 'collection',
placeholder: 'Add Option',
default: {},
displayOptions: {
show: {
resource: ['conversation'],
operation: ['create'],
sendMode: ['fields'],
},
},
options: [
{
displayName: 'Additional Attributes',
name: 'additionalAttributes',
type: 'json',
default: '{}',
description: 'Additional attributes like browser information (JSON format)',
placeholder: '{"browser": "Chrome", "browser_version": "89.0.4389.82"}',
},
{
displayName: 'Assignee ID',
name: 'assigneeId',
type: 'number',
default: '',
description: 'ID of the agent to assign the conversation to',
placeholder: '1',
},
{
displayName: 'Contact ID',
name: 'contactId',
type: 'number',
default: '',
description: 'The ID of an existing contact',
placeholder: '1',
},
{
displayName: 'Custom Attributes',
name: 'customAttributes',
type: 'json',
default: '{}',
description: 'Custom attributes for the conversation (JSON format)',
placeholder: '{"attribute_key": "attribute_value", "priority": 3}',
},
{
displayName: 'Snoozed Until',
name: 'snoozedUntil',
type: 'dateTime',
default: '',
description: 'Snoozed until date time',
},
{
displayName: 'Status',
name: 'status',
type: 'options',
options: [
{ name: 'Open', value: 'open' },
{ name: 'Resolved', value: 'resolved' },
{ name: 'Pending', value: 'pending' },
],
default: 'open',
description: 'Status of the conversation',
},
{
displayName: 'Team ID',
name: 'teamId',
type: 'number',
default: '',
description: 'ID of the team to assign the conversation to',
placeholder: '1',
},
{
displayName: 'WhatsApp Template Parameters',
name: 'templateParams',
type: 'fixedCollection',
typeOptions: {
multipleValues: false,
},
description: 'Template parameters for WhatsApp messages',
default: {},
options: [
{
name: 'template',
displayName: 'Template',
values: [
{
displayName: 'Category',
name: 'category',
type: 'options',
options: [
{ name: 'AUTHENTICATION', value: 'AUTHENTICATION' },
{ name: 'MARKETING', value: 'MARKETING' },
{ name: 'UTILITY', value: 'UTILITY' },
],
default: 'UTILITY',
description: 'Category of the template',
},
{
displayName: 'Language',
name: 'language',
type: 'string',
default: 'en_US',
description: 'Language code for the template',
placeholder: 'en_US',
},
{
displayName: 'Processed Parameters',
name: 'processedParams',
type: 'json',
default: '{"1": "parameter_value"}',
description: 'Template parameters as JSON object with parameter positions as keys',
placeholder: '{"1": "Chatwoot", "2": "Support Team"}',
},
{
displayName: 'Template Name',
name: 'name',
type: 'string',
default: '',
description: 'Name of the WhatsApp template',
placeholder: 'sample_issue_resolution',
},
],
},
],
},
],
},
{
displayName: 'Conversation ID',
name: 'conversationId',
type: 'number',
default: '',
required: true,
description: 'The numeric ID of the conversation',
placeholder: '1',
displayOptions: {
show: {
resource: ['message'],
},
},
},
{
displayName: 'Message ID',
name: 'messageId',
type: 'number',
default: '',
required: true,
description: 'The numeric ID of the message',
placeholder: '1',
displayOptions: {
show: {
resource: ['message'],
operation: ['get', 'update', 'delete'],
},
},
},
{
displayName: 'Content',
name: 'content',
type: 'string',
typeOptions: {
rows: 4,
},
default: '',
required: true,
description: 'The content of the message',
placeholder: 'Hello, how can I help you?',
displayOptions: {
show: {
resource: ['message'],
operation: ['update'],
},
},
},
{
displayName: 'Content',
name: 'content',
type: 'string',
typeOptions: {
rows: 4,
},
default: '',
required: true,
description: 'The content of the message',
placeholder: 'Hello, how can I help you?',
displayOptions: {
show: {
resource: ['message'],
operation: ['create'],
messageType: ['text'],
sendMode: ['fields'],
},
},
},
{
displayName: 'Additional Options',
name: 'additionalOptions',
type: 'collection',
placeholder: 'Add Option',
default: {},
displayOptions: {
show: {
resource: ['message'],
operation: ['create'],
messageType: ['text'],
sendMode: ['fields'],
},
},
options: [
{
displayName: 'Private Message',
name: 'private',
type: 'boolean',
default: false,
description: 'Whether this is a private message (internal note)',
},
{
displayName: 'WhatsApp Template Parameters',
name: 'templateParams',
type: 'fixedCollection',
typeOptions: {
multipleValues: false,
},
description: 'Template parameters for WhatsApp messages',
default: {},
options: [
{
name: 'template',
displayName: 'Template',
values: [
{
displayName: 'Category',
name: 'category',
type: 'options',
options: [
{ name: 'AUTHENTICATION', value: 'AUTHENTICATION' },
{ name: 'MARKETING', value: 'MARKETING' },
{ name: 'UTILITY', value: 'UTILITY' },
],
default: 'UTILITY',
description: 'Category of the template',
},
{
displayName: 'Language',
name: 'language',
type: 'string',
default: 'en_US',
description: 'Language code for the template',
placeholder: 'en_US',
},
{
displayName: 'Processed Parameters',
name: 'processedParams',
type: 'json',
default: '{"1": "parameter_value"}',
description: 'Template parameters as JSON object with parameter positions as keys',
placeholder: '{"1": "Chatwoot", "2": "Support Team"}',
},
{
displayName: 'Template Name',
name: 'name',
type: 'string',
default: '',
description: 'Name of the WhatsApp template',
placeholder: 'sample_issue_resolution',
},
],
},
],
},
],
},
{
displayName: 'Message Type',
name: 'messageType',
type: 'options',
options: [
{ name: 'Interactive Articles', value: 'article' },
{ name: 'Interactive Cards', value: 'cards' },
{ name: 'Interactive Form', value: 'form' },
{ name: 'Interactive Options', value: 'input_select' },
{ name: 'Text Message', value: 'text' },
],
default: 'text',
description: 'Type of message to send',
displayOptions: {
show: {
resource: ['message'],
operation: ['create'],
sendMode: ['fields'],
},
},
},
{
displayName: 'Send',
name: 'sendMode',
type: 'options',
options: [
{
name: 'Structured Fields',
value: 'fields',
description: 'Use the structured form fields below',
},
{
name: 'Custom JSON',
value: 'json',
description: 'Provide custom JSON for full control over the request',
},
],
default: 'fields',
description: 'How to send the data',
displayOptions: {
show: {
resource: ['message'],
operation: ['create'],
},
},
},
{
displayName: 'Custom JSON',
name: 'customJson',
type: 'json',
default: `{
"content": "Hello! How can I help you?",
"message_type": "outgoing",
"private": false,
"template_params": {
"name": "sample_issue_resolution",
"category": "UTILITY",
"language": "en_US",
"processed_params": {
"1": "Chatwoot"
}
}
}`,
description: 'Custom JSON payload to send with the request. This will override all structured fields.',
displayOptions: {
show: {
resource: ['message'],
operation: ['create'],
sendMode: ['json'],
},
},
},
{
displayName: 'Message Content',
name: 'interactiveContent',
type: 'string',
default: 'Select one of the items below',
required: true,
description: 'The message text to display with the options',
displayOptions: {
show: {
resource: ['message'],
operation: ['create'],
messageType: ['input_select'],
sendMode: ['fields'],
},
},
},
{
displayName: 'Options',
name: 'selectOptions',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
sortable: true,
},
description: 'Options for the user to select from',
default: { items: [{ title: 'Option 1', value: 'option1' }] },
displayOptions: {
show: {
resource: ['message'],
operation: ['create'],
messageType: ['input_select'],
},
},
options: [
{
name: 'items',
displayName: 'Option',
values: [
{
displayName: 'Title',
name: 'title',
type: 'string',
default: '',
description: 'Display text for the option',
placeholder: 'Option 1',
},
{
displayName: 'Value',
name: 'value',
type: 'string',
default: '',
description: 'Value returned when option is selected',
placeholder: 'option1',
},
],
},
],
},
{
displayName: 'Form Content',
name: 'formContent',
type: 'string',
default: 'Please fill out the form',
required: true,
description: 'The message text to display with the form',
displayOptions: {
show: {
resource: ['message'],
operation: ['create'],
messageType: ['form'],
},
},
},
{
displayName: 'Form Fields',
name: 'formFields',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
sortable: true,
},
description: 'Form fields to display',
default: { items: [{ name: 'email', type: 'email', label: 'Email', placeholder: 'Enter your email' }] },
displayOptions: {
show: {
resource: ['message'],
operation: ['create'],
messageType: ['form'],
},
},
options: [
{
name: 'items',
displayName: 'Form Field',
values: [
{
displayName: 'Default Value',
name: 'default',
type: 'string',
default: '',
description: 'Default value for the field',
},
{
displayName: 'Field Name',
name: 'name',
type: 'string',
default: '',
description: 'Internal name for the field',
placeholder: 'email',
},
{
displayName: 'Field Type',
name: 'type',
type: 'options',
options: [
{ name: 'Text', value: 'text' },
{ name: 'Email', value: 'email' },
{ name: 'Text Area', value: 'text_area' },
{ name: 'Select', value: 'select' },
],
default: 'text',
description: 'Type of form field',
},
{
displayName: 'Label',
name: 'label',
type: 'string',
default: '',
description: 'Display label for the field',
placeholder: 'Email Address',
},
{
displayName: 'Placeholder',
name: 'placeholder',
type: 'string',
default: '',
description: 'Placeholder text for the field',
placeholder: 'Enter your email',
},
{
displayName: 'Select Options',
name: 'options',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
},
displayOptions: {
show: {
type: ['select'],
},
},
default: { items: [{ label: '🌯 Option 1', value: 'option1' }] },
options: [
{