diff --git a/src/components/whatsapp/CreateInstanceForm.tsx b/src/components/whatsapp/CreateInstanceForm.tsx
index 5b8acf1..4bd7d44 100644
--- a/src/components/whatsapp/CreateInstanceForm.tsx
+++ b/src/components/whatsapp/CreateInstanceForm.tsx
@@ -1,285 +1,225 @@
-import { useState, useEffect } from 'react';
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
-import { Input } from '@/components/ui/input';
+import React, { useState } from 'react';
+import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
+import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { MessageCircle, AlertCircle } from 'lucide-react';
-import { useToast } from '@/hooks/use-toast';
-import { createWhatsAppInstance } from '@/services/whatsAppService';
-import { updateUserWhatsAppInstance, getUserWhatsAppInstance, activateUserWorkflow } from '@/services/whatsAppInstanceService';
-import { WhatsAppInstance } from '@/types/whatsAppTypes';
import { Alert, AlertDescription } from '@/components/ui/alert';
+import { Loader2, Plus, AlertCircle } from 'lucide-react';
+import { useToast } from '@/hooks/use-toast';
+import { createInstance } from '@/services/whatsAppService';
+import { WhatsAppInstance } from '@/types/whatsAppTypes';
+import { updateUserWhatsAppInstance } from '@/services/whatsAppInstanceService';
+import { createEvolutionWebhook } from '@/services/whatsApp/webhookService';
interface CreateInstanceFormProps {
onInstanceCreated: (instance: WhatsAppInstance) => void;
initialInstanceName?: string;
}
-const CreateInstanceForm = ({
- onInstanceCreated,
- initialInstanceName = ''
-}: CreateInstanceFormProps) => {
+const CreateInstanceForm = ({ onInstanceCreated, initialInstanceName = '' }: CreateInstanceFormProps) => {
const { toast } = useToast();
- const [loading, setLoading] = useState(false);
+ const [isCreating, setIsCreating] = useState(false);
+ const [userEmail, setUserEmail] = useState(initialInstanceName);
+ const [ddd, setDdd] = useState('');
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 [showAdvanced, setShowAdvanced] = useState(false);
- // 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) {
+ const handleCreateInstance = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ if (!userEmail.trim()) {
toast({
title: "Erro",
- description: "Email do usuário não encontrado. Faça login novamente.",
+ description: "Por favor, informe seu email",
variant: "destructive",
});
return;
}
- if (!phoneNumber.trim() || !/^[0-9]{10,15}$/.test(phoneNumber)) {
+ 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) {
toast({
title: "Erro",
- description: "Insira um número válido com DDD e país (ex: 559999999999)",
+ description: "Por favor, informe um número de telefone válido",
variant: "destructive",
});
return;
}
- // 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);
+ setIsCreating(true);
try {
- console.log(`🚀 Iniciando criação de instância com nome ${instanceName} e número ${phoneNumber}`);
+ // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase
+ const normalizedEmail = userEmail.trim().toLowerCase();
- // 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);
+ // 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}`);
- // 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"');
+ // Criar a instância no Evolution API
+ const response = await createInstance(normalizedEmail, fullPhoneNumber);
+
+ 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',
+ createdAt: new Date().toISOString(),
+ lastSeen: new Date().toISOString(),
+ presence: 'offline'
+ };
+
+ console.log('✅ Instância criada:', instanceData);
+
+ // Atualizar no banco de dados local
+ await updateUserWhatsAppInstance(normalizedEmail, normalizedEmail, 'conectado');
+
+ // Criar webhook na Evolution API
+ await createEvolutionWebhook(normalizedEmail);
- // 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: "Aviso",
- description: "Instância criada, mas houve um problema ao ativar a automação. Entre em contato com o suporte.",
- variant: "destructive",
+ title: "Sucesso!",
+ description: "Instância criada com sucesso. Use o QR Code para conectar.",
});
+
+ onInstanceCreated(instanceData);
+
+ } else {
+ throw new Error('Resposta inválida da API');
}
- // 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);
-
- toast({
- 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);
+ console.error('❌ Erro ao criar instância:', 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);
+ let errorMessage = 'Erro desconhecido ao criar instância';
+ if (error instanceof Error) {
+ errorMessage = error.message;
}
-
+
toast({
- title: "Erro na criação da instância",
- description: "Ocorreu um erro ao conectar com a API. Tente novamente mais tarde.",
+ title: "Erro ao criar instância",
+ description: errorMessage,
variant: "destructive",
});
} finally {
- setLoading(false);
+ setIsCreating(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 (
-
-
- Vincular WhatsApp ao App
-
+
+
+ Conectar WhatsApp
+
- Preencha os campos abaixo para conectar sua conta WhatsApp
+ Conecte uma nova instância do WhatsApp para enviar mensagens automáticas
-
-
-
Nome da Instância
-
-
- O nome da instância será automaticamente seu email de login
-
-
-
-
-
Número do WhatsApp
-
setPhoneNumber(e.target.value)}
- placeholder="559999999999"
- required
- />
-
Digite o número com DDD e código do país
-
-
-
- {loading ? "Criando..." : "Criar Instância"}
-
-
-
-
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 b3cdf06..bb15cc2 100644
--- a/src/components/whatsappGroups/CreateGroupForm.tsx
+++ b/src/components/whatsappGroups/CreateGroupForm.tsx
@@ -1,4 +1,3 @@
-
import { useState, useEffect } from 'react';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card';
@@ -9,6 +8,7 @@ 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,9 +39,11 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => {
setCheckingInstance(true);
try {
- console.log('Verificando instância para:', userEmail);
+ // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase
+ const normalizedEmail = userEmail.trim().toLowerCase();
+ console.log('Verificando instância para:', normalizedEmail);
- const instanceData = await getUserWhatsAppInstance(userEmail);
+ const instanceData = await getUserWhatsAppInstance(normalizedEmail);
console.log('Dados da instância:', instanceData);
if (instanceData) {
@@ -108,6 +110,9 @@ 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
@@ -119,24 +124,32 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => {
// 2. Criar grupo no WhatsApp via API com o nome escolhido pelo usuário
try {
- const groupResponse = await createWhatsAppGroup(userEmail, nomeGrupo.trim());
+ const groupResponse = await createWhatsAppGroup(normalizedEmail, 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 com sucesso no seu WhatsApp!`,
+ description: `Grupo "${nomeGrupo}" criado e automação ativada com sucesso!`,
variant: 'default',
});
- } else {
+ } catch (workflowError) {
+ console.error('Erro ao ativar workflow:', workflowError);
+ // Não falhar o processo todo se o workflow não ativar
toast({
- title: 'Atenção',
- description: 'Grupo cadastrado no sistema, mas não foi possível criar no WhatsApp',
- variant: 'destructive',
+ title: 'Grupo criado!',
+ description: `Grupo "${nomeGrupo}" criado com sucesso. Automação será ativada em breve.`,
+ variant: 'default',
});
}
@@ -261,6 +274,7 @@ 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 0a53d2b..b06bf3b 100644
--- a/src/services/whatsApp/webhookService.ts
+++ b/src/services/whatsApp/webhookService.ts
@@ -6,16 +6,19 @@ import { makeRequest } from './apiHelpers';
*/
export const createEvolutionWebhook = async (userEmail: string): Promise => {
try {
- console.log(`Criando webhook para o usuário: ${userEmail}`);
+ // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase
+ const normalizedEmail = userEmail.trim().toLowerCase();
+
+ console.log(`Criando webhook para o usuário: ${normalizedEmail}`);
// URL do endpoint - mantém o @ normal no email
- const endpoint = `/webhook/set/${userEmail}`;
+ const endpoint = `/webhook/set/${normalizedEmail}`;
// Agora mantemos o email original com @ também na URL do webhook
const webhookBody = {
webhook: {
enabled: true,
- url: `https://webhookn8n.innova1001.com.br/webhook/${userEmail}`,
+ url: `https://webhookn8n.innova1001.com.br/webhook/${normalizedEmail}`,
webhookByEvents: true,
webhookBase64: true,
events: [
@@ -26,17 +29,17 @@ export const createEvolutionWebhook = async (userEmail: string): Promise =>
console.log('Dados do webhook:', {
endpoint,
- emailOriginal: userEmail,
+ emailOriginal: normalizedEmail,
webhookUrl: webhookBody.webhook.url
});
const response = await makeRequest(endpoint, 'POST', webhookBody);
- console.log(`✅ Webhook criado com sucesso para ${userEmail}:`, response);
+ console.log(`✅ Webhook criado com sucesso para ${normalizedEmail}:`, response);
return response;
} catch (error) {
- console.error(`❌ Erro ao criar webhook for ${userEmail}:`, error);
+ console.error(`❌ Erro ao criar webhook for ${normalizedEmail}:`, error);
throw error;
}
};
diff --git a/src/services/whatsAppGroupsService.ts b/src/services/whatsAppGroupsService.ts
index 7789a60..c134cb3 100644
--- a/src/services/whatsAppGroupsService.ts
+++ b/src/services/whatsAppGroupsService.ts
@@ -42,7 +42,7 @@ export async function findOrCreateWhatsAppGroup(nomeGrupo?: string): Promise {
return [];
}
- // Normalizar o email (minúsculo e sem espaços)
+ // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase
const normalizedEmail = userEmail.trim().toLowerCase();
// Buscar grupos associados ao email do usuário
diff --git a/src/services/whatsAppInstance/userOperations.ts b/src/services/whatsAppInstance/userOperations.ts
index 2fb7df7..a36dddf 100644
--- a/src/services/whatsAppInstance/userOperations.ts
+++ b/src/services/whatsAppInstance/userOperations.ts
@@ -1,21 +1,191 @@
-import { getUserWhatsAppInstance } from './databaseOperations';
+import { supabase } from "@/integrations/supabase/client";
/**
- * User-related WhatsApp instance operations
+ * Updates user WhatsApp instance information in the database
*/
+export async function updateUserWhatsAppInstance(
+ userEmail: string,
+ instanceName: string,
+ status: 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 { error: updateError } = await supabase
+ .from('usuarios')
+ .update({
+ instancia_zap: normalizedInstanceName,
+ status_instancia: status,
+ updated_at: new Date().toISOString()
+ })
+ .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
+ const { error: insertError } = await supabase
+ .from('usuarios')
+ .insert({
+ email: normalizedEmail,
+ instancia_zap: normalizedInstanceName,
+ status_instancia: status,
+ created_at: new Date().toISOString(),
+ updated_at: new Date().toISOString()
+ });
+
+ 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;
+ }
+}
/**
- * Checks if user has an active WhatsApp instance
+ * 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,
+ updated_at: new Date().toISOString()
+ })
+ .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
*/
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;
+ // ⚠️ 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() !== '');
} 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 6108e30..cede082 100644
--- a/src/services/whatsAppInstance/workflowOperations.ts
+++ b/src/services/whatsAppInstance/workflowOperations.ts
@@ -5,19 +5,57 @@ 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 {
- console.log(`🔔 Enviando webhook para ativar workflow do usuário: ${userEmail}`);
+ // ⚠️ PADRONIZAÇÃO CRÍTICA: Converter email para lowercase
+ const normalizedEmail = userEmail.trim().toLowerCase();
+
+ console.log(`🔔 Enviando webhook para ativar workflow do usuário: ${normalizedEmail}`);
// 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: userEmail
+ email: normalizedEmail
};
console.log('📦 Dados do webhook:', JSON.stringify(webhookBody, null, 2));