n8n-nodes-digitalsac 0.2.5 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,6 +13,13 @@ Este pacote adiciona um nó personalizado ao n8n para interagir com a API do Dig
13
13
  - Transferir para Atendente
14
14
  - Fechar Ticket
15
15
  - Enviar Mensagem (texto e arquivos)
16
+ - Listar Tags
17
+ - Vincular Tag
18
+ - Criar Tag
19
+ - Listar Kanbans
20
+ - Vincular Kanban
21
+ - Listar Carteiras
22
+ - Vincular Carteira
16
23
 
17
24
  ## Instalação
18
25
 
@@ -128,6 +135,64 @@ Onde:
128
135
  ```
129
136
  Onde `data` é o nome da propriedade binária que contém o arquivo.
130
137
 
138
+ ### Listar Tags
139
+ 1. Selecione a operação **Listar Tags**
140
+ 2. Não é necessário configurar parâmetros adicionais
141
+
142
+ ### Vincular Tag
143
+ 1. Selecione a operação **Vincular Tag**
144
+ 2. No campo **Dados (JSON)**, insira os dados no formato:
145
+ ```json
146
+ {
147
+ "ticketId": 123,
148
+ "tagId": 456
149
+ }
150
+ ```
151
+ Onde:
152
+ - `ticketId`: ID do ticket
153
+ - `tagId`: ID da tag a ser vinculada
154
+
155
+ ### Criar Tag
156
+ 1. Selecione a operação **Criar Tag**
157
+ 2. No campo **Nome da Tag**, insira o nome da tag
158
+ 3. No campo **Cor da Tag**, insira a cor em formato hexadecimal (ex: #FF5733, #2196F3, #4CAF50)
159
+
160
+ ### Listar Kanbans
161
+ 1. Selecione a operação **Listar Kanbans**
162
+ 2. No campo **User ID**, insira o ID do usuário
163
+
164
+ ### Vincular Kanban
165
+ 1. Selecione a operação **Vincular Kanban**
166
+ 2. No campo **Dados (JSON)**, insira os dados no formato:
167
+ ```json
168
+ {
169
+ "ticketId": 123,
170
+ "kanbanId": 456,
171
+ "userId": 789
172
+ }
173
+ ```
174
+ Onde:
175
+ - `ticketId`: ID do ticket
176
+ - `kanbanId`: ID do kanban a ser vinculado
177
+ - `userId`: ID do usuário
178
+
179
+ ### Listar Carteiras
180
+ 1. Selecione a operação **Listar Carteiras**
181
+ 2. Não é necessário configurar parâmetros adicionais
182
+
183
+ ### Vincular Carteira
184
+ 1. Selecione a operação **Vincular Carteira**
185
+ 2. No campo **Dados (JSON)**, insira os dados no formato:
186
+ ```json
187
+ {
188
+ "ticketId": 123,
189
+ "userId": 456
190
+ }
191
+ ```
192
+ Onde:
193
+ - `ticketId`: ID do ticket
194
+ - `userId`: ID do usuário da carteira
195
+
131
196
  ## Exemplos de Respostas da API
132
197
 
133
198
  ### Transferir para Fila
@@ -160,6 +225,37 @@ Onde `data` é o nome da propriedade binária que contém o arquivo.
160
225
  }
161
226
  ```
162
227
 
228
+ ### Criar Tag
229
+ **Resposta de sucesso (tag criada):**
230
+ ```json
231
+ {
232
+ "status": 1,
233
+ "tagId": 456
234
+ }
235
+ ```
236
+
237
+ **Resposta quando tag já existe:**
238
+ ```json
239
+ {
240
+ "status": 2
241
+ }
242
+ ```
243
+
244
+ **Resposta de erro:**
245
+ ```json
246
+ {
247
+ "status": 0
248
+ }
249
+ ```
250
+
251
+ ### Vincular Tag/Kanban/Carteira
252
+ **Resposta de sucesso:**
253
+ ```json
254
+ {
255
+ "status": 0
256
+ }
257
+ ```
258
+
163
259
  ## Exemplo de Fluxo
164
260
 
165
261
  ### Enviar PDF para um contato
@@ -199,6 +295,47 @@ Onde `data` é o nome da propriedade binária que contém o arquivo.
199
295
  }
