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,44 +15,74 @@ 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, error } = await supabase const { data: existingGroups } = await supabase
.from('grupos_whatsapp') .from('grupos_whatsapp')
.insert({ .select('*')
user_id: localStorage.getItem('userId') || '', // Mantido por compatibilidade .eq('login', normalizedEmail)
remote_jid: '', // Valor temporário vazio - será preenchido pelo backend posteriormente .eq('remote_jid', '')
login: normalizedEmail, .eq('status', 'pendente');
status: 'pendente'
})
.select();
if (error) { let groupToUse: WhatsAppGroup | null = null;
console.error('Erro ao cadastrar grupo do WhatsApp:', error);
throw new Error('Não foi possível cadastrar o grupo de WhatsApp'); 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) { // A partir daqui, temos um grupo para usar, seja novo ou existente
console.error('Nenhum dado retornado após inserção'); if (!groupToUse) {
console.error('Erro inesperado: não foi possível obter ou criar um grupo');
return null; return null;
} }
console.log('Grupo WhatsApp cadastrado com sucesso:', data); // Criar workflow no n8n se não existir
const newGroup = data[0];
// Criar workflow no n8n
try { try {
console.log(`Iniciando criação de workflow para o email: ${normalizedEmail}`); if (!groupToUse.workflow_id) {
const workflowResponse = await createWorkflowInN8n(normalizedEmail); 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);
console.log("Resposta completa do n8n:", workflowResponse);
if (workflowResponse && workflowResponse.id) {
// Atualizar o objeto com o workflow_id if (workflowResponse && workflowResponse.id) {
await atualizarWorkflowId(newGroup.id, workflowResponse.id); // Atualizar o objeto com o workflow_id
newGroup.workflow_id = workflowResponse.id; await atualizarWorkflowId(groupToUse.id, workflowResponse.id);
console.log('Workflow criado com sucesso no n8n:', workflowResponse.id); groupToUse.workflow_id = workflowResponse.id;
} else { console.log('Workflow criado com sucesso no n8n:', workflowResponse.id);
console.log('Resposta do n8n não contém ID de workflow válido:', workflowResponse); } else {
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);
@ -60,7 +90,7 @@ export async function cadastrarGrupoWhatsApp(): Promise<WhatsAppGroup | null> {
} }
// 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