From e0f6bc4b860c65d2b0e4af151c133b815505c2b4 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 10:37:55 +0000 Subject: [PATCH] Fix: Cadastrar Grupo button failing quickly The "Cadastrar Grupo" button now fails immediately. The priority is to ensure the n8n workflow creation request succeeds. This commit reviews the button's context and related code to address the issue. --- src/pages/GruposWhatsApp.tsx | 11 ++- src/services/gruposWhatsAppService.ts | 105 ++++++++++++++++---------- 2 files changed, 72 insertions(+), 44 deletions(-) diff --git a/src/pages/GruposWhatsApp.tsx b/src/pages/GruposWhatsApp.tsx index 8ed815d..c13c241 100644 --- a/src/pages/GruposWhatsApp.tsx +++ b/src/pages/GruposWhatsApp.tsx @@ -1,4 +1,3 @@ - import { useState, useEffect } from 'react'; import Layout from '@/components/layout/Layout'; import { Button } from '@/components/ui/button'; @@ -50,7 +49,7 @@ const GruposWhatsApp = () => { buscarGrupos(); }, []); - // Cadastrar novo grupo + // Cadastrar novo grupo ou atualizar workflow se necessário const handleCadastrarGrupo = async () => { setErrorMessage(null); setDebugInfo(null); @@ -67,13 +66,13 @@ const GruposWhatsApp = () => { setCadastrando(true); try { console.log("Iniciando processo de cadastro de grupo..."); - const novoGrupo = await cadastrarGrupoWhatsApp(); + const grupo = await cadastrarGrupoWhatsApp(); - if (novoGrupo) { + if (grupo) { let successMessage = 'Grupo registrado com sucesso'; let variant: 'default' | 'destructive' = 'default'; - if (novoGrupo.workflow_id) { + if (grupo.workflow_id) { successMessage = 'Grupo cadastrado e workflow criado com sucesso!'; } else { successMessage = 'Grupo cadastrado, mas falha ao criar workflow de automação.'; @@ -82,7 +81,7 @@ const GruposWhatsApp = () => { } toast({ - title: novoGrupo.workflow_id ? 'Sucesso' : 'Atenção', + title: grupo.workflow_id ? 'Sucesso' : 'Atenção', description: successMessage, variant: variant, }); diff --git a/src/services/gruposWhatsAppService.ts b/src/services/gruposWhatsAppService.ts index 420721c..d94d53c 100644 --- a/src/services/gruposWhatsAppService.ts +++ b/src/services/gruposWhatsAppService.ts @@ -15,44 +15,74 @@ export async function cadastrarGrupoWhatsApp(): Promise { // Normalizar o email (minúsculo e sem espaços) const normalizedEmail = userEmail.trim().toLowerCase(); - // Criar registro na tabela grupos_whatsapp - const { data, error } = await supabase + // Primeiro verificar se já existe um grupo pendente para este usuário + const { data: existingGroups } = await supabase .from('grupos_whatsapp') - .insert({ - user_id: localStorage.getItem('userId') || '', // Mantido por compatibilidade - remote_jid: '', // Valor temporário vazio - será preenchido pelo backend posteriormente - login: normalizedEmail, - status: 'pendente' - }) - .select(); + .select('*') + .eq('login', normalizedEmail) + .eq('remote_jid', '') + .eq('status', 'pendente'); - if (error) { - console.error('Erro ao cadastrar grupo do WhatsApp:', error); - throw new Error('Não foi possível cadastrar o grupo de WhatsApp'); + let groupToUse: WhatsAppGroup | null = null; + + if (existingGroups && existingGroups.length > 0) { + console.log('Grupo pendente já existe para este usuário:', existingGroups[0]); + groupToUse = existingGroups[0]; + + // Se já existe um workflow_id, não precisamos criar novamente + if (groupToUse.workflow_id) { + console.log('Workflow já existe para este grupo:', groupToUse.workflow_id); + return groupToUse; + } + } else { + // Criar registro na tabela grupos_whatsapp se não existir + console.log('Criando novo grupo para o usuário:', normalizedEmail); + const { data, error } = await supabase + .from('grupos_whatsapp') + .insert({ + user_id: localStorage.getItem('userId') || '', + remote_jid: '', + login: normalizedEmail, + status: 'pendente' + }) + .select(); + + if (error) { + console.error('Erro ao cadastrar grupo do WhatsApp:', error); + throw new Error('Não foi possível cadastrar o grupo de WhatsApp'); + } + + if (!data || data.length === 0) { + console.error('Nenhum dado retornado após inserção'); + return null; + } + + console.log('Grupo WhatsApp cadastrado com sucesso:', data); + groupToUse = data[0]; } - if (!data || data.length === 0) { - console.error('Nenhum dado retornado após inserção'); + // A partir daqui, temos um grupo para usar, seja novo ou existente + if (!groupToUse) { + console.error('Erro inesperado: não foi possível obter ou criar um grupo'); return null; } - console.log('Grupo WhatsApp cadastrado com sucesso:', data); - const newGroup = data[0]; - - // Criar workflow no n8n + // Criar workflow no n8n se não existir try { - console.log(`Iniciando criação de workflow para o email: ${normalizedEmail}`); - const workflowResponse = await createWorkflowInN8n(normalizedEmail); - - console.log("Resposta completa do n8n:", workflowResponse); - - if (workflowResponse && workflowResponse.id) { - // Atualizar o objeto com o workflow_id - await atualizarWorkflowId(newGroup.id, workflowResponse.id); - newGroup.workflow_id = workflowResponse.id; - console.log('Workflow criado com sucesso no n8n:', workflowResponse.id); - } else { - console.log('Resposta do n8n não contém ID de workflow válido:', workflowResponse); + if (!groupToUse.workflow_id) { + console.log(`Iniciando criação de workflow para o email: ${normalizedEmail} e grupo ID: ${groupToUse.id}`); + const workflowResponse = await createWorkflowInN8n(normalizedEmail); + + console.log("Resposta completa do n8n:", workflowResponse); + + if (workflowResponse && workflowResponse.id) { + // Atualizar o objeto com o workflow_id + await atualizarWorkflowId(groupToUse.id, workflowResponse.id); + groupToUse.workflow_id = workflowResponse.id; + console.log('Workflow criado com sucesso no n8n:', workflowResponse.id); + } else { + console.log('Resposta do n8n não contém ID de workflow válido:', workflowResponse); + } } } catch (n8nError) { console.error('Erro ao criar workflow no n8n:', n8nError); @@ -60,7 +90,7 @@ export async function cadastrarGrupoWhatsApp(): Promise { } // Sempre retorna o grupo, mesmo se a criação do workflow falhar - return newGroup; + return groupToUse; } catch (error) { console.error('Erro ao cadastrar grupo do WhatsApp:', error); throw error; // Propaga o erro para ser tratado no componente @@ -76,16 +106,15 @@ async function createWorkflowInN8n(email: string): Promise<{ id: string } | null const workflowName = `Workflow Home Finance - ${email}`; console.log(`Nome do workflow: ${workflowName}`); - // Verificação de CORS - console.log("Iniciando requisição para n8n..."); - // Testar primeiro com uma requisição OPTIONS para verificar CORS + console.log("Enviando requisição OPTIONS para verificar CORS..."); + try { const optionsResponse = await fetch('https://n8n.innova1001.com.br/api/v1/workflows', { method: 'OPTIONS', headers: { 'Access-Control-Request-Method': 'POST', - 'Access-Control-Request-Headers': 'Content-Type, X-N8N-API-KEY', + 'Access-Control-Request-Headers': 'Content-Type, X-N8N-API-KEY, Origin', 'Origin': window.location.origin } }); @@ -93,7 +122,8 @@ async function createWorkflowInN8n(email: string): Promise<{ id: string } | null console.log("Resposta OPTIONS:", { status: optionsResponse.status, ok: optionsResponse.ok, - headers: Array.from(optionsResponse.headers.entries()) + headers: Array.from(optionsResponse.headers.entries()), + statusText: optionsResponse.statusText }); } catch (corsError) { console.error("Erro no teste de CORS:", corsError); @@ -114,8 +144,7 @@ async function createWorkflowInN8n(email: string): Promise<{ id: string } | null nodes: [], connections: {}, settings: {} - }), - mode: 'cors' + }) }); // Log detalhado do status da resposta