From e47501cfa19f0a54442c877a17a35512e27dab63 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:50:23 +0000 Subject: [PATCH] Reverted to commit aeb9fa261d4cfda84b0a19687735a56d0031d816 --- .../whatsapp/CreateInstanceForm.tsx | 400 ++++++++++-------- .../whatsappGroups/CreateGroupForm.tsx | 32 +- src/services/whatsApp/webhookService.ts | 13 +- src/services/whatsAppGroupsService.ts | 4 +- src/services/whatsAppInstance/index.ts | 28 +- .../whatsAppInstance/userOperations.ts | 191 +-------- .../whatsAppInstance/workflowOperations.ts | 42 +- src/types/whatsAppTypes.ts | 1 - 8 files changed, 259 insertions(+), 452 deletions(-) diff --git a/src/components/whatsapp/CreateInstanceForm.tsx b/src/components/whatsapp/CreateInstanceForm.tsx index 91da40b..5b8acf1 100644 --- a/src/components/whatsapp/CreateInstanceForm.tsx +++ b/src/components/whatsapp/CreateInstanceForm.tsx @@ -1,221 +1,285 @@ -import React, { useState } from 'react'; -import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; -import { Button } from '@/components/ui/button'; + +import { useState, useEffect } from 'react'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; +import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; -import { Alert, AlertDescription } from '@/components/ui/alert'; -import { Loader2, Plus, AlertCircle } from 'lucide-react'; +import { MessageCircle, AlertCircle } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; -import { restartInstance } from '@/services/whatsAppService'; +import { createWhatsAppInstance } from '@/services/whatsAppService'; +import { updateUserWhatsAppInstance, getUserWhatsAppInstance, activateUserWorkflow } from '@/services/whatsAppInstanceService'; import { WhatsAppInstance } from '@/types/whatsAppTypes'; -import { updateUserWhatsAppInstance } from '@/services/whatsAppInstance/userOperations'; -import { createEvolutionWebhook } from '@/services/whatsApp/webhookService'; +import { Alert, AlertDescription } from '@/components/ui/alert'; interface CreateInstanceFormProps { onInstanceCreated: (instance: WhatsAppInstance) => void; initialInstanceName?: string; } -const CreateInstanceForm = ({ onInstanceCreated, initialInstanceName = '' }: CreateInstanceFormProps) => { +const CreateInstanceForm = ({ + onInstanceCreated, + initialInstanceName = '' +}: CreateInstanceFormProps) => { const { toast } = useToast(); - const [isCreating, setIsCreating] = useState(false); - const [userEmail, setUserEmail] = useState(initialInstanceName); - const [ddd, setDdd] = useState(''); + const [loading, setLoading] = useState(false); const [phoneNumber, setPhoneNumber] = useState(''); + const [hasExistingInstance, setHasExistingInstance] = useState(false); + const [checkingExistingInstance, setCheckingExistingInstance] = useState(true); + const currentUserId = localStorage.getItem('userId') || ''; + const userEmail = localStorage.getItem('userEmail') || ''; + + // Nome da instância será sempre o email do usuário + const instanceName = userEmail; - const handleCreateInstance = async (e: React.FormEvent) => { - e.preventDefault(); - - if (!userEmail.trim()) { + // Verificar se o usuário já tem uma instância + useEffect(() => { + const checkExistingInstance = async () => { + if (!userEmail) { + setCheckingExistingInstance(false); + return; + } + + try { + console.log('Verificando se usuário já tem instância:', userEmail); + const existingInstance = await getUserWhatsAppInstance(userEmail); + + if (existingInstance && existingInstance.instancia_zap) { + console.log('Usuário já possui instância:', existingInstance.instancia_zap); + setHasExistingInstance(true); + } else { + console.log('Usuário não possui instância'); + setHasExistingInstance(false); + } + } catch (error) { + console.error('Erro ao verificar instância existente:', error); + setHasExistingInstance(false); + } finally { + setCheckingExistingInstance(false); + } + }; + + checkExistingInstance(); + }, [userEmail]); + + const handleCreateInstance = async () => { + // Validate form fields + if (!userEmail) { toast({ title: "Erro", - description: "Por favor, informe seu email", + description: "Email do usuário não encontrado. Faça login novamente.", variant: "destructive", }); return; } - if (!ddd.trim() || ddd.length !== 2) { - toast({ - title: "Erro", - description: "Por favor, informe um DDD válido (2 dígitos)", - variant: "destructive", - }); - return; - } - - if (!phoneNumber.trim() || phoneNumber.length < 8) { + if (!phoneNumber.trim() || !/^[0-9]{10,15}$/.test(phoneNumber)) { toast({ title: "Erro", - description: "Por favor, informe um número de telefone válido", + description: "Insira um número válido com DDD e país (ex: 559999999999)", variant: "destructive", }); return; } - setIsCreating(true); + // Ensure user is logged in + if (!currentUserId) { + toast({ + title: "Erro de autenticação", + description: "Você precisa estar logado para criar uma instância", + variant: "destructive", + }); + return; + } + + // Verificar novamente se já existe instância antes de criar + if (hasExistingInstance) { + toast({ + title: "Erro", + description: "Você já possui uma instância WhatsApp. Apenas uma instância por usuário é permitida.", + variant: "destructive", + }); + return; + } + + setLoading(true); try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); + console.log(`🚀 Iniciando criação de instância com nome ${instanceName} e número ${phoneNumber}`); - // Construir o número completo: +55 + DDD + número - const fullPhoneNumber = `55${ddd}${phoneNumber}`; - - console.log(`🚀 Criando instância para: ${normalizedEmail} com número: ${fullPhoneNumber}`); + // 1. Criar instância na API + console.log('📡 Passo 1: Criando instância na API...'); + const data = await createWhatsAppInstance(instanceName, phoneNumber); + console.log('✅ Resposta da API de criação de instância:', data); - // Criar a instância no Evolution API - passar apenas o email - const response = await restartInstance(normalizedEmail); - - if (response && response.instance) { - const instanceData: WhatsAppInstance = { - instanceId: `${normalizedEmail}-${Date.now()}`, - instanceName: normalizedEmail, - phoneNumber: fullPhoneNumber, - connectionState: response.instance.state || 'closed', - qrcode: response.qrcode || null, - status: response.instance.state === 'open' ? 'connected' : 'disconnected', - lastSeen: new Date().toISOString(), - presence: 'offline', - userId: normalizedEmail - }; - - console.log('✅ Instância criada:', instanceData); - - // Atualizar no banco de dados local com o número de telefone - await updateUserWhatsAppInstance(normalizedEmail, normalizedEmail, 'conectado', fullPhoneNumber); - - // Criar webhook na Evolution API - await createEvolutionWebhook(normalizedEmail); + // 2. Atualizar o banco de dados com status "conectado" + console.log('💾 Passo 2: Atualizando banco de dados...'); + await updateUserWhatsAppInstance(userEmail, instanceName, 'conectado'); + console.log('✅ Instância registrada no banco de dados com status "conectado"'); + // 3. Ativar o workflow do usuário no n8n + console.log('🔄 Passo 3: Ativando workflow do usuário no n8n...'); + try { + await activateUserWorkflow(userEmail); + console.log('✅ Workflow ativado com sucesso no n8n'); + } catch (workflowError) { + console.error('⚠️ Erro ao ativar workflow, mas instância foi criada:', workflowError); + // Não bloquear o fluxo se o workflow falhar, apenas loggar toast({ - title: "Sucesso!", - description: "Instância criada com sucesso. Use o QR Code para conectar.", + title: "Aviso", + description: "Instância criada, mas houve um problema ao ativar a automação. Entre em contato com o suporte.", + variant: "destructive", }); - - onInstanceCreated(instanceData); - - } else { - throw new Error('Resposta inválida da API'); } - } catch (error) { - console.error('❌ Erro ao criar instância:', error); + // 4. Criar objeto da instância + const newInstance: WhatsAppInstance = { + instanceName, + instanceId: instanceName, + phoneNumber, + userId: currentUserId, + status: data.instance?.status || 'created', + qrcode: data.qrcode?.base64 || null, + connectionState: 'closed' + }; + + console.log('✅ Nova instância criada:', newInstance); + + // 5. Atualizar estado para evitar nova criação + setHasExistingInstance(true); + + // 6. Notificar componente pai + onInstanceCreated(newInstance); - let errorMessage = 'Erro desconhecido ao criar instância'; - if (error instanceof Error) { - errorMessage = error.message; - } - toast({ - title: "Erro ao criar instância", - description: errorMessage, + title: "Sucesso!", + description: "Instância do WhatsApp criada e ativada com sucesso!" + }); + + // Reset form fields + setPhoneNumber(''); + + } catch (error) { + console.error("💥 Erro ao criar instância WhatsApp:", error); + + // Se houve erro na API, tentar reverter no banco de dados + try { + await updateUserWhatsAppInstance(userEmail, '', 'desconectado'); + console.log('🔄 Instância removida do banco devido ao erro na API'); + } catch (dbError) { + console.error('❌ Erro ao reverter instância no banco:', dbError); + } + + toast({ + title: "Erro na criação da instância", + description: "Ocorreu um erro ao conectar com a API. Tente novamente mais tarde.", variant: "destructive", }); } finally { - setIsCreating(false); + setLoading(false); } }; + if (checkingExistingInstance) { + return ( + + +
+
+

Verificando instâncias existentes...

+
+
+
+ ); + } + + if (hasExistingInstance) { + return ( + + +
+ + WhatsApp já Conectado +
+ + Você já possui uma instância WhatsApp vinculada ao seu email + +
+ + + + + Apenas uma instância WhatsApp por usuário é permitida. + Sua instância atual: {instanceName} + + + +
+

+ ✓ Instância ativa: {instanceName} +

+

+ Para gerenciar sua instância, utilize os botões na lista de instâncias acima. +

+
+
+
+ ); + } + return ( - - - Conectar WhatsApp - +
+ + Vincular WhatsApp ao App +
- Conecte uma nova instância do WhatsApp para enviar mensagens automáticas + Preencha os campos abaixo para conectar sua conta WhatsApp
- -
-
- - setUserEmail(e.target.value)} - disabled={isCreating} - required - /> -