200
296
  ```
201
297
 
298
+ ### Criar uma tag e vincular a um ticket
299
+ 1. Adicione um nó **Digitalsac**
300
+ - Operação: **Criar Tag**
301
+ - Nome da Tag: `Suporte Técnico`
302
+ - Cor da Tag: `#2196F3`
303
+ 2. Conecte a outro nó **Digitalsac**
304
+ - Operação: **Vincular Tag**
305
+ - Dados (JSON):
306
+ ```json
307
+ {
308
+ "ticketId": 123,
309
+ "tagId": "{{$json.tagId}}"
310
+ }
311
+ ```
312
+
313
+ ### Listar kanbans de um usuário e vincular a um ticket
314
+ 1. Adicione um nó **Digitalsac**
315
+ - Operação: **Listar Kanbans**
316
+ - User ID: `10`
317
+ 2. Conecte a outro nó **Digitalsac**
318
+ - Operação: **Vincular Kanban**
319
+ - Dados (JSON):
320
+ ```json
321
+ {
322
+ "ticketId": 123,
323
+ "kanbanId": 5,
324
+ "userId": 10
325
+ }
326
+ ```
327
+
328
+ ### Vincular carteira a um ticket
329
+ 1. Adicione um nó **Digitalsac**
330
+ - Operação: **Vincular Carteira**
331
+ - Dados (JSON):
332
+ ```json
333
+ {
334
+ "ticketId": 123,
335
+ "userId": 15
336
+ }
337
+ ```
338
+
202
339
  ## Suporte
203
340
 
204
341
  Para suporte, entre em contato com [contato@digitalsac.io](mailto:contato@digitalsac.io).
@@ -36,6 +36,13 @@ class Digitalsac {
36
36
  { name: 'Transferir para Atendente', value: 'transferAgent' },
37
37
  { name: 'Fechar Ticket', value: 'closeTicket' },
38
38
  { name: 'Enviar Mensagem', value: 'sendMessage' },
39
+ { name: 'Listar Tags', value: 'listTags' },
40
+ { name: 'Vincular Tag', value: 'linkTag' },
41
+ { name: 'Criar Tag', value: 'createTag' },
42
+ { name: 'Listar Kanbans', value: 'listKanbans' },
43
+ { name: 'Vincular Kanban', value: 'linkKanban' },
44
+ { name: 'Listar Carteiras', value: 'listCarteiras' },
45
+ { name: 'Vincular Carteira', value: 'linkCarteira' },
39
46
  ],
40
47
  default: 'validateWhatsapp',
41
48
  },
@@ -51,17 +58,89 @@ class Digitalsac {
51
58
  },
52
59
  description: 'Número, CPF ou UUID da mensagem (conforme operação)',
53
60
  },
61
+ {
62
+ displayName: 'User ID',
63
+ name: 'userId',
64
+ type: 'number',
65
+ default: 1,
66
+ displayOptions: {
67
+ show: {
68
+ operation: ['listKanbans'],
69
+ },
70
+ },
71
+ description: 'ID do usuário para listar kanbans',
72
+ },
73
+ {
74
+ displayName: 'Corpo da Mensagem',
75
+ name: 'messageBody',
76
+ type: 'string',
77
+ default: 'Mensagem de teste',
78
+ displayOptions: {
79
+ show: {
80
+ operation: ['sendMessage'],
81
+ },
82
+ },
83
+ description: 'Texto da mensagem a ser enviada',
84
+ },
85
+ {
86
+ displayName: 'Número de Telefone',
87
+ name: 'phoneNumber',
88
+ type: 'string',
89
+ default: '5511999999999',
90
+ displayOptions: {
91
+ show: {
92
+ operation: ['sendMessage'],
93
+ },
94
+ },
95
+ description: 'Número de telefone no formato DDI+DDD+Número (ex: 5511999999999)',
96
+ },
97
+ {
98
+ displayName: 'Chave Externa',
99
+ name: 'externalKey',
100
+ type: 'string',
101
+ default: 'Digitalsac123',
102
+ displayOptions: {
103
+ show: {
104
+ operation: ['sendMessage'],
105
+ },
106
+ },
107
+ description: 'Identificador único opcional para a mensagem',
108
+ },
109
+ {
110
+ displayName: 'Nome da Tag',
111
+ name: 'tagName',
112
+ type: 'string',
113
+ default: 'Nova Tag',
114
+ displayOptions: {
115
+ show: {
116
+ operation: ['createTag'],
117
+ },
118
+ },
119
+ description: 'Nome da tag a ser criada',
120
+ },
121
+ {
122
+ displayName: 'Cor da Tag',
123
+ name: 'tagColor',
124
+ type: 'string',
125
+ default: '#2196F3',
126
+ displayOptions: {
127
+ show: {
128
+ operation: ['createTag'],
129
+ },
130
+ },
131
+ description: 'Cor da tag em formato hexadecimal (ex: #FF5733, #2196F3, #4CAF50)',
132
+ },
54
133
  {
55
134
  displayName: 'Dados (JSON)',
56
135
  name: 'bodyData',
57
136
  type: 'json',
58
- default: '{"body": "Mensagem de teste", "number": "5511999999999", "externalKey": "chave123"}',
137
+ default: '{"ticketId": 123, "queueId": 1}',
59
138
  displayOptions: {
60
139
  show: {
61
- operation: ['validateDate', 'transferQueue', 'transferAgent', 'closeTicket', 'sendMessage'],
140
+ operation: ['validateDate', 'transferQueue', 'transferAgent', 'closeTicket', 'linkTag', 'linkKanban', 'linkCarteira'],
62
141
  },
63
142
  },
64
- description: 'Dados no formato JSON',
143
+ description: 'Dados no formato JSON conforme a operação selecionada',
65
144
  },
