UNPKG

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
"use strict"; 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;