- Este será o identificador único da sua instância -

-
- -
- -
- {/* Código do país fixo */} -
- -
- - {/* Campo DDD */} -
- { - const value = e.target.value.replace(/\D/g, '').slice(0, 2); - setDdd(value); - }} - disabled={isCreating} - className="w-16 text-center" - maxLength={2} - required - /> -
- - {/* Campo número */} -
- { - const value = e.target.value.replace(/\D/g, '').slice(0, 9); - setPhoneNumber(value); - }} - disabled={isCreating} - maxLength={9} - required - /> -
-
-

- Digite seu DDD e o número do seu celular -

-
- - - - - - - Após criar a instância, você precisará escanear o QR Code com o WhatsApp - do seu celular para estabelecer a conexão. - - -
+ +
+ + +

+ O nome da instância será automaticamente seu email de login +

+
+ +
+ + setPhoneNumber(e.target.value)} + placeholder="559999999999" + required + /> +

Digite o número com DDD e código do país

+
+ + + +
+

Importante:

+
    +
  • • Apenas uma instância por usuário é permitida
  • +
  • • O nome da instância será seu email de login
  • +
  • • Após criar, você precisará escanear o QR Code para conectar
  • +
  • • Sua automação financeira será ativada automaticamente
  • +
+
); diff --git a/src/components/whatsappGroups/CreateGroupForm.tsx b/src/components/whatsappGroups/CreateGroupForm.tsx index bb15cc2..b3cdf06 100644 --- a/src/components/whatsappGroups/CreateGroupForm.tsx +++ b/src/components/whatsappGroups/CreateGroupForm.tsx @@ -1,3 +1,4 @@ + import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; @@ -8,7 +9,6 @@ import { Alert, AlertDescription } from '@/components/ui/alert'; import { findOrCreateWhatsAppGroup } from '@/services/whatsAppGroupsService'; import { getUserWhatsAppInstance } from '@/services/whatsAppInstanceService'; import { createWhatsAppGroup, updateGroupRemoteJid } from '@/services/whatsAppGroupCreationService'; -import { activateUserWorkflow } from '@/services/whatsAppInstanceService'; import { useToast } from '@/hooks/use-toast'; interface CreateGroupFormProps { @@ -39,11 +39,9 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => { setCheckingInstance(true); try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); - console.log('Verificando instância para:', normalizedEmail); + console.log('Verificando instância para:', userEmail); - const instanceData = await getUserWhatsAppInstance(normalizedEmail); + const instanceData = await getUserWhatsAppInstance(userEmail); console.log('Dados da instância:', instanceData); if (instanceData) { @@ -110,9 +108,6 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => { setCadastrando(true); try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); - console.log("Iniciando processo de cadastro de grupo..."); // 1. Cadastrar grupo no banco de dados local @@ -124,32 +119,24 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => { // 2. Criar grupo no WhatsApp via API com o nome escolhido pelo usuário try { - const groupResponse = await createWhatsAppGroup(normalizedEmail, nomeGrupo.trim()); + const groupResponse = await createWhatsAppGroup(userEmail, nomeGrupo.trim()); console.log('Resposta da criação do grupo:', groupResponse); // 3. Atualizar remote_jid no banco de dados if (groupResponse.id) { await updateGroupRemoteJid(grupo.id, groupResponse.id); - } - - // 4. 🚀 NOVO: Ativar workflow n8n após criar o grupo com sucesso - try { - console.log('🔔 Ativando workflow n8n para o usuário após criação do grupo...'); - await activateUserWorkflow(normalizedEmail); toast({ title: 'Sucesso!', - description: `Grupo "${nomeGrupo}" criado e automação ativada com sucesso!`, + description: `Grupo "${nomeGrupo}" criado com sucesso no seu WhatsApp!`, variant: 'default', }); - } catch (workflowError) { - console.error('Erro ao ativar workflow:', workflowError); - // Não falhar o processo todo se o workflow não ativar + } else { toast({ - title: 'Grupo criado!', - description: `Grupo "${nomeGrupo}" criado com sucesso. Automação será ativada em breve.`, - variant: 'default', + title: 'Atenção', + description: 'Grupo cadastrado no sistema, mas não foi possível criar no WhatsApp', + variant: 'destructive', }); } @@ -274,7 +261,6 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => {
  • O grupo será criado automaticamente no seu WhatsApp
  • Você será adicionado como participante do grupo
  • O grupo terá o nome que você escolheu: {nomeGrupo || 'Digite um nome acima'}
  • -
  • A automação será ativada automaticamente após a criação
  • diff --git a/src/services/whatsApp/webhookService.ts b/src/services/whatsApp/webhookService.ts index 788bf6f..0a53d2b 100644 --- a/src/services/whatsApp/webhookService.ts +++ b/src/services/whatsApp/webhookService.ts @@ -6,19 +6,16 @@ import { makeRequest } from './apiHelpers'; */ export const createEvolutionWebhook = async (userEmail: string): Promise => { try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); - - console.log(`Criando webhook para o usuário: ${normalizedEmail}`); + console.log(`Criando webhook para o usuário: ${userEmail}`); // URL do endpoint - mantém o @ normal no email - const endpoint = `/webhook/set/${normalizedEmail}`; + const endpoint = `/webhook/set/${userEmail}`; // Agora mantemos o email original com @ também na URL do webhook const webhookBody = { webhook: { enabled: true, - url: `https://webhookn8n.innova1001.com.br/webhook/${normalizedEmail}`, + url: `https://webhookn8n.innova1001.com.br/webhook/${userEmail}`, webhookByEvents: true, webhookBase64: true, events: [ @@ -29,13 +26,13 @@ export const createEvolutionWebhook = async (userEmail: string): Promise => console.log('Dados do webhook:', { endpoint, - emailOriginal: normalizedEmail, + emailOriginal: userEmail, webhookUrl: webhookBody.webhook.url }); const response = await makeRequest(endpoint, 'POST', webhookBody); - console.log(`✅ Webhook criado com sucesso para ${normalizedEmail}:`, response); + console.log(`✅ Webhook criado com sucesso para ${userEmail}:`, response); return response; } catch (error) { diff --git a/src/services/whatsAppGroupsService.ts b/src/services/whatsAppGroupsService.ts index c134cb3..7789a60 100644 --- a/src/services/whatsAppGroupsService.ts +++ b/src/services/whatsAppGroupsService.ts @@ -42,7 +42,7 @@ export async function findOrCreateWhatsAppGroup(nomeGrupo?: string): Promise { return []; } - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase + // Normalizar o email (minúsculo e sem espaços) const normalizedEmail = userEmail.trim().toLowerCase(); // Buscar grupos associados ao email do usuário diff --git a/src/services/whatsAppInstance/index.ts b/src/services/whatsAppInstance/index.ts index dfea93b..637bbc1 100644 --- a/src/services/whatsAppInstance/index.ts +++ b/src/services/whatsAppInstance/index.ts @@ -1,30 +1,6 @@ -// Re-export all functions from the new modular structure +// Re-export all WhatsApp instance service functions export * from './databaseOperations'; export * from './workflowOperations'; +export * from './userOperations'; export * from './config'; - -// For backwards compatibility, also export individual functions specifically -export { - updateUserWhatsAppInstance, - getUserWhatsAppInstance, - removeUserWhatsAppInstance, - getUserDebugInfo -} from './databaseOperations'; - -export { - activateUserWorkflow -} from './workflowOperations'; - -// Export a helper function to check if user has instance -export async function checkUserHasInstance(userEmail: string): Promise { - try { - const { getUserWhatsAppInstance } = await import('./databaseOperations'); - const instanceData = await getUserWhatsAppInstance(userEmail.trim().toLowerCase()); - - return !!(instanceData && instanceData.instancia_zap && instanceData.instancia_zap.trim() !== ''); - } catch (error) { - console.error('Erro ao verificar se usuário tem instância:', error); - return false; - } -} diff --git a/src/services/whatsAppInstance/userOperations.ts b/src/services/whatsAppInstance/userOperations.ts index f63a8f9..2fb7df7 100644 --- a/src/services/whatsAppInstance/userOperations.ts +++ b/src/services/whatsAppInstance/userOperations.ts @@ -1,198 +1,21 @@ -import { supabase } from "@/integrations/supabase/client"; +import { getUserWhatsAppInstance } from './databaseOperations'; /** - * Updates user WhatsApp instance information in the database + * User-related WhatsApp instance operations */ -export async function updateUserWhatsAppInstance( - userEmail: string, - instanceName: string, - status: string, - phoneNumber?: string -): Promise { - try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); - const normalizedInstanceName = instanceName.trim().toLowerCase(); - - console.log(`Atualizando instância WhatsApp para usuário: ${normalizedEmail}`); - - // Verificar se já existe um registro para este usuário - const { data: existingUser, error: fetchError } = await supabase - .from('usuarios') - .select('*') - .eq('email', normalizedEmail) - .single(); - - if (fetchError && fetchError.code !== 'PGRST116') { // PGRST116 = no rows returned - console.error('Erro ao buscar usuário:', fetchError); - throw fetchError; - } - - if (existingUser) { - // Atualizar registro existente - const updateData: any = { - instancia_zap: normalizedInstanceName, - status_instancia: status - }; - - // Adicionar telefone se fornecido - if (phoneNumber) { - updateData.whatsapp = phoneNumber; - } - - const { error: updateError } = await supabase - .from('usuarios') - .update(updateData) - .eq('email', normalizedEmail); - - if (updateError) { - console.error('Erro ao atualizar instância WhatsApp:', updateError); - throw updateError; - } - - console.log(`✅ Instância WhatsApp atualizada para ${normalizedEmail}: ${normalizedInstanceName} (${status})`); - } else { - // Criar novo registro - whatsapp é obrigatório na inserção - const insertData = { - email: normalizedEmail, - instancia_zap: normalizedInstanceName, - status_instancia: status, - whatsapp: phoneNumber || '00000000000' // Valor padrão se não fornecido - }; - - const { error: insertError } = await supabase - .from('usuarios') - .insert(insertData); - - if (insertError) { - console.error('Erro ao criar registro de instância WhatsApp:', insertError); - throw insertError; - } - - console.log(`✅ Novo registro de instância WhatsApp criado para ${normalizedEmail}: ${normalizedInstanceName} (${status})`); - } - } catch (error) { - console.error('Erro ao atualizar instância WhatsApp do usuário:', error); - throw error; - } -} /** - * Gets user WhatsApp instance information from the database - */ -export async function getUserWhatsAppInstance(userEmail: string): Promise<{ - instancia_zap: string | null; - status_instancia: string | null; - whatsapp: string | null; -} | null> { - try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); - - console.log(`Buscando instância WhatsApp para usuário: ${normalizedEmail}`); - - const { data, error } = await supabase - .from('usuarios') - .select('instancia_zap, status_instancia, whatsapp') - .eq('email', normalizedEmail) - .single(); - - if (error) { - if (error.code === 'PGRST116') { // No rows returned - console.log(`Nenhuma instância encontrada para ${normalizedEmail}`); - return null; - } - console.error('Erro ao buscar instância WhatsApp:', error); - throw error; - } - - console.log(`✅ Instância encontrada para ${normalizedEmail}:`, data); - return data; - } catch (error) { - console.error('Erro ao buscar instância WhatsApp do usuário:', error); - throw error; - } -} - -/** - * Removes user WhatsApp instance information from the database - */ -export async function removeUserWhatsAppInstance(userEmail: string): Promise { - try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); - - console.log(`Removendo instância WhatsApp para usuário: ${normalizedEmail}`); - - const { error } = await supabase - .from('usuarios') - .update({ - instancia_zap: null, - status_instancia: null, - whatsapp: null - }) - .eq('email', normalizedEmail); - - if (error) { - console.error('Erro ao remover instância WhatsApp:', error); - throw error; - } - - console.log(`✅ Instância WhatsApp removida para ${normalizedEmail}`); - } catch (error) { - console.error('Erro ao remover instância WhatsApp do usuário:', error); - throw error; - } -} - -/** - * Checks if user has a WhatsApp instance + * Checks if user has an active WhatsApp instance */ export async function checkUserHasInstance(userEmail: string): Promise { try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); - - const instanceData = await getUserWhatsAppInstance(normalizedEmail); - - return !!(instanceData && instanceData.instancia_zap && instanceData.instancia_zap.trim() !== ''); + const instanceData = await getUserWhatsAppInstance(userEmail); + 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; } } - -/** - * Gets debug information for user WhatsApp instance - */ -export async function getUserDebugInfo(userEmail: string): Promise { - try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); - - console.log(`Buscando informações de debug para: ${normalizedEmail}`); - - const { data, error } = await supabase - .from('usuarios') - .select('*') - .eq('email', normalizedEmail) - .single(); - - if (error) { - if (error.code === 'PGRST116') { - return { message: 'Usuário não encontrado', email: normalizedEmail }; - } - throw error; - } - - return { - ...data, - email_normalizado: normalizedEmail, - debug_timestamp: new Date().toISOString() - }; - } catch (error) { - console.error('Erro ao buscar informações de debug:', error); - throw error; - } -} diff --git a/src/services/whatsAppInstance/workflowOperations.ts b/src/services/whatsAppInstance/workflowOperations.ts index cede082..6108e30 100644 --- a/src/services/whatsAppInstance/workflowOperations.ts +++ b/src/services/whatsAppInstance/workflowOperations.ts @@ -5,57 +5,19 @@ import { N8N_CONFIG } from './config'; * N8N workflow operations */ -/** - * Ativa um workflow específico no n8n via API direta - */ -export async function activateN8nWorkflow(workflowId: string): Promise { - try { - console.log(`🔔 Ativando workflow no n8n: ${workflowId}`); - - const apiUrl = `${N8N_CONFIG.BASE_URL}/workflows/${workflowId}/activate`; - console.log(`🔗 URL da API: ${apiUrl}`); - - const response = await fetch(apiUrl, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-N8N-API-KEY': N8N_CONFIG.API_KEY - } - }); - - console.log(`📡 Status da resposta da API: ${response.status}`); - - if (!response.ok) { - const errorText = await response.text(); - console.error(`❌ Erro ao ativar workflow: ${response.status} - ${errorText}`); - throw new Error(`Erro ao ativar workflow: ${response.status} - ${errorText}`); - } - - const responseData = await response.json(); - console.log('✅ Workflow ativado com sucesso:', responseData); - - } catch (error) { - console.error('💥 Erro crítico ao ativar workflow:', error); - throw error; - } -} - /** * Notifica o n8n para ativar o workflow do usuário via webhook */ export async function activateUserWorkflow(userEmail: string): Promise { try { - // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase - const normalizedEmail = userEmail.trim().toLowerCase(); - - console.log(`🔔 Enviando webhook para ativar workflow do usuário: ${normalizedEmail}`); + console.log(`🔔 Enviando webhook para ativar workflow do usuário: ${userEmail}`); // Nova lógica: webhook simples para o n8n const webhookUrl = 'https://webhookn8n.innova1001.com.br/webhook/ativarworkflow'; console.log(`🔗 URL do webhook: ${webhookUrl}`); const webhookBody = { - email: normalizedEmail + email: userEmail }; console.log('📦 Dados do webhook:', JSON.stringify(webhookBody, null, 2)); diff --git a/src/types/whatsAppTypes.ts b/src/types/whatsAppTypes.ts index c57fda6..ffd0401 100644 --- a/src/types/whatsAppTypes.ts +++ b/src/types/whatsAppTypes.ts @@ -8,5 +8,4 @@ export interface WhatsAppInstance { qrcode?: string | null; connectionState?: 'open' | 'closed' | 'connecting' | string; presence?: 'online' | 'offline'; - lastSeen?: string; }