diff --git a/src/services/whatsAppInstance/config.ts b/src/services/whatsAppInstance/config.ts new file mode 100644 index 0000000..91c05f1 --- /dev/null +++ b/src/services/whatsAppInstance/config.ts @@ -0,0 +1,6 @@ + +// Configuration constants for WhatsApp instance service +export const N8N_CONFIG = { + BASE_URL: 'https://n8n.innova1001.com.br/api/v1', + API_KEY: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2YmM4MjQxOS0zZTk1LTRiYmMtODMwMy0xODAzZjk4YmQ4YjciLCJpc3MiOiJuOG4iLCJhdWQiOiJwdWJsaWMtYXBpIiwiaWF0IjoxNzUwMTA5ODU3fQ.cvqDVnD6ide9WCbtCx7bVDEvkPzJyO4EhGSDhY0xIjE' +}; diff --git a/src/services/whatsAppInstance/databaseOperations.ts b/src/services/whatsAppInstance/databaseOperations.ts new file mode 100644 index 0000000..9b3461a --- /dev/null +++ b/src/services/whatsAppInstance/databaseOperations.ts @@ -0,0 +1,192 @@ + +import { supabase } from "@/integrations/supabase/client"; + +/** + * Database operations for WhatsApp instances + */ + +export interface UserInstanceData { + instancia_zap: string | null; + status_instancia: string | null; + whatsapp: string | null; +} + +export interface UserWorkflowData { + workflow_id: string | null; +} + +/** + * Updates WhatsApp instance data in the database + */ +export async function updateUserWhatsAppInstance( + userEmail: string, + instanceName: string, + status: 'conectado' | 'desconectado' +): Promise { + try { + console.log(`Atualizando instância no banco: ${userEmail} -> ${instanceName} (${status})`); + + const { error } = await supabase + .from('usuarios') + .update({ + instancia_zap: instanceName, + status_instancia: status + }) + .eq('email', userEmail.trim().toLowerCase()); + + if (error) { + console.error('Erro ao atualizar instância WhatsApp:', error); + throw error; + } + + console.log(`Instância WhatsApp atualizada com sucesso: ${instanceName} - ${status}`); + } catch (error) { + console.error('Erro ao atualizar instância WhatsApp no banco:', error); + throw error; + } +} + +/** + * Gets WhatsApp instance data for a user + */ +export async function getUserWhatsAppInstance(userEmail: string): Promise { + try { + console.log('🔍 getUserWhatsAppInstance - Email recebido:', userEmail); + + const normalizedEmail = userEmail.trim().toLowerCase(); + console.log('📧 Email normalizado para consulta:', normalizedEmail); + + console.log('🔎 FAZENDO CONSULTA DIRETA NO BANCO...'); + const { data, error, count } = await supabase + .from('usuarios') + .select('email, instancia_zap, status_instancia, whatsapp', { count: 'exact' }) + .eq('email', normalizedEmail); + + console.log('📊 RESULTADO DA CONSULTA DIRETA:'); + console.log('- Total de registros encontrados:', count); + console.log('- Dados retornados:', JSON.stringify(data, null, 2)); + console.log('- Erro na consulta:', error); + + if (error) { + console.error('❌ Erro na consulta Supabase:', error); + throw error; + } + + if (!data || data.length === 0) { + console.log('⚠️ NENHUM REGISTRO ENCONTRADO para o email:', normalizedEmail); + + // Debug: Show all emails in database + const { data: allEmails, error: allError } = await supabase + .from('usuarios') + .select('email, instancia_zap, status_instancia'); + + if (!allError && allEmails) { + console.log('📋 TODOS OS EMAILS ENCONTRADOS NO BANCO:'); + allEmails.forEach((user, index) => { + console.log(`${index + 1}. Email no banco: "${user.email}" | Instancia: "${user.instancia_zap}" | Status: "${user.status_instancia}"`); + }); + } + + return null; + } + + const userData = data[0]; + console.log('✅ USUÁRIO ENCONTRADO! Dados extraídos:'); + console.log(`- Email do banco: "${userData.email}"`); + console.log(`- instancia_zap: "${userData.instancia_zap}" (tipo: ${typeof userData.instancia_zap})`); + console.log(`- status_instancia: "${userData.status_instancia}" (tipo: ${typeof userData.status_instancia})`); + console.log(`- whatsapp: "${userData.whatsapp}" (tipo: ${typeof userData.whatsapp})`); + + return { + instancia_zap: userData.instancia_zap, + status_instancia: userData.status_instancia, + whatsapp: userData.whatsapp + }; + } catch (error) { + console.error('💥 Erro crítico ao buscar instância WhatsApp:', error); + throw error; + } +} + +/** + * Gets workflow ID for a user + */ +export async function getUserWorkflowId(userEmail: string): Promise { + try { + const { data: userData, error: fetchError } = await supabase + .from('usuarios') + .select('workflow_id') + .eq('email', userEmail.trim().toLowerCase()) + .single(); + + if (fetchError) { + console.error('❌ Erro ao buscar workflow_id do usuário:', fetchError); + throw new Error(`Erro ao buscar workflow_id: ${fetchError.message}`); + } + + if (!userData || !userData.workflow_id) { + console.error('⚠️ Usuário não possui workflow_id configurado'); + throw new Error('Usuário não possui workflow configurado'); + } + + return userData.workflow_id; + } catch (error) { + console.error('Erro ao buscar workflow_id:', error); + throw error; + } +} + +/** + * Removes WhatsApp instance from user + */ +export async function removeUserWhatsAppInstance(userEmail: string): Promise { + try { + console.log(`Removendo instância do usuário: ${userEmail}`); + + const { error } = await supabase + .from('usuarios') + .update({ + instancia_zap: null, + status_instancia: 'desconectado' + }) + .eq('email', userEmail.trim().toLowerCase()); + + if (error) { + console.error('Erro ao remover instância WhatsApp:', error); + throw error; + } + + console.log('Instância WhatsApp removida com sucesso'); + } catch (error) { + console.error('Erro ao remover instância WhatsApp do banco:', error); + throw error; + } +} + +/** + * Gets complete user data for debugging + */ +export async function getUserDebugInfo(userEmail: string): Promise { + try { + console.log('🔍 Buscando informações COMPLETAS do usuário para debug:', userEmail); + + const normalizedEmail = userEmail.trim().toLowerCase(); + console.log('📧 Email normalizado para debug:', normalizedEmail); + + const { data, error } = await supabase + .from('usuarios') + .select('*') + .eq('email', normalizedEmail); + + if (error) { + console.error('❌ Erro ao buscar informações completas do usuário:', error); + throw error; + } + + console.log('📊 DADOS COMPLETOS DO USUÁRIO:', JSON.stringify(data, null, 2)); + return data && data.length > 0 ? data[0] : null; + } catch (error) { + console.error('💥 Erro ao buscar informações completas do usuário:', error); + throw error; + } +} diff --git a/src/services/whatsAppInstance/index.ts b/src/services/whatsAppInstance/index.ts new file mode 100644 index 0000000..637bbc1 --- /dev/null +++ b/src/services/whatsAppInstance/index.ts @@ -0,0 +1,6 @@ + +// Re-export all WhatsApp instance service functions +export * from './databaseOperations'; +export * from './workflowOperations'; +export * from './userOperations'; +export * from './config'; diff --git a/src/services/whatsAppInstance/userOperations.ts b/src/services/whatsAppInstance/userOperations.ts new file mode 100644 index 0000000..2fb7df7 --- /dev/null +++ b/src/services/whatsAppInstance/userOperations.ts @@ -0,0 +1,21 @@ + +import { getUserWhatsAppInstance } from './databaseOperations'; + +/** + * User-related WhatsApp instance operations + */ + +/** + * Checks if user has an active WhatsApp instance + */ +export async function checkUserHasInstance(userEmail: string): Promise { + try { + 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; + } +} diff --git a/src/services/whatsAppInstance/workflowOperations.ts b/src/services/whatsAppInstance/workflowOperations.ts new file mode 100644 index 0000000..93177f2 --- /dev/null +++ b/src/services/whatsAppInstance/workflowOperations.ts @@ -0,0 +1,47 @@ + +import { N8N_CONFIG } from './config'; +import { getUserWorkflowId } from './databaseOperations'; + +/** + * N8N workflow operations + */ + +/** + * Activates user workflow in n8n + */ +export async function activateUserWorkflow(userEmail: string): Promise { + try { + console.log(`🔄 Iniciando ativação do workflow para usuário: ${userEmail}`); + + // Get user's workflow ID + const workflowId = await getUserWorkflowId(userEmail); + console.log(`📋 Workflow ID encontrado: ${workflowId}`); + + // Make activation request + const activationUrl = `${N8N_CONFIG.BASE_URL}/workflows/${workflowId}/activate`; + console.log(`🔗 URL de ativação: ${activationUrl}`); + + const response = await fetch(activationUrl, { + method: 'POST', + headers: { + 'X-N8N-API-KEY': N8N_CONFIG.API_KEY, + 'Content-Type': 'application/json' + } + }); + + console.log(`📡 Status da resposta da ativação: ${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 do usuário:', error); + throw error; + } +} diff --git a/src/services/whatsAppInstanceService.ts b/src/services/whatsAppInstanceService.ts index 2b65470..8114969 100644 --- a/src/services/whatsAppInstanceService.ts +++ b/src/services/whatsAppInstanceService.ts @@ -1,227 +1,13 @@ -import { supabase } from "@/integrations/supabase/client"; +// Re-export all functions from the new modular structure +export * from './whatsAppInstance'; -/** - * Atualiza a instância WhatsApp do usuário no banco de dados - */ -export async function updateUserWhatsAppInstance( - userEmail: string, - instanceName: string, - status: 'conectado' | 'desconectado' -): Promise { - try { - console.log(`Atualizando instância no banco: ${userEmail} -> ${instanceName} (${status})`); - - const { error } = await supabase - .from('usuarios') - .update({ - instancia_zap: instanceName, - status_instancia: status - }) - .eq('email', userEmail.trim().toLowerCase()); - - if (error) { - console.error('Erro ao atualizar instância WhatsApp:', error); - throw error; - } - - console.log(`Instância WhatsApp atualizada com sucesso: ${instanceName} - ${status}`); - } catch (error) { - console.error('Erro ao atualizar instância WhatsApp no banco:', error); - throw error; - } -} - -/** - * Busca a instância WhatsApp do usuário - */ -export async function getUserWhatsAppInstance(userEmail: string): Promise<{ - instancia_zap: string | null; - status_instancia: string | null; - whatsapp: string | null; -} | null> { - try { - console.log('🔍 getUserWhatsAppInstance - Email recebido:', userEmail); - - const normalizedEmail = userEmail.trim().toLowerCase(); - console.log('📧 Email normalizado para consulta:', normalizedEmail); - - // TESTE DIRETO: Vamos fazer uma consulta mais específica - console.log('🔎 FAZENDO CONSULTA DIRETA NO BANCO...'); - const { data, error, count } = await supabase - .from('usuarios') - .select('email, instancia_zap, status_instancia, whatsapp', { count: 'exact' }) - .eq('email', normalizedEmail); - - console.log('📊 RESULTADO DA CONSULTA DIRETA:'); - console.log('- Total de registros encontrados:', count); - console.log('- Dados retornados:', JSON.stringify(data, null, 2)); - console.log('- Erro na consulta:', error); - - if (error) { - console.error('❌ Erro na consulta Supabase:', error); - throw error; - } - - if (!data || data.length === 0) { - console.log('⚠️ NENHUM REGISTRO ENCONTRADO para o email:', normalizedEmail); - - // Fazer uma consulta geral para ver todos os emails no banco - console.log('🔍 CONSULTANDO TODOS OS EMAILS NO BANCO:'); - const { data: allEmails, error: allError } = await supabase - .from('usuarios') - .select('email, instancia_zap, status_instancia'); - - if (!allError && allEmails) { - console.log('📋 TODOS OS EMAILS ENCONTRADOS NO BANCO:'); - allEmails.forEach((user, index) => { - console.log(`${index + 1}. Email no banco: "${user.email}" | Instancia: "${user.instancia_zap}" | Status: "${user.status_instancia}"`); - }); - } - - return null; - } - - const userData = data[0]; - console.log('✅ USUÁRIO ENCONTRADO! Dados extraídos:'); - console.log(`- Email do banco: "${userData.email}"`); - console.log(`- instancia_zap: "${userData.instancia_zap}" (tipo: ${typeof userData.instancia_zap})`); - console.log(`- status_instancia: "${userData.status_instancia}" (tipo: ${typeof userData.status_instancia})`); - console.log(`- whatsapp: "${userData.whatsapp}" (tipo: ${typeof userData.whatsapp})`); - - return { - instancia_zap: userData.instancia_zap, - status_instancia: userData.status_instancia, - whatsapp: userData.whatsapp - }; - } catch (error) { - console.error('💥 Erro crítico ao buscar instância WhatsApp:', error); - throw error; - } -} - -/** - * Verifica se o usuário já possui uma instância ativa - */ -export async function checkUserHasInstance(userEmail: string): Promise { - try { - 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; - } -} - -/** - * Remove a instância WhatsApp do usuário - */ -export async function removeUserWhatsAppInstance(userEmail: string): Promise { - try { - console.log(`Removendo instância do usuário: ${userEmail}`); - - const { error } = await supabase - .from('usuarios') - .update({ - instancia_zap: null, - status_instancia: 'desconectado' - }) - .eq('email', userEmail.trim().toLowerCase()); - - if (error) { - console.error('Erro ao remover instância WhatsApp:', error); - throw error; - } - - console.log('Instância WhatsApp removida com sucesso'); - } catch (error) { - console.error('Erro ao remover instância WhatsApp do banco:', error); - throw error; - } -} - -/** - * Busca dados completos do usuário para debug - */ -export async function getUserDebugInfo(userEmail: string): Promise { - try { - console.log('🔍 Buscando informações COMPLETAS do usuário para debug:', userEmail); - - const normalizedEmail = userEmail.trim().toLowerCase(); - console.log('📧 Email normalizado para debug:', normalizedEmail); - - const { data, error } = await supabase - .from('usuarios') - .select('*') - .eq('email', normalizedEmail); - - if (error) { - console.error('❌ Erro ao buscar informações completas do usuário:', error); - throw error; - } - - console.log('📊 DADOS COMPLETOS DO USUÁRIO:', JSON.stringify(data, null, 2)); - return data && data.length > 0 ? data[0] : null; - } catch (error) { - console.error('💥 Erro ao buscar informações completas do usuário:', error); - throw error; - } -} - -/** - * Ativa o workflow do usuário no n8n - */ -export async function activateUserWorkflow(userEmail: string): Promise { - try { - console.log(`🔄 Iniciando ativação do workflow para usuário: ${userEmail}`); - - // Primeiro, buscar o workflow_id do usuário - const { data: userData, error: fetchError } = await supabase - .from('usuarios') - .select('workflow_id') - .eq('email', userEmail.trim().toLowerCase()) - .single(); - - if (fetchError) { - console.error('❌ Erro ao buscar workflow_id do usuário:', fetchError); - throw new Error(`Erro ao buscar workflow_id: ${fetchError.message}`); - } - - if (!userData || !userData.workflow_id) { - console.error('⚠️ Usuário não possui workflow_id configurado'); - throw new Error('Usuário não possui workflow configurado'); - } - - const workflowId = userData.workflow_id; - console.log(`📋 Workflow ID encontrado: ${workflowId}`); - - // Fazer a requisição para ativar o workflow - const activationUrl = `https://n8n.innova1001.com.br/api/v1/workflows/${workflowId}/activate`; - console.log(`🔗 URL de ativação: ${activationUrl}`); - - const response = await fetch(activationUrl, { - method: 'POST', - headers: { - 'X-N8N-API-KEY': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2YmM4MjQxOS0zZTk1LTRiYmMtODMwMy0xODAzZjk4YmQ4YjciLCJpc3MiOiJuOG4iLCJhdWQiOiJwdWJsaWMtYXBpIiwiaWF0IjoxNzUwMTA5ODU3fQ.cvqDVnD6ide9WCbtCx7bVDEvkPzJyO4EhGSDhY0xIjE', - 'Content-Type': 'application/json' - } - }); - - console.log(`📡 Status da resposta da ativação: ${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 do usuário:', error); - throw error; - } -} +// For backwards compatibility, also export individual functions +export { + updateUserWhatsAppInstance, + getUserWhatsAppInstance, + removeUserWhatsAppInstance, + getUserDebugInfo, + activateUserWorkflow, + checkUserHasInstance +} from './whatsAppInstance';