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.
This commit is contained in:
gpt-engineer-app[bot] 2025-05-20 10:37:55 +00:00
parent 7736ab1452
commit e0f6bc4b86
2 changed files with 72 additions and 44 deletions

View File

@ -1,4 +1,3 @@
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import Layout from '@/components/layout/Layout'; import Layout from '@/components/layout/Layout';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
@ -50,7 +49,7 @@ const GruposWhatsApp = () => {
buscarGrupos(); buscarGrupos();
}, []); }, []);
// Cadastrar novo grupo // Cadastrar novo grupo ou atualizar workflow se necessário
const handleCadastrarGrupo = async () => { const handleCadastrarGrupo = async () => {
setErrorMessage(null); setErrorMessage(null);
setDebugInfo(null); setDebugInfo(null);
@ -67,13 +66,13 @@ const GruposWhatsApp = () => {
setCadastrando(true); setCadastrando(true);
try { try {
console.log("Iniciando processo de cadastro de grupo..."); 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 successMessage = 'Grupo registrado com sucesso';
let variant: 'default' | 'destructive' = 'default'; let variant: 'default' | 'destructive' = 'default';
if (novoGrupo.workflow_id) { if (grupo.workflow_id) {
successMessage = 'Grupo cadastrado e workflow criado com sucesso!'; successMessage = 'Grupo cadastrado e workflow criado com sucesso!';
} else { } else {
successMessage = 'Grupo cadastrado, mas falha ao criar workflow de automação.'; successMessage = 'Grupo cadastrado, mas falha ao criar workflow de automação.';
@ -82,7 +81,7 @@ const GruposWhatsApp = () => {
} }
toast({ toast({
title: novoGrupo.workflow_id ? 'Sucesso' : 'Atenção', title: grupo.workflow_id ? 'Sucesso' : 'Atenção',
description: successMessage, description: successMessage,
variant: variant, variant: variant,
}); });

View File

@ -15,12 +15,33 @@ export async function cadastrarGrupoWhatsApp(): Promise<WhatsAppGroup | null> {
// Normalizar o email (minúsculo e sem espaços) // Normalizar o email (minúsculo e sem espaços)
const normalizedEmail = userEmail.trim().toLowerCase(); const normalizedEmail = userEmail.trim().toLowerCase();
// Criar registro na tabela grupos_whatsapp // Primeiro verificar se já existe um grupo pendente para este usuário
const { data: existingGroups } = await supabase
.from('grupos_whatsapp')
.select('*')
.eq('login', normalizedEmail)
.eq('remote_jid', '')
.eq('status', 'pendente');
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 const { data, error } = await supabase
.from('grupos_whatsapp') .from('grupos_whatsapp')
.insert({ .insert({
user_id: localStorage.getItem('userId') || '', // Mantido por compatibilidade user_id: localStorage.getItem('userId') || '',
remote_jid: '', // Valor temporário vazio - será preenchido pelo backend posteriormente remote_jid: '',
login: normalizedEmail, login: normalizedEmail,
status: 'pendente' status: 'pendente'
}) })
@ -37,30 +58,39 @@ export async function cadastrarGrupoWhatsApp(): Promise<WhatsAppGroup | null> {
} }
console.log('Grupo WhatsApp cadastrado com sucesso:', data); console.log('Grupo WhatsApp cadastrado com sucesso:', data);
const newGroup = data[0]; groupToUse = data[0];
}
// Criar workflow no n8n // 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;
}
// Criar workflow no n8n se não existir
try { try {
console.log(`Iniciando criação de workflow para o email: ${normalizedEmail}`); 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); const workflowResponse = await createWorkflowInN8n(normalizedEmail);
console.log("Resposta completa do n8n:", workflowResponse); console.log("Resposta completa do n8n:", workflowResponse);
if (workflowResponse && workflowResponse.id) { if (workflowResponse && workflowResponse.id) {
// Atualizar o objeto com o workflow_id // Atualizar o objeto com o workflow_id
await atualizarWorkflowId(newGroup.id, workflowResponse.id); await atualizarWorkflowId(groupToUse.id, workflowResponse.id);
newGroup.workflow_id = workflowResponse.id; groupToUse.workflow_id = workflowResponse.id;
console.log('Workflow criado com sucesso no n8n:', workflowResponse.id); console.log('Workflow criado com sucesso no n8n:', workflowResponse.id);
} else { } else {
console.log('Resposta do n8n não contém ID de workflow válido:', workflowResponse); console.log('Resposta do n8n não contém ID de workflow válido:', workflowResponse);
} }
}
} catch (n8nError) { } catch (n8nError) {
console.error('Erro ao criar workflow no n8n:', n8nError); console.error('Erro ao criar workflow no n8n:', n8nError);
// Não impede a criação do grupo, apenas não adiciona o workflow_id // Não impede a criação do grupo, apenas não adiciona o workflow_id
} }
// Sempre retorna o grupo, mesmo se a criação do workflow falhar // Sempre retorna o grupo, mesmo se a criação do workflow falhar
return newGroup; return groupToUse;
} catch (error) { } catch (error) {
console.error('Erro ao cadastrar grupo do WhatsApp:', error); console.error('Erro ao cadastrar grupo do WhatsApp:', error);
throw error; // Propaga o erro para ser tratado no componente 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}`; const workflowName = `Workflow Home Finance - ${email}`;
console.log(`Nome do workflow: ${workflowName}`); 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 // Testar primeiro com uma requisição OPTIONS para verificar CORS
console.log("Enviando requisição OPTIONS para verificar CORS...");
try { try {
const optionsResponse = await fetch('https://n8n.innova1001.com.br/api/v1/workflows', { const optionsResponse = await fetch('https://n8n.innova1001.com.br/api/v1/workflows', {
method: 'OPTIONS', method: 'OPTIONS',
headers: { headers: {
'Access-Control-Request-Method': 'POST', '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 'Origin': window.location.origin
} }
}); });
@ -93,7 +122,8 @@ async function createWorkflowInN8n(email: string): Promise<{ id: string } | null
console.log("Resposta OPTIONS:", { console.log("Resposta OPTIONS:", {
status: optionsResponse.status, status: optionsResponse.status,
ok: optionsResponse.ok, ok: optionsResponse.ok,
headers: Array.from(optionsResponse.headers.entries()) headers: Array.from(optionsResponse.headers.entries()),
statusText: optionsResponse.statusText
}); });
} catch (corsError) { } catch (corsError) {
console.error("Erro no teste de CORS:", corsError); console.error("Erro no teste de CORS:", corsError);
@ -114,8 +144,7 @@ async function createWorkflowInN8n(email: string): Promise<{ id: string } | null
nodes: [], nodes: [],
connections: {}, connections: {},
settings: {} settings: {}
}), })
mode: 'cors'
}); });
// Log detalhado do status da resposta // Log detalhado do status da resposta