66
145
  ],
67
146
  };
@@ -172,12 +251,74 @@ class Digitalsac {
172
251
  case 'sendMessage':
173
252
  url = `/v1/api/external/${param}`;
174
253
  method = 'POST';
254
+ // Usar campos separados em vez de JSON
255
+ const messageBody = this.getNodeParameter('messageBody', i);
256
+ const phoneNumber = this.getNodeParameter('phoneNumber', i);
257
+ const externalKey = this.getNodeParameter('externalKey', i);
258
+ // Criar o objeto diretamente
259
+ body = {
260
+ body: messageBody,
261
+ number: phoneNumber,
262
+ externalKey: externalKey
263
+ };
264
+ headers['Content-Type'] = 'application/json';
265
+ options = {
266
+ method,
267
+ headers,
268
+ body,
269
+ uri: `${baseUrl}${url}`,
270
+ json: true,
271
+ };
272
+ break;
273
+ case 'listTags':
274
+ url = '/typebot/listar_tags';
275
+ break;
276
+ case 'linkTag':
277
+ url = '/typebot/vincular_tag';
278
+ method = 'POST';
279
+ try {
280
+ body = JSON.parse(this.getNodeParameter('bodyData', i));
281
+ }
282
+ catch (e) {
283
+ throw new Error('Formato de JSON inválido para Dados (JSON)');
284
+ }
285
+ headers['Content-Type'] = 'application/json';
286
+ options = {
287
+ method,
288
+ headers,
289
+ body,
290
+ uri: `${baseUrl}${url}`,
291
+ json: true,
292
+ };
293
+ break;
294
+ case 'createTag':
295
+ url = '/typebot/criar_tag';
296
+ method = 'POST';
297
+ // Usar campos separados para criar tag
298
+ const tagName = this.getNodeParameter('tagName', i);
299
+ const tagColor = this.getNodeParameter('tagColor', i);
300
+ body = {
301
+ tag: tagName,
302
+ color: tagColor
303
+ };
304
+ headers['Content-Type'] = 'application/json';
305
+ options = {
306
+ method,
307
+ headers,
308
+ body,
309
+ uri: `${baseUrl}${url}`,
310
+ json: true,
311
+ };
312
+ break;
313
+ case 'listKanbans':
314
+ const userId = this.getNodeParameter('userId', i);
315
+ url = `/typebot/listar_kanbans?userId=${userId}`;
316
+ break;
317
+ case 'linkKanban':
318
+ url = '/typebot/vincular_kanban';
319
+ method = 'POST';
175
320
  try {
176
- // Obter o JSON como string e converter para objeto
177
- const bodyDataStr = this.getNodeParameter('bodyData', i);
178
- // Remover espaços extras e quebras de linha
179
- const cleanJson = bodyDataStr.replace(/\s+/g, ' ').trim();
180
- body = JSON.parse(cleanJson);
321
+ body = JSON.parse(this.getNodeParameter('bodyData', i));
181
322
  }
182
323
  catch (e) {
183
324
  throw new Error('Formato de JSON inválido para Dados (JSON)');
@@ -186,7 +327,28 @@ class Digitalsac {
186
327
  options = {
187
328
  method,
188
329
  headers,
189
- body, // Enviar o objeto diretamente, sem JSON.stringify
330
+ body,
331
+ uri: `${baseUrl}${url}`,
332
+ json: true,
333
+ };
334
+ break;
335
+ case 'listCarteiras':
336
+ url = '/typebot/listar_carteiras';
337
+ break;
338
+ case 'linkCarteira':
339
+ url = '/typebot/vincular_carteira';
340
+ method = 'POST';
341
+ try {
342
+ body = JSON.parse(this.getNodeParameter('bodyData', i));
343
+ }
344
+ catch (e) {
345
+ throw new Error('Formato de JSON inválido para Dados (JSON)');
346
+ }
347
+ headers['Content-Type'] = 'application/json';
348
+ options = {
349
+ method,
350
+ headers,
351
+ body,
190
352
  uri: `${baseUrl}${url}`,
191
353
  json: true,
192
354
  };
@@ -41,6 +41,13 @@ export class Digitalsac implements INodeType {
41
41
  { name: 'Transferir para Atendente', value: 'transferAgent' },
42
42
  { name: 'Fechar Ticket', value: 'closeTicket' },
43
43
  { name: 'Enviar Mensagem', value: 'sendMessage' },
44
+ { name: 'Listar Tags', value: 'listTags' },
45
+ { name: 'Vincular Tag', value: 'linkTag' },
46
+ { name: 'Criar Tag', value: 'createTag' },
47
+ { name: 'Listar Kanbans', value: 'listKanbans' },
48
+ { name: 'Vincular Kanban', value: 'linkKanban' },
49
+ { name: 'Listar Carteiras', value: 'listCarteiras' },
50
+ { name: 'Vincular Carteira', value: 'linkCarteira' },
44
51
  ],
45
52
  default: 'validateWhatsapp',
46
53
  },
@@ -56,17 +63,89 @@ export class Digitalsac implements INodeType {
56
63
  },
57
64
  description: 'Número, CPF ou UUID da mensagem (conforme operação)',
58
65
  },
66
+ {
67
+ displayName: 'User ID',
68
+ name: 'userId',
69
+ type: 'number',
70
+ default: 1,
71
+ displayOptions: {
72
+ show: {
73
+ operation: ['listKanbans'],
74
+ },
75
+ },
76
+ description: 'ID do usuário para listar kanbans',
77
+ },
78
+ {
79
+ displayName: 'Corpo da Mensagem',
80
+ name: 'messageBody',
81
+ type: 'string',
82
+ default: 'Mensagem de teste',
83
+ displayOptions: {
84
+ show: {
85
+ operation: ['sendMessage'],
86
+ },
87
+ },
88
+ description: 'Texto da mensagem a ser enviada',
89
+ },
90
+ {
91
+ displayName: 'Número de Telefone',
92
+ name: 'phoneNumber',
93
+ type: 'string',
94
+ default: '5511999999999',
95
+ displayOptions: {
96
+ show: {
97
+ operation: ['sendMessage'],
98
+ },
99
+ },
100
+ description: 'Número de telefone no formato DDI+DDD+Número (ex: 5511999999999)',
101
+ },
102
+ {
103
+ displayName: 'Chave Externa',
104
+ name: 'externalKey',
105
+ type: 'string',
106
+ default: 'Digitalsac123',
107
+ displayOptions: {
108
+ show: {
109
+ operation: ['sendMessage'],
110
+ },
111
+ },
112
+ description: 'Identificador único opcional para a mensagem',
113
+ },
114
+ {
115
+ displayName: 'Nome da Tag',
116
+ name: 'tagName',
117
+ type: 'string',
118
+ default: 'Nova Tag',
119
+ displayOptions: {
120
+ show: {
121
+ operation: ['createTag'],
122
+ },
123
+ },
124
+ description: 'Nome da tag a ser criada',
125
+ },
126
+ {
127
+ displayName: 'Cor da Tag',
128
+ name: 'tagColor',
129
+ type: 'string',
130
+ default: '#2196F3',
131
+ displayOptions: {
132
+ show: {
133
+ operation: ['createTag'],
134
+ },
135
+ },
136
+ description: 'Cor da tag em formato hexadecimal (ex: #FF5733, #2196F3, #4CAF50)',
137
+ },
59
138
  {
60
139
  displayName: 'Dados (JSON)',
61
140
  name: 'bodyData',
62
141
  type: 'json',
63
- default: '{"body": "Mensagem de teste", "number": "5511999999999", "externalKey": "chave123"}',
142
+ default: '{"ticketId": 123, "queueId": 1}',
64
143
  displayOptions: {
65
144
  show: {
66
- operation: ['validateDate', 'transferQueue', 'transferAgent', 'closeTicket', 'sendMessage'],
145
+ operation: ['validateDate', 'transferQueue', 'transferAgent', 'closeTicket', 'linkTag', 'linkKanban', 'linkCarteira'],
67
146
  },
68
147
  },
69
- description: 'Dados no formato JSON',
148
+ description: 'Dados no formato JSON conforme a operação selecionada',
70
149
  },
71
150
  ],
