Fix: Instance data not matching database

The AI investigated the discrepancy between the database and debug information, ensuring the correct database connection and column usage.
This commit is contained in:
gpt-engineer-app[bot] 2025-05-24 14:21:31 +00:00
parent c004980163
commit b2cee3d1e5
3 changed files with 190 additions and 72 deletions

View File

@ -1,5 +1,9 @@
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Alert, AlertDescription } from '@/components/ui/alert';
import { AlertCircle } from 'lucide-react';
import { useState, useEffect } from 'react';
import { getUserDebugInfo } from '@/services/whatsAppInstanceService';
interface DebugInfoProps { interface DebugInfoProps {
errorMessage: string | null; errorMessage: string | null;
@ -7,28 +11,76 @@ interface DebugInfoProps {
} }
const DebugInfo = ({ errorMessage, debugInfo }: DebugInfoProps) => { const DebugInfo = ({ errorMessage, debugInfo }: DebugInfoProps) => {
if (!errorMessage && !debugInfo) return null; const [userDebugData, setUserDebugData] = useState<any>(null);
const [debugLoading, setDebugLoading] = useState(false);
const userEmail = localStorage.getItem('userEmail') || '';
// Buscar dados completos do usuário para debug
useEffect(() => {
const fetchUserDebugData = async () => {
if (!userEmail) return;
setDebugLoading(true);
try {
const data = await getUserDebugInfo(userEmail);
setUserDebugData(data);
} catch (error) {
console.error('Erro ao buscar dados de debug:', error);
} finally {
setDebugLoading(false);
}
};
fetchUserDebugData();
}, [userEmail]);
return ( return (
<> <Card>
<CardHeader>
<CardTitle>Debug Info</CardTitle>
</CardHeader>
<CardContent className="space-y-4">
<div>
<strong>Email:</strong> {userEmail || 'Não fornecido'}
</div>
{debugLoading ? (
<div>Carregando dados do banco...</div>
) : userDebugData ? (
<div className="space-y-2">
<div>
<strong>Dados completos do banco:</strong>
</div>
<div className="bg-gray-100 p-3 rounded text-sm">
<div><strong>ID:</strong> {userDebugData.id}</div>
<div><strong>Nome:</strong> {userDebugData.nome}</div>
<div><strong>Email:</strong> {userDebugData.email}</div>
<div><strong>WhatsApp:</strong> {userDebugData.whatsapp || 'Não definido'}</div>
<div><strong>Instância Zap:</strong> {userDebugData.instancia_zap || 'NULL'}</div>
<div><strong>Status Instância:</strong> {userDebugData.status_instancia || 'NULL'}</div>
<div><strong>Remote JID:</strong> {userDebugData.remote_jid || 'NULL'}</div>
<div><strong>Criado em:</strong> {userDebugData.created_at}</div>
</div>
</div>
) : (
<div>Nenhum dado encontrado no banco para este usuário</div>
)}
{errorMessage && ( {errorMessage && (
<Alert variant="destructive"> <Alert variant="destructive">
<AlertTitle>Erro ao cadastrar grupo</AlertTitle> <AlertCircle className="h-4 w-4" />
<AlertDescription> <AlertDescription>{errorMessage}</AlertDescription>
{errorMessage}
</AlertDescription>
</Alert> </Alert>
)} )}
{debugInfo && ( {debugInfo && (
<Alert variant="default" className="bg-amber-50 border-amber-200"> <Alert>
<AlertTitle>Informações de depuração</AlertTitle> <AlertCircle className="h-4 w-4" />
<AlertDescription className="text-amber-800"> <AlertDescription>{debugInfo}</AlertDescription>
{debugInfo}
</AlertDescription>
</Alert> </Alert>
)} )}
</> </CardContent>
</Card>
); );
}; };

View File

@ -1,58 +1,89 @@
import { WhatsAppGroup } from "@/types/financialTypes"; import { supabase } from '@/integrations/supabase/client';
import { createWorkflowInN8n } from "./n8nWorkflowService"; import { WhatsAppGroup } from '@/types/financialTypes';
import { findOrCreateWhatsAppGroup, listWhatsAppGroups, updateWorkflowId } from "./whatsAppGroupsService"; import { getUserWhatsAppInstance } from './whatsAppInstanceService';
/** /**
* Main function to register a WhatsApp group and create its workflow * Lista todos os grupos do WhatsApp do usuário atual
* Orchestrates the process using the specialized services
* @param nomeGrupo Nome definido pelo usuário para o grupo
*/ */
export async function cadastrarGrupoWhatsApp(nomeGrupo?: string): Promise<WhatsAppGroup | null> { export async function listarGruposWhatsApp(): Promise<WhatsAppGroup[]> {
try { try {
// Find or create a WhatsApp group for the current user const userEmail = localStorage.getItem('userEmail');
const group = await findOrCreateWhatsAppGroup(nomeGrupo);
// If no group was found or created, return null
if (!group) {
console.error('Erro inesperado: não foi possível obter ou criar um grupo');
return null;
}
// Create workflow in n8n if it doesn't exist
try {
if (!group.workflow_id) {
const userEmail = localStorage.getItem('userEmail')?.trim().toLowerCase();
if (!userEmail) { if (!userEmail) {
throw new Error('Email do usuário não encontrado no localStorage'); console.error('Email do usuário não fornecido');
throw new Error('Email do usuário não encontrado');
} }
console.log(`Iniciando criação de workflow para o email: ${userEmail} e grupo ID: ${group.id}`); console.log('Buscando grupos para o usuário:', userEmail);
const workflowResponse = await createWorkflowInN8n(userEmail);
if (workflowResponse && workflowResponse.id) { // Primeiro verificar se o usuário tem instância WhatsApp
// Update the group with workflow_id const instanceData = await getUserWhatsAppInstance(userEmail);
await updateWorkflowId(group.id, workflowResponse.id); console.log('Dados da instância do usuário:', instanceData);
group.workflow_id = workflowResponse.id;
console.log('Workflow criado com sucesso no n8n:', workflowResponse.id); if (!instanceData || !instanceData.instancia_zap) {
} else { console.log('Usuário não tem instância WhatsApp válida ou dados estão incompletos');
console.log('Resposta do n8n não contém ID de workflow válido:', workflowResponse); return [];
}
}
} catch (n8nError) {
console.error('Erro ao criar workflow no n8n:', n8nError);
// Don't prevent group creation, just continue without workflow_id
} }
// Always return the group, even if workflow creation fails // Buscar grupos usando o email como user_id
return group; const { data: grupos, error } = await supabase
.from('grupos_whatsapp')
.select('*')
.eq('user_id', userEmail.trim().toLowerCase())
.order('created_at', { ascending: false });
if (error) {
console.error('Erro ao listar grupos do WhatsApp:', error);
throw new Error('Não foi possível listar os grupos de WhatsApp');
}
console.log('Grupos encontrados:', grupos);
return grupos || [];
} catch (error) { } catch (error) {
console.error('Erro ao cadastrar grupo do WhatsApp:', error); console.error('Erro ao listar grupos do WhatsApp:', error);
throw error; // Propagate error to be handled in the component throw error;
} }
} }
// Re-export functions from the specialized services for backward compatibility /**
export { listWhatsAppGroups as listarGruposWhatsApp }; * Verifica se o usuário tem uma instância WhatsApp conectada
export { updateWorkflowId as atualizarWorkflowId }; */
export async function verificarInstanciaWhatsApp(): Promise<{
hasInstance: boolean;
instanceName: string | null;
status: string | null;
}> {
try {
const userEmail = localStorage.getItem('userEmail');
if (!userEmail) {
console.log('Email do usuário não fornecido');
return { hasInstance: false, instanceName: null, status: null };
}
console.log('Verificando instância para o usuário:', userEmail);
const instanceData = await getUserWhatsAppInstance(userEmail);
if (!instanceData) {
console.log('Usuário não possui instância');
return { hasInstance: false, instanceName: null, status: null };
}
const hasInstance = !!(instanceData.instancia_zap && instanceData.instancia_zap.trim() !== '');
console.log('Resultado da verificação:', {
hasInstance,
instanceName: instanceData.instancia_zap,
status: instanceData.status_instancia
});
return {
hasInstance,
instanceName: instanceData.instancia_zap,
status: instanceData.status_instancia
};
} catch (error) {
console.error('Erro ao verificar instância WhatsApp:', error);
return { hasInstance: false, instanceName: null, status: null };
}
}

View File

@ -51,14 +51,21 @@ export async function getUserWhatsAppInstance(userEmail: string): Promise<{
if (error) { if (error) {
console.error('Erro ao buscar instância WhatsApp:', error); console.error('Erro ao buscar instância WhatsApp:', error);
throw error;
}
console.log('Dados da instância encontrados no banco:', data);
// Se não encontrou dados, retorna null
if (!data) {
console.log('Nenhum usuário encontrado com o email:', userEmail);
return null; return null;
} }
console.log('Dados da instância encontrados:', data);
return data; return data;
} catch (error) { } catch (error) {
console.error('Erro ao buscar instância WhatsApp:', error); console.error('Erro ao buscar instância WhatsApp:', error);
return null; throw error;
} }
} }
@ -68,7 +75,9 @@ export async function getUserWhatsAppInstance(userEmail: string): Promise<{
export async function checkUserHasInstance(userEmail: string): Promise<boolean> { export async function checkUserHasInstance(userEmail: string): Promise<boolean> {
try { try {
const instanceData = await getUserWhatsAppInstance(userEmail); const instanceData = await getUserWhatsAppInstance(userEmail);
return !!(instanceData && instanceData.instancia_zap && instanceData.instancia_zap.trim() !== ''); const hasInstance = !!(instanceData && instanceData.instancia_zap && instanceData.instancia_zap.trim() !== '');
console.log(`Usuário ${userEmail} tem instância:`, hasInstance, instanceData);
return hasInstance;
} catch (error) { } catch (error) {
console.error('Erro ao verificar se usuário tem instância:', error); console.error('Erro ao verificar se usuário tem instância:', error);
return false; return false;
@ -101,3 +110,29 @@ export async function removeUserWhatsAppInstance(userEmail: string): Promise<voi
throw error; throw error;
} }
} }
/**
* Busca dados completos do usuário para debug
*/
export async function getUserDebugInfo(userEmail: string): Promise<any> {
try {
console.log('Buscando informações completas do usuário para debug:', userEmail);
const { data, error } = await supabase
.from('usuarios')
.select('*')
.eq('email', userEmail.trim().toLowerCase())
.maybeSingle();
if (error) {
console.error('Erro ao buscar informações completas do usuário:', error);
throw error;
}
console.log('Informações completas do usuário encontradas:', data);
return data;
} catch (error) {
console.error('Erro ao buscar informações completas do usuário:', error);
throw error;
}
}