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 {
errorMessage: string | null;
@ -7,28 +11,76 @@ interface DebugInfoProps {
}
const DebugInfo = ({ errorMessage, debugInfo }: DebugInfoProps) => {
if (!errorMessage && !debugInfo) return null;
return (
<>
{errorMessage && (
<Alert variant="destructive">
<AlertTitle>Erro ao cadastrar grupo</AlertTitle>
<AlertDescription>
{errorMessage}
</AlertDescription>
</Alert>
)}
const [userDebugData, setUserDebugData] = useState<any>(null);
const [debugLoading, setDebugLoading] = useState(false);
const userEmail = localStorage.getItem('userEmail') || '';
{debugInfo && (
<Alert variant="default" className="bg-amber-50 border-amber-200">
<AlertTitle>Informações de depuração</AlertTitle>
<AlertDescription className="text-amber-800">
{debugInfo}
</AlertDescription>
</Alert>
)}
</>
// 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 (
<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 && (
<Alert variant="destructive">
<AlertCircle className="h-4 w-4" />
<AlertDescription>{errorMessage}</AlertDescription>
</Alert>
)}
{debugInfo && (
<Alert>
<AlertCircle className="h-4 w-4" />
<AlertDescription>{debugInfo}</AlertDescription>
</Alert>
)}
</CardContent>
</Card>
);
};

View File

@ -1,58 +1,89 @@
import { WhatsAppGroup } from "@/types/financialTypes";
import { createWorkflowInN8n } from "./n8nWorkflowService";
import { findOrCreateWhatsAppGroup, listWhatsAppGroups, updateWorkflowId } from "./whatsAppGroupsService";
import { supabase } from '@/integrations/supabase/client';
import { WhatsAppGroup } from '@/types/financialTypes';
import { getUserWhatsAppInstance } from './whatsAppInstanceService';
/**
* Main function to register a WhatsApp group and create its workflow
* Orchestrates the process using the specialized services
* @param nomeGrupo Nome definido pelo usuário para o grupo
* Lista todos os grupos do WhatsApp do usuário atual
*/
export async function cadastrarGrupoWhatsApp(nomeGrupo?: string): Promise<WhatsAppGroup | null> {
export async function listarGruposWhatsApp(): Promise<WhatsAppGroup[]> {
try {
// Find or create a WhatsApp group for the current user
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;
const userEmail = localStorage.getItem('userEmail');
if (!userEmail) {
console.error('Email do usuário não fornecido');
throw new Error('Email do usuário não encontrado');
}
// Create workflow in n8n if it doesn't exist
try {
if (!group.workflow_id) {
const userEmail = localStorage.getItem('userEmail')?.trim().toLowerCase();
if (!userEmail) {
throw new Error('Email do usuário não encontrado no localStorage');
}
console.log(`Iniciando criação de workflow para o email: ${userEmail} e grupo ID: ${group.id}`);
const workflowResponse = await createWorkflowInN8n(userEmail);
if (workflowResponse && workflowResponse.id) {
// Update the group with workflow_id
await updateWorkflowId(group.id, workflowResponse.id);
group.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);
// Don't prevent group creation, just continue without workflow_id
console.log('Buscando grupos para o usuário:', userEmail);
// Primeiro verificar se o usuário tem instância WhatsApp
const instanceData = await getUserWhatsAppInstance(userEmail);
console.log('Dados da instância do usuário:', instanceData);
if (!instanceData || !instanceData.instancia_zap) {
console.log('Usuário não tem instância WhatsApp válida ou dados estão incompletos');
return [];
}
// Always return the group, even if workflow creation fails
return group;
// Buscar grupos usando o email como user_id
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) {
console.error('Erro ao cadastrar grupo do WhatsApp:', error);
throw error; // Propagate error to be handled in the component
console.error('Erro ao listar grupos do WhatsApp:', error);
throw error;
}
}
// Re-export functions from the specialized services for backward compatibility
export { listWhatsAppGroups as listarGruposWhatsApp };
export { updateWorkflowId as atualizarWorkflowId };
/**
* Verifica se o usuário tem uma instância WhatsApp conectada
*/
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) {
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;
}
console.log('Dados da instância encontrados:', data);
return data;
} catch (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> {
try {
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) {
console.error('Erro ao verificar se usuário tem instância:', error);
return false;
@ -101,3 +110,29 @@ export async function removeUserWhatsAppInstance(userEmail: string): Promise<voi
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;
}
}