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 {
|
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);
|
||||||
return (
|
const userEmail = localStorage.getItem('userEmail') || '';
|
||||||
<>
|
|
||||||
{errorMessage && (
|
|
||||||
<Alert variant="destructive">
|
|
||||||
<AlertTitle>Erro ao cadastrar grupo</AlertTitle>
|
|
||||||
<AlertDescription>
|
|
||||||
{errorMessage}
|
|
||||||
</AlertDescription>
|
|
||||||
</Alert>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{debugInfo && (
|
// Buscar dados completos do usuário para debug
|
||||||
<Alert variant="default" className="bg-amber-50 border-amber-200">
|
useEffect(() => {
|
||||||
<AlertTitle>Informações de depuração</AlertTitle>
|
const fetchUserDebugData = async () => {
|
||||||
<AlertDescription className="text-amber-800">
|
if (!userEmail) return;
|
||||||
{debugInfo}
|
|
||||||
</AlertDescription>
|
setDebugLoading(true);
|
||||||
</Alert>
|
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 { 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 (!userEmail) {
|
||||||
|
console.error('Email do usuário não fornecido');
|
||||||
// If no group was found or created, return null
|
throw new Error('Email do usuário não encontrado');
|
||||||
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
|
console.log('Buscando grupos para o usuário:', userEmail);
|
||||||
try {
|
|
||||||
if (!group.workflow_id) {
|
// Primeiro verificar se o usuário tem instância WhatsApp
|
||||||
const userEmail = localStorage.getItem('userEmail')?.trim().toLowerCase();
|
const instanceData = await getUserWhatsAppInstance(userEmail);
|
||||||
|
console.log('Dados da instância do usuário:', instanceData);
|
||||||
if (!userEmail) {
|
|
||||||
throw new Error('Email do usuário não encontrado no localStorage');
|
if (!instanceData || !instanceData.instancia_zap) {
|
||||||
}
|
console.log('Usuário não tem instância WhatsApp válida ou dados estão incompletos');
|
||||||
|
return [];
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user