n8n-nodes-underchat 0.1.11 → 0.1.13

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
@@ -4,9 +4,11 @@ Community Node do n8n para integrar workflows à API pública da UnderChat.
4
4
 
5
5
  ## Operações
6
6
 
7
+ - Verificar dias e faixas de horário, com saídas Dentro do horário e Fora do horário
7
8
  - Entrar em um atendimento aguardando com o executor selecionado
8
9
  - Buscar ID do contato pelo telefone
9
10
  - Criar contato
11
+ - Buscar/criar o contato e iniciar um atendimento em uma única operação
10
12
  - Enviar mensagem de texto por `chat_id`
11
13
  - Enviar mensagem por telefone, criando o contato quando necessário
12
14
  - Enviar template oficial em uma conversa
@@ -27,6 +29,64 @@ A operação **Enviar mensagem por telefone** executa automaticamente:
27
29
  buscar contato → criar se necessário → iniciar conversa → enviar mensagem
28
30
  ```
29
31
 
32
+ ## Buscar/criar contato e iniciar atendimento
33
+
34
+ A operação **Buscar/Criar Contato E Iniciar Atendimento** (`startChatByPhone`)
35
+ substitui a sequência manual de nodes usada para localizar ou cadastrar o contato,
36
+ obter seu ID e abrir a conversa. Ela recebe o telefone diretamente e executa:
37
+
38
+ ```text
39
+ buscar pelo telefone → criar se não existir → buscar o ID novamente
40
+ → validar canal e setor → reutilizar um chat ativo ou iniciar o atendimento
41
+ ```
42
+
43
+ Configure os seguintes campos:
44
+
45
+ - **Executor:** usuário ativo que realiza as chamadas à API.
46
+ - **DDI** e **Telefone:** usados na busca exata; informe o telefone sem o DDI.
47
+ - **Nome para novo contato:** usado somente quando o contato não existe.
48
+ - **Criar se não existir:** ativado por padrão. Quando desativado, a operação falha
49
+ sem criar dados caso o telefone não seja encontrado.
50
+ - **Canal:** obrigatório em toda nova abertura, oficial ou não.
51
+ - **Setor:** obrigatório em toda nova abertura, oficial ou não.
52
+ - **Template oficial** e **Variáveis:** usados quando as regras do canal oficial
53
+ exigirem um template aprovado.
54
+
55
+ O usuário não precisa consultar nem transportar o `contact_id`. A API de criação
56
+ de contato não devolve esse ID; por isso o node consulta novamente o telefone após
57
+ uma criação bem-sucedida e só então inicia o atendimento. Se já existir um chat
58
+ ativo no mesmo canal e setor, ele é reutilizado em vez de criar outro. Um chat no
59
+ mesmo canal, mas em outro setor, não é movido silenciosamente: use a operação de
60
+ transferência ou selecione o setor atual.
61
+
62
+ O cadastro do contato e a abertura do atendimento são chamadas separadas da API.
63
+ Se a criação funcionar e uma validação posterior ou a abertura falhar, o contato
64
+ permanece cadastrado. Uma nova execução o localizará e reutilizará, sem duplicá-lo.
65
+
66
+ ### Canal oficial e templates
67
+
68
+ Depois de resolver o contato, o node consulta o contexto oficial usando o canal e
69
+ o `contact_id`. Ele respeita a janela retornada pela UnderChat:
70
+
71
+ - texto livre só pode ser enviado quando `can_send_freeform` permitir;
72
+ - um template só pode ser usado quando estiver aprovado e disponível no contexto;
73
+ - quando `requires_template` estiver ativo, a abertura não continua sem um template
74
+ aprovado e todos os valores obrigatórios;
75
+ - `key`, componente, posição, nome do parâmetro e índice de botão vêm da API; o
76
+ usuário informa apenas os valores das variáveis, pelos campos ou em JSON;
77
+ - o template é enviado junto da abertura do chat, evitando depender de um
78
+ `chat_id` criado em um node anterior.
79
+
80
+ O campo **Template oficial** usa o seletor do n8n e também permite informar o nome
81
+ manualmente. A API pública lista os templates no contexto oficial, que exige um
82
+ `contact_id`. Quando o telefone é dinâmico ou o contato ainda não existe, o node
83
+ usa um contato já vinculado ao canal somente para carregar o catálogo no editor,
84
+ sem criar nem alterar dados. Na execução, ele consulta novamente o contexto com o
85
+ contato real e recusa qualquer template que não esteja aprovado ou cujas variáveis
86
+ não correspondam ao contrato retornado. Se o canal ainda não tiver nenhum contato,
87
+ o catálogo não poderá ser carregado antecipadamente; nesse caso ainda é possível
88
+ usar o modo manual/JSON, com a mesma validação rigorosa durante a execução.
89
+
30
90
  Na operação **Transferir para setor ou usuário**, ative **Entrar no atendimento
31
91
  antes de transferir** quando o chat ainda estiver aguardando atendimento. O node
32
92
  muda o status para `in_chat` e, após a confirmação da API, realiza a transferência.
@@ -34,6 +94,65 @@ muda o status para `in_chat` e, após a confirmação da API, realiza a transfer
34
94
  A API pública permite controlar a mensagem automática da transferência, mas não
35
95
  expõe uma opção equivalente para a mensagem de ingresso no atendimento.
36
96
 
97
+ ## Horário de funcionamento
98
+
99
+ O recurso **Horário de funcionamento → Verificar horário** permite configurar uma
100
+ agenda semanal diretamente no node, sem código, API Key ou usuário executor.
101
+ A agenda é configurada no n8n: não consulta nem altera os horários cadastrados no
102
+ painel da UnderChat. Use o node **UnderChat** normal, não a versão **UnderChat Tool**.
103
+
104
+ 1. Selecione o recurso **Horário de funcionamento**.
105
+ 2. Escolha o **Fuso horário**: Brasília, o fuso do workflow, UTC ou um nome IANA
106
+ personalizado, como `America/Manaus`.
107
+ 3. Em **Faixas de horário**, clique em **Adicionar faixa de horário**.
108
+ 4. Selecione um ou mais **Dias da semana** e preencha **Início** e **Fim** no
109
+ formato `HH:mm`. Para liberar o dia todo, ative **Dia inteiro**.
110
+ 5. Adicione outras faixas para intervalos de almoço, horários diferentes na sexta
111
+ ou regras específicas para o fim de semana.
112
+ 6. Conecte as saídas:
113
+
114
+ - **Dentro do horário:** segue quando qualquer faixa corresponder ao momento atual.
115
+ - **Fora do horário:** segue quando nenhuma faixa corresponder.
116
+
117
+ As duas saídas preservam os dados de entrada, arquivos binários e o vínculo de cada
118
+ item com os nodes anteriores. O recurso não envia mensagens por conta própria.
119
+ Deixar uma saída sem conexão encerra aquele caminho.
120
+
121
+ ### Exemplo: agenda Redireciona
122
+
123
+ Para reproduzir a agenda de redirecionamento apresentada no painel, selecione
124
+ **Brasília (America/Sao_Paulo)** e cadastre estas cinco faixas:
125
+
126
+ | Dias selecionados | Início | Fim | Dia inteiro |
127
+ | --- | --- | --- | --- |
128
+ | Segunda a sexta | 00:00 | 07:59 | Não |
129
+ | Segunda a sexta | 12:01 | 12:59 | Não |
130
+ | Segunda a quinta | 18:00 | 23:59 | Não |
131
+ | Sexta | 17:00 | 23:59 | Não |
132
+ | Sábado e domingo | — | — | Sim |
133
+
134
+ No fluxo de mensagens, coloque esse node na saída de **mensagens recebidas**, após
135
+ a separação de mensagens enviadas/recebidas. Ligue **Dentro do horário** à automação
136
+ e deixe **Fora do horário** sem conexão. Isso mantém o caminho que bloqueia a IA
137
+ quando um atendente humano responde, independentemente do horário.
138
+
139
+ ### Regras e cuidados
140
+
141
+ - O minuto final é inclusivo: `07:59` inclui até `07:59:59.999`; `08:00` já fica fora.
142
+ - O intervalo `12:01–12:59` não inclui o minuto `12:00`.
143
+ - Uma faixa `22:00–02:00` começa no dia selecionado e termina às `02:00:59.999` do
144
+ dia seguinte. Isso também funciona de domingo para segunda.
145
+ - Início e fim iguais liberam apenas esse minuto. Use **Dia inteiro** para 24 horas.
146
+ - Dias sem faixas são considerados fora do horário; faixas sobrepostas não duplicam itens.
147
+ - A data/hora atual é capturada uma vez por execução do node, no fuso escolhido.
148
+ O recurso não é um agendador e não usa o horário original de uma mensagem antiga.
149
+ - Feriados seguem a regra semanal; não há calendário de feriados nesta versão.
150
+ - É obrigatório cadastrar ao menos uma faixa válida. Dias, horários ou fusos
151
+ inválidos causam erro, sem encaminhar o item como se a configuração fosse válida.
152
+ - Para usar o recurso como condição, mantenha **Always Output Data** desativado e
153
+ **On Error → Stop Workflow**. Alterar essas opções genéricas do n8n pode fazer o
154
+ fluxo continuar mesmo sem correspondência ou quando ocorrer um erro.
155
+
37
156
  ## Requisitos
38
157
 
39
158
  - Node.js 22 ou superior
@@ -42,12 +161,16 @@ expõe uma opção equivalente para a mensagem de ingresso no atendimento.
42
161
  - Token da API pública
43
162
  - Um usuário executor ativo nas operações que exigem contexto de usuário
44
163
 
164
+ Conta, API Key e executor são necessários apenas para as operações que acessam
165
+ a API da UnderChat. O recurso **Horário de funcionamento** é local.
166
+
45
167
  ## Desenvolvimento
46
168
 
47
169
  ```bash
