Supabase Integration - Lumina Flow Builder
Visão Geral
O Supabase é uma plataforma open-source que fornece backend completo como serviço (BaaS), incluindo banco de dados PostgreSQL, autenticação, storage e muito mais. A integração Supabase no Lumina Flow Builder permite que você conecte seus fluxos de conversação diretamente com bancos de dados Supabase para criar, ler, atualizar e deletar dados em tempo real.
Por que usar Supabase no Flow Builder?
- Persistência de Dados: Salve informações coletadas em conversas diretamente no banco
- Consultas em Tempo Real: Busque dados atualizados para personalizar fluxos
- CRUD Completo: Operações completas de Create, Read, Update, Delete
- PostgreSQL Completo: Aproveite todo poder de um banco relacional robusto
- Escalabilidade: Supabase escala automaticamente conforme demanda
- Sem Servidor: Não precisa gerenciar infraestrutura de banco
Operações Disponíveis
A integração Supabase oferece 5 operações fundamentais:
1. GETROW - Buscar Registro Específico
Busca um único registro pelo ID.
Quando usar: - Carregar perfil de usuário específico - Buscar detalhes de um pedido conhecido - Validar se registro existe antes de operação
Exemplo:
{
"operation": "getRow",
"table": "users",
"rowId": "{{userId}}",
"responseVariable": "usuario"
}
2. GETALL - Buscar Múltiplos Registros
Busca lista de registros com filtros, ordenação e paginação.
Quando usar: - Listar produtos de uma categoria - Buscar pedidos pendentes - Encontrar usuário por email - Criar dashboards e relatórios
Exemplo:
{
"operation": "getAll",
"table": "products",
"filters": {
"category": "electronics",
"available": true
},
"sort": {
"field": "price",
"ascending": true
},
"limit": 10,
"responseVariable": "produtos"
}
3. INSERT - Inserir Novo Registro
Cria um novo registro na tabela.
Quando usar: - Cadastrar novo usuário - Criar pedido - Salvar feedback do cliente - Registrar log de interação
Exemplo:
{
"operation": "insert",
"table": "customers",
"row": {
"name": "{{nome}}",
"email": "{{email}}",
"phone": "{{telefone}}"
},
"responseVariable": "clienteCriado"
}
4. UPDATE - Atualizar Registro Existente
Modifica campos de um registro específico.
Quando usar: - Atualizar status de pedido - Editar perfil de usuário - Incrementar contadores - Registrar última atividade
Exemplo:
{
"operation": "update",
"table": "orders",
"rowId": "{{orderId}}",
"updates": {
"status": "shipped",
"shipped_at": "{{_timestamp}}"
},
"responseVariable": "pedidoAtualizado"
}
5. DELETE - Deletar Registro
Remove permanentemente um registro da tabela.
Quando usar: - Cancelar agendamento - Excluir conta (LGPD/GDPR) - Limpar logs antigos - Remover dados temporários
Exemplo:
{
"operation": "delete",
"table": "appointments",
"rowId": "{{appointmentId}}",
"responseVariable": "resultado"
}
Configuração Inicial
1. Obter Credenciais do Supabase
- Acesse https://supabase.com
- Crie um projeto ou selecione existente
- Vá em Settings → API
- Copie:
- URL (Project URL)
- Service Role Key (service_role secret)
⚠️ IMPORTANTE: Nunca exponha Service Role Key em código front-end!
2. Configurar Node no Flow
Todo node Supabase requer configuração básica:
{
"type": "supabase",
"data": {
"operation": "getRow|getAll|insert|update|delete",
"config": {
"host": "https://seu-projeto.supabase.co",
"serviceRole": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
"table": "nome_da_tabela",
"responseVariable": "nomeVariavel"
}
}
3. Estrutura do Banco
Certifique-se que suas tabelas no Supabase:
- Têm campo
idcomo chave primária (UUID recomendado) - Têm campos
created_ateupdated_at(timestamp) - Têm Row Level Security (RLS) configurado conforme necessidade
- Têm índices em campos frequentemente filtrados/ordenados
Fluxos de Exemplo Completos
Exemplo 1: Cadastro de Lead Completo
Flow que coleta dados e salva lead no Supabase:
{
"name": "Cadastro de Lead",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Nome",
"parameters": {
"message": "Qual seu nome?",
"variableName": "nome"
}
}
},
{
"id": "email_1",
"type": "email",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Email",
"parameters": {
"message": "Qual seu email?",
"variableName": "email"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Salvar Lead",
"operation": "insert",
"config": {
"host": "https://projeto.supabase.co",
"serviceRole": "sua-key"
},
"table": "leads",
"row": {
"name": "{{nome}}",
"email": "{{email}}",
"source": "whatsapp",
"created_at": "{{_timestamp}}"
},
"responseVariable": "lead"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Confirmação",
"parameters": {
"message": "Cadastro realizado! ID: {{lead.id}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "email_1" },
{ "source": "email_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Exemplo 2: Consulta de Pedido
Flow que busca e exibe status de pedido:
{
"name": "Consultar Pedido",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Número Pedido",
"parameters": {
"message": "Digite o número do pedido:",
"variableName": "orderNumber"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar Pedido",
"operation": "getRow",
"config": {
"host": "https://projeto.supabase.co",
"serviceRole": "sua-key"
},
"table": "orders",
"rowId": "{{orderNumber}}",
"responseVariable": "pedido"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Status",
"parameters": {
"message": "Pedido #{{pedido.order_number}}\n\nStatus: {{pedido.status}}\nValor: R$ {{pedido.total}}\nPrevisão: {{pedido.delivery_date}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Exemplo 3: Atualizar Status com Switch
Flow que permite escolher novo status de pedido:
{
"name": "Atualizar Status",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "ID Pedido",
"parameters": {
"message": "ID do pedido:",
"variableName": "orderId"
}
}
},
{
"id": "switch_1",
"type": "switch",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Escolher Status",
"parameters": {
"message": "Novo status:\n1-Confirmado\n2-Enviado\n3-Entregue",
"variableName": "opcao",
"cases": {
"1": "confirmed",
"2": "shipped",
"3": "delivered"
}
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Atualizar",
"operation": "update",
"config": {
"host": "https://projeto.supabase.co",
"serviceRole": "sua-key"
},
"table": "orders",
"rowId": "{{orderId}}",
"updates": {
"status": "{{opcao}}",
"updated_at": "{{_timestamp}}"
},
"responseVariable": "pedido"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Confirmação",
"parameters": {
"message": "Pedido atualizado para: {{pedido.status}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "switch_1" },
{ "source": "switch_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Variáveis Especiais do Sistema
O Flow Builder oferece variáveis especiais que podem ser usadas em operações Supabase:
| Variável | Descrição | Exemplo |
|---|---|---|
{{_from}} |
Telefone do usuário | +5511999999999 |
{{_timestamp}} |
Timestamp atual | 2025-01-15T10:30:00.000Z |
{{_flowId}} |
ID do fluxo sendo executado | flow-12345 |
{{_userId}} |
ID do usuário (se autenticado) | user-67890 |
Exemplo de uso:
{
"row": {
"customer_phone": "{{_from}}",
"created_at": "{{_timestamp}}",
"flow_source": "{{_flowId}}"
}
}
Tratamento de Erros
Erros Comuns
- "Supabase configuration (host and serviceRole) is required"
-
Solução: Verifique se config.host e config.serviceRole estão preenchidos
-
"Supabase getRow error: Row not found"
-
Solução: ID fornecido não existe na tabela. Verifique o rowId
-
"Supabase insert error: Duplicate key value violates unique constraint"
-
Solução: Registro com campo único (ex: email) já existe. Verifique antes de inserir
-
"Supabase update error: Row not found"
-
Solução: Tente buscar registro antes de atualizar para confirmar existência
-
"Supabase delete error: violates foreign key constraint"
- Solução: Registro tem dependências. Delete registros dependentes primeiro
Boas Práticas de Tratamento
{
"nodes": [
{
"id": "supabase_1",
"type": "supabase",
"data": {
"operation": "getRow",
"table": "users",
"rowId": "{{userId}}",
"responseVariable": "user"
}
},
{
"id": "condition_1",
"type": "condition",
"data": {
"parameters": {
"variable": "{{user}}",
"operator": "is_defined"
}
}
},
{
"id": "message_success",
"type": "message",
"data": {
"parameters": {
"message": "Usuário encontrado: {{user.name}}"
}
}
},
{
"id": "message_error",
"type": "message",
"data": {
"parameters": {
"message": "Usuário não encontrado. Verifique o ID."
}
}
}
]
}
Segurança e Boas Práticas
✅ SEMPRE FAÇA
- Use Service Role Key apenas no backend: Nunca exponha em código front-end
- Configure Row Level Security (RLS): Proteja dados mesmo com Service Role
- Valide dados antes de inserir: Use nodes de validação (EMAIL, PHONE, NUMBER)
- Use variáveis para dados dinâmicos: Evite valores hardcoded
- Implemente confirmação para delete: Sempre peça confirmação antes de deletar
- Registre operações críticas: Salve logs de alterações importantes
- Use soft delete quando possível: Marque como deletado ao invés de remover
❌ NUNCA FAÇA
- Expor credenciais: Nunca commite Service Role Key no código
- Delete sem confirmação: Sempre valide antes de operações destrutivas
- Assume sucesso: Sempre trate possíveis erros
- Ignore relações: Verifique dependências antes de deletar
- Use em loop sem delay: Adicione DELAY para evitar rate limiting
- Hardcode IDs: Use variáveis para valores dinâmicos
Performance e Otimização
Índices no Banco
Crie índices em campos frequentemente usados:
-- Índice para busca por email
CREATE INDEX idx_users_email ON users(email);
-- Índice para busca por status
CREATE INDEX idx_orders_status ON orders(status);
-- Índice composto para filtros múltiplos
CREATE INDEX idx_products_category_price ON products(category, price);
Paginação
Para tabelas grandes, use limit:
{
"operation": "getAll",
"table": "logs",
"limit": 50,
"sort": {
"field": "created_at",
"ascending": false
}
}
Cache
Para dados que mudam pouco, considere cachear resultados:
{
"nodes": [
{
"id": "variable_check",
"type": "condition",
"data": {
"parameters": {
"variable": "{{cachedProducts}}",
"operator": "is_defined"
}
}
},
{
"id": "supabase_fetch",
"type": "supabase",
"data": {
"operation": "getAll",
"table": "products",
"responseVariable": "cachedProducts"
}
}
]
}
Recursos Adicionais
Documentação
- Documentação GETROW - Buscar registro específico
- Documentação GETALL - Buscar múltiplos registros
- Documentação INSERT - Inserir novo registro
- Documentação UPDATE - Atualizar registro existente
- Documentação DELETE - Deletar registro
Links Úteis
Suporte
Caso tenha dúvidas sobre a integração Supabase:
- Consulte a documentação específica de cada operação
- Verifique os exemplos completos em cada arquivo
- Teste flows no ambiente de desenvolvimento primeiro
- Use logs para debugar operações
Última atualização: 2025-01-15 Versão da integração: 1.0.0 Status: ✅ Produção