n8n-rdstation-crm
Version:
Nós personalizados do n8n para integração com a API do RD Station CRM (v1)
505 lines (504 loc) • 24.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RdStationCrmTasks = void 0;
const n8n_workflow_1 = require("n8n-workflow");
/**
* Classe para o nó de Tarefas do RD Station CRM
* Este nó permite interações com a API de Tarefas do RD Station CRM.
* As tarefas são atividades agendadas vinculadas a um contato e a uma negociação,
* como follow-up, ligação, reunião, etc.
*/
class RdStationCrmTasks {
constructor() {
this.description = {
// Informações básicas do nó que serão exibidas na interface do n8n
displayName: 'RD Station CRM Tarefas',
name: 'rdStationCrmTasks',
icon: 'file:rdstation.svg',
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
description: 'Operações com tarefas no RD Station CRM',
defaults: {
name: 'RD Station CRM Tarefas', // Nome padrão quando o nó é adicionado
},
inputs: ['main'],
outputs: ['main'],
credentials: [
{
// Define que o nó requer credenciais do tipo rdStationCrmApi
name: 'rdStationCrmApi',
required: true, // As credenciais são obrigatórias
},
],
properties: [
// Seleção do recurso (neste caso, só temos tarefas)
{
displayName: 'Recurso',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Tarefa',
value: 'task', // Valor interno da opção
},
],
default: 'task',
required: true, // Campo obrigatório
},
// Seleção da operação a ser realizada sobre as tarefas
{
displayName: 'Operação',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
// Mostra este campo apenas quando o recurso for 'task'
resource: [
'task',
],
},
},
options: [
// Lista de operações disponíveis para tarefas
{
name: 'Criar',
value: 'create',
description: 'Criar uma nova tarefa',
action: 'Criar uma tarefa',
},
{
name: 'Atualizar',
value: 'update',
description: 'Atualizar uma tarefa existente',
action: 'Atualizar uma tarefa',
},
{
name: 'Listar',
value: 'getAll',
description: 'Listar tarefas',
action: 'Listar tarefas',
},
{
name: 'Obter',
value: 'get',
description: 'Obter uma tarefa pelo ID',
action: 'Obter uma tarefa',
},
],
default: 'getAll', // Operação padrão
},
// Campos para a operação LISTAR TAREFAS
{
displayName: 'Parâmetros de Listagem',
name: 'listParameters',
type: 'collection',
placeholder: 'Adicionar Parâmetros',
default: {},
displayOptions: {
show: {
// Mostra apenas quando recurso é 'task' e operação é 'getAll'
resource: [
'task',
],
operation: [
'getAll',
],
},
},
options: [
// Opções de filtragem e paginação para listagem
{
displayName: 'Limite',
name: 'limit',
type: 'number',
default: 50,
description: 'Número máximo de tarefas a retornar',
},
{
displayName: 'Página',
name: 'page',
type: 'number',
default: 1,
description: 'Número da página para retornar',
},
{
displayName: 'ID do Negócio',
name: 'deal_id',
type: 'string',
default: '',
description: 'Filtrar tarefas por negócio específico',
},
{
displayName: 'ID do Usuário',
name: 'user_id',
type: 'string',
default: '',
description: 'Filtrar tarefas por usuário responsável',
},
{
displayName: 'Status',
name: 'status',
type: 'options',
options: [
{
name: 'Pendentes',
value: 'pending',
},
{
name: 'Concluídas',
value: 'done',
},
{
name: 'Todas',
value: 'all',
},
],
default: 'pending',
description: 'Status das tarefas a serem filtradas',
},
{
displayName: 'Data Inicial',
name: 'start_date',
type: 'string',
default: '',
description: 'Data inicial para filtrar tarefas (formato YYYY-MM-DD)',
},
{
displayName: 'Data Final',
name: 'end_date',
type: 'string',
default: '',
description: 'Data final para filtrar tarefas (formato YYYY-MM-DD)',
},
{
displayName: 'Ordenação',
name: 'order',
type: 'options',
options: [
{
name: 'Data de Vencimento',
value: 'due_date',
},
{
name: 'Data de Criação',
value: 'created_at',
},
],
default: 'due_date',
description: 'Campo pelo qual ordenar os resultados',
},
{
displayName: 'Direção da Ordenação',
name: 'direction',
type: 'options',
options: [
{
name: 'Ascendente',
value: 'asc',
},
{
name: 'Descendente',
value: 'desc',
},
],
default: 'asc',
description: 'Direção da ordenação (crescente ou decrescente)',
},
],
},
// Campos para a operação OBTER TAREFA
{
displayName: 'ID da Tarefa',
name: 'taskId',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
// Mostrar apenas quando operação for 'get' ou 'update'
resource: [
'task',
],
operation: [
'get',
'update',
],
},
},
description: 'ID da tarefa a ser consultada/atualizada',
},
// Campos para a operação CRIAR TAREFA
{
displayName: 'ID do Negócio',
name: 'dealId',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: [
'task',
],
operation: [
'create',
],
},
},
description: 'ID do negócio ao qual a tarefa está ligada (obrigatório)',
},
// Campos comuns para CRIAR e ATUALIZAR tarefas
{
displayName: 'Dados da Tarefa',
name: 'taskData',
type: 'collection',
placeholder: 'Adicionar Dados',
default: {},
displayOptions: {
show: {
resource: [
'task',
],
operation: [
'create',
'update',
],
},
},
options: [
// Campos de dados da tarefa
{
displayName: 'Título',
name: 'title',
type: 'string',
default: '',
description: 'Título ou assunto da tarefa (obrigatório para criação)',
},
{
displayName: 'Tipo',
name: 'type',
type: 'options',
options: [
{
name: 'Ligação',
value: 'call',
},
{
name: 'E-mail',
value: 'email',
},
{
name: 'Visita',
value: 'visit',
},
{
name: 'Reunião',
value: 'meeting',
},
{
name: 'Tarefa',
value: 'task',
},
{
name: 'Almoço',
value: 'lunch',
},
{
name: 'WhatsApp',
value: 'whatsapp',
},
],
default: 'task',
description: 'Tipo da tarefa (obrigatório para criação)',
},
{
displayName: 'Data de Vencimento',
name: 'due_date',
type: 'string',
default: '',
description: 'Data de vencimento/realização (formato YYYY-MM-DD)',
},
{
displayName: 'Horário',
name: 'due_time',
type: 'string',
default: '',
description: 'Horário da tarefa (formato HH:MM)',
},
{
displayName: 'ID do Usuário Responsável',
name: 'user_id',
type: 'string',
default: '',
description: 'ID do usuário atribuído à tarefa',
},
{
displayName: 'Descrição',
name: 'description',
type: 'string',
typeOptions: {
rows: 4, // Campo de texto multi-linha
},
default: '',
description: 'Descrição/detalhes adicionais da tarefa',
},
{
displayName: 'Concluída',
name: 'done',
type: 'boolean',
default: false,
description: 'Se verdadeiro, marca a tarefa como concluída (apenas para atualização)',
},
],
},
],
};
}
/**
* Método principal que executa o nó com base na operação selecionada
* Este método é chamado pelo n8n quando o fluxo é executado
*/
async execute() {
const items = this.getInputData(); // Obtém os dados de entrada
const returnData = []; // Array para armazenar resultados
// URL base da API do RD Station CRM
const baseUrl = 'https://crm.rdstation.com/api/v1';
const resource = this.getNodeParameter('resource', 0); // Obtém o recurso selecionado
const operation = this.getNodeParameter('operation', 0); // Obtém a operação selecionada
// Para cada item de entrada, processa a operação solicitada
for (let i = 0; i < items.length; i++) {
try {
// Configuração comum para todas as requisições HTTP
const options = {
uri: '',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json', // Envia dados em formato JSON
},
json: true,
resolveWithFullResponse: true, // Retorna o objeto de resposta completo
};
// Vamos determinar qual operação executar com base no recurso e operação selecionados
if (resource === 'task') {
if (operation === 'getAll') {
// Operação: LISTAR TAREFAS
// Preparando a requisição para listar tarefas
options.method = 'GET'; // Método HTTP GET para listar
options.uri = `${baseUrl}/tasks`; // Endpoint de tarefas
// Obtendo e aplicando parâmetros de filtro/paginação definidos pelo usuário
const listParameters = this.getNodeParameter('listParameters', i);
const qs = {}; // Objeto para parâmetros de query string
// Adicionando os parâmetros à query string se estiverem definidos
if (listParameters.limit)
qs.limit = listParameters.limit;
if (listParameters.page)
qs.page = listParameters.page;
if (listParameters.deal_id)
qs.deal_id = listParameters.deal_id;
if (listParameters.user_id)
qs.user_id = listParameters.user_id;
if (listParameters.status)
qs.status = listParameters.status;
if (listParameters.start_date)
qs.start_date = listParameters.start_date;
if (listParameters.end_date)
qs.end_date = listParameters.end_date;
if (listParameters.order)
qs.order = listParameters.order;
if (listParameters.direction)
qs.direction = listParameters.direction;
options.qs = qs; // Anexa os parâmetros à requisição
}
else if (operation === 'get') {
// Operação: OBTER TAREFA ESPECÍFICA
// Obtém o ID da tarefa a ser consultada
const taskId = this.getNodeParameter('taskId', i);
// Verifica se o ID da tarefa foi fornecido
if (!taskId) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'É necessário fornecer um ID de tarefa válido!', { itemIndex: i });
}
// Configurando a requisição para buscar uma tarefa específica
options.method = 'GET';
options.uri = `${baseUrl}/tasks/${taskId}`; // Endpoint com ID da tarefa
}
else if (operation === 'create') {
// Operação: CRIAR TAREFA
// Configurando requisição para criar tarefa
options.method = 'POST'; // Método HTTP POST para criação
options.uri = `${baseUrl}/tasks`; // Endpoint de tarefas
// Obtém o ID do negócio ao qual a tarefa será vinculada
const dealId = this.getNodeParameter('dealId', i);
// Verifica se o ID do negócio foi fornecido (obrigatório)
if (!dealId) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'O ID do negócio é obrigatório para criar uma tarefa!', { itemIndex: i });
}
// Obtendo os dados da tarefa definidos pelo usuário
const taskData = this.getNodeParameter('taskData', i);
// Verificando se o título foi fornecido (obrigatório para criação)
if (!taskData.title) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'O título da tarefa é obrigatório para criação!', { itemIndex: i });
}
// Verificando se o tipo foi fornecido (obrigatório para criação)
if (!taskData.type) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'O tipo da tarefa é obrigatório para criação!', { itemIndex: i });
}
// Preparando o corpo da requisição combinando os dados
const body = {
deal_id: dealId,
...taskData // Inclui todos os outros dados da tarefa
};
options.body = body; // Anexa o corpo à requisição
}
else if (operation === 'update') {
// Operação: ATUALIZAR TAREFA
// Obtém o ID da tarefa a ser atualizada
const taskId = this.getNodeParameter('taskId', i);
// Verifica se o ID da tarefa foi fornecido
if (!taskId) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'É necessário fornecer um ID de tarefa válido para atualização!', { itemIndex: i });
}
// Configurando a requisição para atualizar a tarefa
options.method = 'PUT'; // Método HTTP PUT para atualização
options.uri = `${baseUrl}/tasks/${taskId}`; // Endpoint com ID da tarefa
// Obtendo os dados a serem atualizados
const taskData = this.getNodeParameter('taskData', i);
// Preparando o corpo da requisição com os dados a serem atualizados
const body = { ...taskData };
// Verifica se há campos para atualizar
if (Object.keys(body).length === 0) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'É necessário fornecer pelo menos um campo para atualizar a tarefa!', { itemIndex: i });
}
options.body = body; // Anexa o corpo à requisição
}
}
// Executa a requisição HTTP com as opções configuradas e autenticação
const response = await this.helpers.requestWithAuthentication.call(this, 'rdStationCrmApi', // Usa as credenciais configuradas
options);
// Extrai os dados da resposta e adiciona ao retorno
const responseData = response.body;
returnData.push({
json: responseData,
pairedItem: { item: i }, // Mantém o pareamento com o item de entrada
});
}
catch (error) {
// Trata e reporta erros ocorridos durante a execução
if (this.continueOnFail()) {
// Se configurado para continuar mesmo com falhas
returnData.push({
json: {
error: error instanceof Error ? error.message : String(error), // Inclui a mensagem de erro
},
pairedItem: { item: i },
});
continue; // Continua para o próximo item
}
throw error; // Senão, propaga o erro para interromper a execução
}
}
return [returnData]; // Retorna os dados processados
}
}
exports.RdStationCrmTasks = RdStationCrmTasks;