48
170
  npm install
49
171
  npm run build
50
172
  npm run lint
173
+ npm test
51
174
  npm run dev
52
175
  ```
53
176
 
@@ -0,0 +1,9 @@
1
+ import type { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
2
+ export interface BusinessHoursRule {
3
+ days: number[];
4
+ startMinute: number;
5
+ endMinute: number;
6
+ }
7
+ export declare function parseBusinessHoursRules(value: unknown): BusinessHoursRule[];
8
+ export declare function isWithinBusinessHours(date: Date, timeZone: string, rules: BusinessHoursRule[]): boolean;
9
+ export declare function executeBusinessHours(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseBusinessHoursRules = parseBusinessHoursRules;
4
+ exports.isWithinBusinessHours = isWithinBusinessHours;
5
+ exports.executeBusinessHours = executeBusinessHours;
6
+ const n8n_workflow_1 = require("n8n-workflow");
7
+ const weekdayNumbers = {
8
+ Mon: 1,
9
+ Tue: 2,
10
+ Wed: 3,
11
+ Thu: 4,
12
+ Fri: 5,
13
+ Sat: 6,
14
+ Sun: 7,
15
+ };
16
+ function isRecord(value) {
17
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
18
+ }
19
+ function parseTime(value, field, ruleNumber) {
20
+ if (typeof value !== 'string') {
21
+ throw new Error(`Faixa ${ruleNumber}: informe ${field} no formato HH:mm`);
22
+ }
23
+ const match = /^([01]?\d|2[0-3]):([0-5]\d)$/.exec(value.trim());
24
+ if (!match) {
25
+ throw new Error(`Faixa ${ruleNumber}: ${field} inválido. Use HH:mm, de 00:00 a 23:59`);
26
+ }
27
+ return Number(match[1]) * 60 + Number(match[2]);
28
+ }
29
+ function parseBusinessHoursRules(value) {
30
+ if (!isRecord(value) ||
31
+ !Array.isArray(value.rules) ||
32
+ value.rules.length === 0) {
33
+ throw new Error('Adicione pelo menos uma faixa de horário e selecione os dias da semana');
34
+ }
35
+ return value.rules.map((rule, index) => {
36
+ const ruleNumber = index + 1;
37
+ if (!isRecord(rule) ||
38
+ !Array.isArray(rule.days) ||
39
+ rule.days.length === 0) {
40
+ throw new Error(`Faixa ${ruleNumber}: selecione pelo menos um dia da semana`);
41
+ }
42
+ const days = rule.days.map((day) => {
43
+ if ((typeof day !== 'number' && typeof day !== 'string') ||
44
+ !/^[1-7]$/.test(String(day))) {
45
+ throw new Error(`Faixa ${ruleNumber}: dia da semana inválido`);
46
+ }
47
+ return Number(day);
48
+ });
49
+ if (rule.allDay !== undefined && typeof rule.allDay !== 'boolean') {
50
+ throw new Error(`Faixa ${ruleNumber}: Dia Inteiro deve estar ativado ou desativado`);
51
+ }
52
+ return {
53
+ days: [...new Set(days)],
54
+ startMinute: rule.allDay === true
55
+ ? 0
56
+ : parseTime(rule.startTime, 'o início', ruleNumber),
57
+ endMinute: rule.allDay === true
58
+ ? 1439
59
+ : parseTime(rule.endTime, 'o fim', ruleNumber),
60
+ };
61
+ });
62
+ }
63
+ function isWithinBusinessHours(date, timeZone, rules) {
64
+ var _a, _b, _c, _d;
65
+ if (!(date instanceof Date) || !Number.isFinite(date.getTime())) {
66
+ throw new Error('Não foi possível determinar a data e hora da verificação');
67
+ }
68
+ if (typeof timeZone !== 'string' || timeZone.trim() === '') {
69
+ throw new Error('Informe um fuso horário válido, como America/Sao_Paulo');
70
+ }
71
+ let formatter;
72
+ try {
73
+ formatter = new Intl.DateTimeFormat('en-US', {
74
+ timeZone: timeZone.trim(),
75
+ weekday: 'short',
76
+ hour: '2-digit',
77
+ minute: '2-digit',
78
+ hourCycle: 'h23',
79
+ });
80
+ }
81
+ catch {
82
+ throw new Error(`Fuso horário inválido: ${timeZone}. Use um nome IANA, como America/Sao_Paulo`);
83
+ }
84
+ const parts = formatter.formatToParts(date);
85
+ const weekday = weekdayNumbers[(_b = (_a = parts.find((part) => part.type === 'weekday')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : ''];
86
+ const hour = Number((_c = parts.find((part) => part.type === 'hour')) === null || _c === void 0 ? void 0 : _c.value);
87
+ const minute = Number((_d = parts.find((part) => part.type === 'minute')) === null || _d === void 0 ? void 0 : _d.value);
88
+ if (!weekday || !Number.isFinite(hour) || !Number.isFinite(minute)) {
89
+ throw new Error('Não foi possível interpretar o horário no fuso selecionado');
90
+ }
91
+ const minuteOfDay = hour * 60 + minute;
92
+ const previousWeekday = weekday === 1 ? 7 : weekday - 1;
93
+ return rules.some((rule) => {
94
+ if (rule.startMinute <= rule.endMinute) {
95
+ return (rule.days.includes(weekday) &&
96
+ minuteOfDay >= rule.startMinute &&
97
+ minuteOfDay <= rule.endMinute);
98
+ }
99
+ return ((rule.days.includes(weekday) && minuteOfDay >= rule.startMinute) ||
100
+ (rule.days.includes(previousWeekday) && minuteOfDay <= rule.endMinute));
101
+ });
102
+ }
103
+ async function executeBusinessHours() {
104
+ if (this.getNode().type.endsWith('Tool')) {
105
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Use Horário de Funcionamento no node UnderChat normal, não como ferramenta de IA');
106
+ }
107
+ if (this.getNodeParameter('operation', 0, 'checkBusinessHours') !==
108
+ 'checkBusinessHours') {
109
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Selecione a operação Verificar Horário');
110
+ }
111
+ const items = this.getInputData();
112
+ const outputs = [[], []];
113
+ const now = new Date();
114
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
115
+ try {
116
+ const selectedTimeZone = this.getNodeParameter('businessHoursTimezone', itemIndex, 'America/Sao_Paulo');
117
+ const timeZone = selectedTimeZone === 'workflow'
118
+ ? this.getTimezone()
119
+ : selectedTimeZone === 'custom'
120
+ ? this.getNodeParameter('businessHoursCustomTimezone', itemIndex, '')
121
+ : selectedTimeZone;
122
+ const rules = parseBusinessHoursRules(this.getNodeParameter('businessHoursRules', itemIndex, {}));
123
+ const outputIndex = isWithinBusinessHours(now, timeZone, rules) ? 0 : 1;
124
+ outputs[outputIndex].push({
125
+ ...items[itemIndex],
126
+ pairedItem: { item: itemIndex },
127
+ });
128
+ }
129
+ catch (error) {
130
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, {
131
+ itemIndex,
132
+ });
133
+ }
134
+ }
135
+ return outputs;
136
+ }
137
+ //# sourceMappingURL=BusinessHours.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BusinessHours.js","sourceRoot":"","sources":["../../../nodes/UnderChat/BusinessHours.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const businessHoursProperties: INodeProperties[];
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.businessHoursProperties = void 0;
4
+ const showBusinessHours = {
5
+ show: { resource: ['businessHours'] },
6
+ hide: { '@tool': [true] },
7
+ };
8
+ exports.businessHoursProperties = [
9
+ {
10
+ displayName: 'Operação',
11
+ name: 'operation',
12
+ type: 'options',
13
+ noDataExpression: true,
14
+ options: [
15
+ {
16
+ name: 'Verificar Horário',
17
+ value: 'checkBusinessHours',
18
+ action: 'Verificar dias e horas de funcionamento',
19
+ description: 'Encaminha cada item para Dentro do horário ou Fora do horário',
20
+ },
21
+ ],
22
+ default: 'checkBusinessHours',
23
+ displayOptions: showBusinessHours,
24
+ },
25
+ {
26
+ displayName: 'Configure a agenda neste node, sem API Key ou executor. Os dados recebidos são preservados nas duas saídas. Para usar como condição, mantenha Always Output Data desativado e On Error em Stop Workflow.',
27
+ name: 'businessHoursNotice',
28
+ type: 'notice',
29
+ default: '',
30
+ displayOptions: showBusinessHours,
31
+ },
32
+ {
33
+ displayName: 'Fuso Horário',
34
+ name: 'businessHoursTimezone',
35
+ type: 'options',
36
+ options: [
37
+ { name: 'Brasília (America/Sao_Paulo)', value: 'America/Sao_Paulo' },
38
+ { name: 'Fuso Do Workflow', value: 'workflow' },
39
+ { name: 'Outro Fuso', value: 'custom' },
40
+ { name: 'UTC', value: 'UTC' },
41
+ ],
42
+ default: 'America/Sao_Paulo',
43
+ description: 'Fuso usado para verificar o dia da semana e o horário atual',
44
+ displayOptions: showBusinessHours,
45
+ },
46
+ {
47
+ displayName: 'Fuso Personalizado',
48
+ name: 'businessHoursCustomTimezone',
49
+ type: 'string',
50
+ default: '',
51
+ placeholder: 'America/Manaus',
52
+ required: true,
53
+ description: 'Nome IANA do fuso horário, por exemplo America/Manaus ou Europe/Lisbon',
54
+ displayOptions: {
55
+ show: { resource: ['businessHours'], businessHoursTimezone: ['custom'] },
56
+ hide: { '@tool': [true] },
57
+ },
58
+ },
59
+ {
60
+ displayName: 'Faixas De Horário',
61
+ name: 'businessHoursRules',
62
+ type: 'fixedCollection',
63
+ typeOptions: { multipleValues: true },
64
+ placeholder: 'Adicionar Faixa De Horário',
65
+ default: {},
66
+ description: 'Adicione uma faixa para cada período permitido. Qualquer faixa correspondente libera a saída Dentro do horário; dias sem faixas seguem por Fora do horário.',
67
+ displayOptions: showBusinessHours,
68
+ options: [
69
+ {
70
+ name: 'rules',
71
+ displayName: 'Faixa',
72
+ values: [
73
+ {
74
+ displayName: 'Dias Da Semana',
75
+ name: 'days',
76
+ type: 'multiOptions',
77
+ options: [
78
+ { name: 'Segunda-Feira', value: 1 },
79
+ { name: 'Terça-Feira', value: 2 },
80
+ { name: 'Quarta-Feira', value: 3 },
81
+ { name: 'Quinta-Feira', value: 4 },
82
+ { name: 'Sexta-Feira', value: 5 },
83
+ { name: 'Sábado', value: 6 },
84
+ { name: 'Domingo', value: 7 },
85
+ ],
86
+ default: [1, 2, 3, 4, 5],
87
+ required: true,
88
+ description: 'Selecione os dias em que esta faixa começa',
89
+ },
90
+ {
91
+ displayName: 'Dia Inteiro',
92
+ name: 'allDay',
93
+ type: 'boolean',
94
+ default: false,
95
+ },
96
+ {
97
+ displayName: 'Início',
98
+ name: 'startTime',
99
+ type: 'string',
100
+ default: '08:00',
101
+ placeholder: 'HH:mm',
102
+ required: true,
103
+ description: 'Hora local de início, por exemplo 08:00 ou 12:01',
104
+ displayOptions: { hide: { allDay: [true] } },
105
+ },
106
+ {
107
+ displayName: 'Fim',
108
+ name: 'endTime',
109
+ type: 'string',
110
+ default: '17:59',
111
+ placeholder: 'HH:mm',
112
+ required: true,
113
+ description: 'O minuto final inteiro é incluído: 17:59 vale até 17:59:59. Se o fim for anterior ao início, a faixa termina no dia seguinte.',
114
+ displayOptions: { hide: { allDay: [true] } },
115
+ },
116
+ ],
117
+ },
118
+ ],
119
+ },
120
+ ];
121
+ //# sourceMappingURL=BusinessHoursDescription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BusinessHoursDescription.js","sourceRoot":"","sources":["../../../nodes/UnderChat/BusinessHoursDescription.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { IDataObject, IExecuteFunctions, IHttpRequestMethods, ILoadOptionsFunctions } from 'n8n-workflow';
2
2
  export declare function underChatApiRequest(this: IExecuteFunctions | ILoadOptionsFunctions, method: IHttpRequestMethods, endpoint: string, body?: IDataObject, qs?: IDataObject, executorId?: string): Promise<IDataObject>;
3
3
  export declare function responseData(response: IDataObject): unknown;
4
+ export declare function underChatApiMultipartRequest(this: IExecuteFunctions, endpoint: string, formData: IDataObject, executorId: string): Promise<IDataObject>;
4
5
  export declare function collectionRecords(value: unknown): IDataObject[];
5
6
  export declare function firstRecord(response: IDataObject): IDataObject | undefined;
6
7
  export declare function getOpaqueId(record: IDataObject | undefined, names: string[]): string | undefined;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.underChatApiRequest = underChatApiRequest;
4
4
  exports.responseData = responseData;
5
+ exports.underChatApiMultipartRequest = underChatApiMultipartRequest;
5
6
  exports.collectionRecords = collectionRecords;
6
7
  exports.firstRecord = firstRecord;
7
8
  exports.getOpaqueId = getOpaqueId;
@@ -32,6 +33,21 @@ function responseData(response) {
32
33
  var _a;
33
34
  return (_a = response.data) !== null && _a !== void 0 ? _a : response;
34
35
  }
36
+ async function underChatApiMultipartRequest(endpoint, formData, executorId) {
37
+ const credentials = await this.getCredentials('underChatApi');
38
+ const baseUrl = String(credentials.baseUrl).replace(/\/$/, '');
39
+ const options = {
40
+ method: 'POST',
41
+ url: `${baseUrl}${endpoint}`,
42
+ body: formData,
43
+ json: true,
44
+ headers: {
45
+ 'content-type': 'multipart/form-data',
46
+ 'x-underchat-user-id': executorId,
47
+ },
48
+ };
49
+ return (await this.helpers.httpRequestWithAuthentication.call(this, 'underChatApi', options));
50
+ }
35
51
  function collectionRecords(value) {
36
52
  if (Array.isArray(value)) {
37
53
  return value.filter((item) => Boolean(item) && typeof item === 'object' && !Array.isArray(item));
@@ -1 +1 @@
1
- {"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/UnderChat/GenericFunctions.ts"],"names":[],"mappings":";;AAQA,kDA6BC;AAED,oCAEC;AAED,8CAiBC;AAED,kCASC;AAED,kCAOC;AAED,0CAKC;AAED,0CAiBC;AAED,wCAKC;AAED,gDAIC;AA/GM,KAAK,UAAU,mBAAmB,CAExC,MAA2B,EAC3B,QAAgB,EAChB,OAAoB,EAAE,EACtB,KAAkB,EAAE,EACpB,UAAmB;IAEnB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,OAAO,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,kBAAkB,GAAG,UAAU,IAAI,gBAAgB,CAAC;IAC1D,MAAM,OAAO,GAAwB;QACpC,MAAM;QACN,GAAG,EAAE,GAAG,OAAO,GAAG,QAAQ,EAAE;QAC5B,IAAI,EAAE,IAAI;KACV,CAAC;IACF,IAAI,QAAQ,KAAK,WAAW,IAAI,kBAAkB,EAAE,CAAC;QACpD,OAAO,CAAC,OAAO,GAAG,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtD,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAEhD,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAC5D,IAAI,EACJ,cAAc,EACd,OAAO,CACP,CAAgB,CAAC;AACnB,CAAC;AAED,SAAgB,YAAY,CAAC,QAAqB;;IACjD,OAAO,MAAA,QAAQ,CAAC,IAAI,mCAAI,QAAQ,CAAC;AAClC,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAc;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,MAAM,CAClB,CAAC,IAAI,EAAuB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAChG,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEnD,MAAM,MAAM,GAAG,KAAoB,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC;QACxC,CAAC;IACF,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,SAAgB,WAAW,CAAC,QAAqB;IAChD,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAA4B,CAAC;IACnE,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAmB,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAA4B,CAAC;QACnF,OAAO,MAAM,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAgB,WAAW,CAAC,MAA+B,EAAE,KAAe;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAgB,eAAe,CAAC,KAAa;IAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;IAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9E,OAAO,MAAqB,CAAC;AAC9B,CAAC;AAED,SAAgB,eAAe,CAAC,KAAc;;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAKjB,CAAC;IACF,MAAM,QAAQ,GAAG;QAChB,SAAS,CAAC,QAAQ;QAClB,SAAS,CAAC,UAAU;QACpB,MAAA,SAAS,CAAC,QAAQ,0CAAE,MAAM;QAC1B,MAAA,SAAS,CAAC,QAAQ,0CAAE,UAAU;QAC9B,MAAA,MAAA,SAAS,CAAC,KAAK,0CAAE,QAAQ,0CAAE,MAAM;QACjC,MAAA,MAAA,SAAS,CAAC,KAAK,0CAAE,QAAQ,0CAAE,UAAU;KACrC,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAuB,CAAC;AAChC,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAmB;IACrD,OAAO,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,CAAC,CACjF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/UnderChat/GenericFunctions.ts"],"names":[],"mappings":";;AAQA,kDA6BC;AAED,oCAEC;AAED,oEAwBC;AAED,8CAiBC;AAED,kCASC;AAED,kCAOC;AAED,0CAKC;AAED,0CAiBC;AAED,wCAKC;AAED,gDAIC;AAzIM,KAAK,UAAU,mBAAmB,CAExC,MAA2B,EAC3B,QAAgB,EAChB,OAAoB,EAAE,EACtB,KAAkB,EAAE,EACpB,UAAmB;IAEnB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,OAAO,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,kBAAkB,GAAG,UAAU,IAAI,gBAAgB,CAAC;IAC1D,MAAM,OAAO,GAAwB;QACpC,MAAM;QACN,GAAG,EAAE,GAAG,OAAO,GAAG,QAAQ,EAAE;QAC5B,IAAI,EAAE,IAAI;KACV,CAAC;IACF,IAAI,QAAQ,KAAK,WAAW,IAAI,kBAAkB,EAAE,CAAC;QACpD,OAAO,CAAC,OAAO,GAAG,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtD,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAEhD,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAC5D,IAAI,EACJ,cAAc,EACd,OAAO,CACP,CAAgB,CAAC;AACnB,CAAC;AAED,SAAgB,YAAY,CAAC,QAAqB;;IACjD,OAAO,MAAA,QAAQ,CAAC,IAAI,mCAAI,QAAQ,CAAC;AAClC,CAAC;AAEM,KAAK,UAAU,4BAA4B,CAEjD,QAAgB,EAChB,QAAqB,EACrB,UAAkB;IAElB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAwB;QACpC,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,GAAG,OAAO,GAAG,QAAQ,EAAE;QAC5B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,cAAc,EAAE,qBAAqB;YACrC,qBAAqB,EAAE,UAAU;SACjC;KACD,CAAC;IAEF,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAC5D,IAAI,EACJ,cAAc,EACd,OAAO,CACP,CAAgB,CAAC;AACnB,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAc;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,MAAM,CAClB,CAAC,IAAI,EAAuB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAChG,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEnD,MAAM,MAAM,GAAG,KAAoB,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC;QACxC,CAAC;IACF,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,SAAgB,WAAW,CAAC,QAAqB;IAChD,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAA4B,CAAC;IACnE,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAmB,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAA4B,CAAC;QACnF,OAAO,MAAM,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAgB,WAAW,CAAC,MAA+B,EAAE,KAAe;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAgB,eAAe,CAAC,KAAa;IAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;IAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9E,OAAO,MAAqB,CAAC;AAC9B,CAAC;AAED,SAAgB,eAAe,CAAC,KAAc;;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAKjB,CAAC;IACF,MAAM,QAAQ,GAAG;QAChB,SAAS,CAAC,QAAQ;QAClB,SAAS,CAAC,UAAU;QACpB,MAAA,SAAS,CAAC,QAAQ,0CAAE,MAAM;QAC1B,MAAA,SAAS,CAAC,QAAQ,0CAAE,UAAU;QAC9B,MAAA,MAAA,SAAS,CAAC,KAAK,0CAAE,QAAQ,0CAAE,MAAM;QACjC,MAAA,MAAA,SAAS,CAAC,KAAK,0CAAE,QAAQ,0CAAE,UAAU;KACrC,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAuB,CAAC;AAChC,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAmB;IACrD,OAAO,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,CAAC,CACjF,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { IDataObject, IExecuteFunctions, ILoadOptionsFunctions, INodeListSearchResult, ResourceMapperFields } from 'n8n-workflow';
2
+ export declare function searchOfficialTemplates(this: ILoadOptionsFunctions, filter?: string): Promise<INodeListSearchResult>;
3
+ export declare function getOfficialTemplateVariables(this: ILoadOptionsFunctions): Promise<ResourceMapperFields>;
4
+ export declare function executeStartChatByPhone(this: IExecuteFunctions, itemIndex: number, executorId: string): Promise<IDataObject>;