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:
parent
c004980163
commit
b2cee3d1e5
@ -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>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@ -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 };
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user