72
151
  };
@@ -178,21 +257,107 @@ export class Digitalsac implements INodeType {
178
257
  case 'sendMessage':
179
258
  url = `/v1/api/external/${param}`;
180
259
  method = 'POST';
260
+
261
+ // Usar campos separados em vez de JSON
262
+ const messageBody = this.getNodeParameter('messageBody', i) as string;
263
+ const phoneNumber = this.getNodeParameter('phoneNumber', i) as string;
264
+ const externalKey = this.getNodeParameter('externalKey', i) as string;
265
+
266
+ // Criar o objeto diretamente
267
+ body = {
268
+ body: messageBody,
269
+ number: phoneNumber,
270
+ externalKey: externalKey
271
+ };
272
+
273
+ headers['Content-Type'] = 'application/json';
274
+ options = {
275
+ method,
276
+ headers,
277
+ body,
278
+ uri: `${baseUrl}${url}`,
279
+ json: true,
280
+ };
281
+ break;
282
+ case 'listTags':
283
+ url = '/typebot/listar_tags';
284
+ break;
285
+ case 'linkTag':
286
+ url = '/typebot/vincular_tag';
287
+ method = 'POST';
181
288
  try {
182
- // Obter o JSON como string e converter para objeto
183
- const bodyDataStr = this.getNodeParameter('bodyData', i) as string;
184
- // Remover espaços extras e quebras de linha
185
- const cleanJson = bodyDataStr.replace(/\s+/g, ' ').trim();
186
- body = JSON.parse(cleanJson);
289
+ body = JSON.parse(this.getNodeParameter('bodyData', i) as string);
187
290
  } catch (e) {
188
291
  throw new Error('Formato de JSON inválido para Dados (JSON)');
189
292
  }
293
+ headers['Content-Type'] = 'application/json';
294
+ options = {
295
+ method,
296
+ headers,
297
+ body,
298
+ uri: `${baseUrl}${url}`,
299
+ json: true,
300
+ };
301
+ break;
302
+ case 'createTag':
303
+ url = '/typebot/criar_tag';
304
+ method = 'POST';
305
+
306
+ // Usar campos separados para criar tag
307
+ const tagName = this.getNodeParameter('tagName', i) as string;
308
+ const tagColor = this.getNodeParameter('tagColor', i) as string;
309
+
310
+ body = {
311
+ tag: tagName,
312
+ color: tagColor
313
+ };
190
314
 
191
315
  headers['Content-Type'] = 'application/json';
192
316
  options = {
193
317
  method,
194
318
  headers,
195
- body, // Enviar o objeto diretamente, sem JSON.stringify
319
+ body,
320
+ uri: `${baseUrl}${url}`,
321
+ json: true,
322
+ };
323
+ break;
324
+ case 'listKanbans':
325
+ const userId = this.getNodeParameter('userId', i) as number;
326
+ url = `/typebot/listar_kanbans?userId=${userId}`;
327
+ break;
328
+ case 'linkKanban':
329
+ url = '/typebot/vincular_kanban';
330
+ method = 'POST';
331
+ try {
332
+ body = JSON.parse(this.getNodeParameter('bodyData', i) as string);
333
+ } catch (e) {
334
+ throw new Error('Formato de JSON inválido para Dados (JSON)');
335
+ }
336
+ headers['Content-Type'] = 'application/json';
337
+ options = {
338
+ method,
339
+ headers,
340
+ body,
341
+ uri: `${baseUrl}${url}`,
342
+ json: true,
343
+ };
344
+ break;
345
+ case 'listCarteiras':
346
+ url = '/typebot/listar_carteiras';
347
+ break;
348
+ case 'linkCarteira':
349
+ url = '/typebot/vincular_carteira';
350
+ method = 'POST';
351
+ try {
352
+ body = JSON.parse(this.getNodeParameter('bodyData', i) as string);
353
+ } catch (e) {
354
+ throw new Error('Formato de JSON inválido para Dados (JSON)');
355
+ }
356
+ headers['Content-Type'] = 'application/json';
357
+ options = {
358
+ method,
359
+ headers,
360
+ body,
196
361
  uri: `${baseUrl}${url}`,
197
362
  json: true,
198
363
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-digitalsac",
3
- "version": "0.2.5",
3
+ "version": "0.2.8",
4
4
  "description": "Izing Pro Digitalsac",
5
5
  "keywords": [
6
6
  "n8n",