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