SUPABASE_GETROW - Buscar Registro Específico no Supabase
O que é este Node?
O SUPABASE_GETROW é o node responsável por buscar um registro específico de uma tabela Supabase usando o ID do registro. Ele retorna todos os campos do registro encontrado.
Por que este Node existe?
No desenvolvimento de aplicações modernas, é comum precisar buscar informações específicas de um usuário, pedido, produto ou qualquer outro registro. O SUPABASE_GETROW existe para:
- Buscar informações completas: Retorna todos os campos de um registro específico para exibição ou processamento
- Validar existência: Verifica se um registro existe antes de realizar outras operações
- Carregar dados do contexto: Busca informações adicionais baseadas em IDs armazenados em variáveis
- Integração com fluxos: Permite que fluxos de conversação acessem dados do banco para personalização
Como funciona internamente?
Quando o SUPABASE_GETROW é executado, o sistema:
- Valida configuração: Verifica se host e serviceRole do Supabase estão configurados
- Cria cliente: Inicializa conexão com Supabase usando credenciais fornecidas
- Substitui variáveis: Processa o rowId substituindo variáveis do contexto (ex:
{{userId}}) - Executa query: Faz SELECT na tabela especificada filtrando por id = rowId
- Se não encontrado: Retorna erro indicando que o registro não existe
- Se encontrado: Retorna objeto com todos os campos do registro
- Salva em variável: Armazena resultado na variável especificada em responseVariable
Código interno (supabase.executor.ts:69-88):
private async getRow(
supabase: SupabaseClient,
table: string,
rowId: string,
context: ExecutionContext,
): Promise<any> {
const replacedId = this.replaceVariables(rowId, context.variables);
const { data, error } = await supabase
.from(table)
.select('*')
.eq('id', replacedId)
.single();
if (error) {
throw new Error(`Supabase getRow error: ${error.message}`);
}
return data;
}
Quando você DEVE usar este Node?
Use SUPABASE_GETROW sempre que precisar de buscar um registro específico conhecendo seu ID:
Casos de uso
- Buscar perfil de usuário: "Carregar informações do usuário logado para personalizar atendimento"
- Detalhar pedido: "Buscar todos os dados de um pedido específico para enviar confirmação"
- Validar acesso: "Verificar se usuário tem permissão antes de executar ação"
- Carregar configurações: "Buscar preferências do cliente para customizar fluxo"
Quando NÃO usar SUPABASE_GETROW
- Buscar múltiplos registros: Use SUPABASE_GETALL para listar vários registros
- Buscar sem saber ID: Use SUPABASE_GETALL com filtros para buscar por outros campos
- Buscar com filtros complexos: Use SUPABASE_GETALL que suporta múltiplos filtros
Parâmetros Detalhados
operation (string, obrigatório)
O que é: Tipo da operação Supabase a ser executada. Para este node, sempre deve ser "getRow".
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase GetRow - Operation",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Usuário",
"operation": "getRow",
"config": {
"host": "https://seu-projeto.supabase.co",
"serviceRole": "sua-service-role-key"
},
"table": "users",
"rowId": "123e4567-e89b-12d3-a456-426614174000",
"responseVariable": "usuario"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Resultado",
"parameters": {
"message": "Usuário encontrado: {{usuario.name}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Configure suas credenciais Supabase e um ID válido. O sistema deve retornar os dados do usuário e exibir o nome.
config (object, obrigatório)
O que é: Objeto contendo as credenciais de conexão com Supabase (host e serviceRole).
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase GetRow - Config",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Testar Conexão",
"operation": "getRow",
"config": {
"host": "https://xyzcompany.supabase.co",
"serviceRole": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
"table": "customers",
"rowId": "1",
"responseVariable": "cliente"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Conectado! Cliente: {{cliente.email}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Use suas credenciais reais do Supabase. Se a configuração estiver correta, deve retornar os dados do cliente.
table (string, obrigatório)
O que é: Nome da tabela no Supabase de onde buscar o registro.
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase GetRow - Table",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Pedido",
"operation": "getRow",
"config": {
"host": "https://seu-projeto.supabase.co",
"serviceRole": "sua-service-role-key"
},
"table": "orders",
"rowId": "ORD-12345",
"responseVariable": "pedido"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Detalhes",
"parameters": {
"message": "Pedido #{{pedido.order_number}} - Status: {{pedido.status}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Use uma tabela existente no seu banco Supabase. O sistema deve buscar o registro especificado.
rowId (string, obrigatório)
O que é: ID do registro que você deseja buscar. Aceita variáveis (ex: {{userId}}).
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase GetRow - RowId Dinâmico",
"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": "Pedir ID",
"parameters": {
"message": "Digite o ID do produto que deseja consultar:",
"variableName": "produtoId"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar Produto",
"operation": "getRow",
"config": {
"host": "https://seu-projeto.supabase.co",
"serviceRole": "sua-service-role-key"
},
"table": "products",
"rowId": "{{produtoId}}",
"responseVariable": "produto"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar Produto",
"parameters": {
"message": "Produto: {{produto.name}}\nPreço: R$ {{produto.price}}\nEstoque: {{produto.stock}}"
}
}
},
{
"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" }
]
}
Teste: Digite um ID de produto válido. O sistema deve buscar e exibir as informações do produto.
responseVariable (string, obrigatório)
O que é: Nome da variável onde os dados do registro serão armazenados para uso posterior no fluxo.
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase GetRow - ResponseVariable",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Usuário",
"operation": "getRow",
"config": {
"host": "https://seu-projeto.supabase.co",
"serviceRole": "sua-service-role-key"
},
"table": "users",
"rowId": "12345",
"responseVariable": "dadosUsuario"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Saudação",
"parameters": {
"message": "Olá {{dadosUsuario.name}}! Bem-vindo de volta."
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Info Adicional",
"parameters": {
"message": "Seu último acesso foi em {{dadosUsuario.last_login}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Teste: O registro buscado deve ser armazenado em dadosUsuario e acessível em múltiplos nodes subsequentes.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Tipo de operação: "getRow" |
| config | object | Sim | Credenciais Supabase (host, serviceRole) |
| config.host | string | Sim | URL do projeto Supabase |
| config.serviceRole | string | Sim | Service Role Key do Supabase |
| table | string | Sim | Nome da tabela |
| rowId | string | Sim | ID do registro a buscar |
| responseVariable | string | Sim | Nome da variável para armazenar resultado |
Exemplo 1: Buscar Perfil de Cliente para Atendimento
Objetivo: Carregar dados do cliente no início do atendimento para personalizar o fluxo.
JSON para Importar
{
"name": "Atendimento Personalizado com Supabase",
"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": "Pedir CPF",
"parameters": {
"message": "Para iniciar o atendimento, por favor informe seu CPF:",
"variableName": "cpf"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar Cliente",
"operation": "getRow",
"config": {
"host": "https://empresa.supabase.co",
"serviceRole": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
"table": "customers",
"rowId": "{{cpf}}",
"responseVariable": "cliente"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Boas-vindas",
"parameters": {
"message": "Olá {{cliente.name}}! Como posso ajudá-lo(a) hoje?\n\nSeu plano atual: {{cliente.plan}}\nStatus: {{cliente.status}}"
}
}
},
{
"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" }
]
}
Saída esperada:
Sistema: Para iniciar o atendimento, por favor informe seu CPF:
Usuário: 12345678900
Sistema: Olá João Silva! Como posso ajudá-lo(a) hoje?
Seu plano atual: Premium
Status: Ativo
Exemplo 2: Validar Acesso a Recurso
Objetivo: Verificar se usuário tem permissão para acessar recurso específico antes de continuar fluxo.
JSON para Importar
{
"name": "Validação de Acesso com Supabase",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Definir User ID",
"parameters": {
"name": "currentUserId",
"value": "usr_123456"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar Usuário",
"operation": "getRow",
"config": {
"host": "https://app.supabase.co",
"serviceRole": "your-service-role-key"
},
"table": "users",
"rowId": "{{currentUserId}}",
"responseVariable": "user"
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Verificar Permissão",
"parameters": {
"variable": "{{user.role}}",
"operator": "equals",
"value": "admin"
}
}
},
{
"id": "message_yes",
"type": "message",
"position": { "x": 900, "y": 50 },
"data": {
"label": "Acesso Permitido",
"parameters": {
"message": "Bem-vindo ao painel administrativo, {{user.name}}!"
}
}
},
{
"id": "message_no",
"type": "message",
"position": { "x": 900, "y": 150 },
"data": {
"label": "Acesso Negado",
"parameters": {
"message": "Desculpe, você não tem permissão para acessar esta área."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "condition_1" },
{ "source": "condition_1", "target": "message_yes", "label": "yes" },
{ "source": "condition_1", "target": "message_no", "label": "no" },
{ "source": "message_yes", "target": "end_1" },
{ "source": "message_no", "target": "end_1" }
]
}
Saída esperada (admin):
Sistema: Bem-vindo ao painel administrativo, Maria Santos!
Saída esperada (não admin):
Sistema: Desculpe, você não tem permissão para acessar esta área.
Exemplo 3: Buscar Detalhes de Pedido
Objetivo: Permitir que cliente consulte status de pedido informando número do pedido.
JSON para Importar
{
"name": "Consulta de Pedido - Supabase GetRow",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Menu",
"parameters": {
"message": "Bem-vindo ao sistema de rastreamento de pedidos!"
}
}
},
{
"id": "input_1",
"type": "input",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Pedir Número",
"parameters": {
"message": "Digite o número do seu pedido:",
"variableName": "orderNumber"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Buscar Pedido",
"operation": "getRow",
"config": {
"host": "https://ecommerce.supabase.co",
"serviceRole": "service-role-key-here"
},
"table": "orders",
"rowId": "{{orderNumber}}",
"responseVariable": "order"
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Detalhes Pedido",
"parameters": {
"message": "Pedido #{{order.order_number}}\n\nStatus: {{order.status}}\nValor Total: R$ {{order.total_amount}}\nData: {{order.created_at}}\nPrevisão de Entrega: {{order.delivery_date}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "input_1" },
{ "source": "input_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: Bem-vindo ao sistema de rastreamento de pedidos!
Sistema: Digite o número do seu pedido:
Usuário: ORD-98765
Sistema: Pedido #ORD-98765
Status: Em trânsito
Valor Total: R$ 299.90
Data: 2025-01-10
Previsão de Entrega: 2025-01-15
Resposta do Node
{
"id": "uuid-do-registro",
"name": "João Silva",
"email": "joao@example.com",
"phone": "+5511999999999",
"created_at": "2025-01-15T10:30:00.000Z",
"updated_at": "2025-01-15T10:30:00.000Z",
"status": "active",
"role": "customer"
}
Boas Práticas
✅ SIM:
- Use variáveis para IDs dinâmicos (
{{userId}}) - Armazene resultado em variável descritiva (
cliente,pedido,produto) - Valide existência do registro antes de acessar campos
- Use try-catch em fluxos críticos para tratar erros
- Configure credenciais Supabase em variáveis de ambiente
❌ NÃO:
- Não use IDs hardcoded quando o valor deve ser dinâmico
- Não exponha Service Role Key em código front-end
- Não assuma que registro sempre existirá (trate erros)
- Não faça getRow em loop para buscar múltiplos registros (use getAll)
Dicas
💡 Dica 1: Use responseVariable com nomes descritivos. Em vez de data, use cliente, pedido, usuario para facilitar leitura do fluxo.
💡 Dica 2: O ID buscado deve corresponder ao campo id da tabela. Se sua tabela usa outro campo como chave primária, use SUPABASE_GETALL com filtro.
💡 Dica 3: Supabase retorna erro se registro não existir. Adicione node CONDITION após getRow para verificar se retornou dados antes de continuar.
💡 Dica 4: Para melhor segurança, use Row Level Security (RLS) no Supabase mesmo usando Service Role Key, definindo políticas de acesso por tabela.
Próximos Nodes
→ SUPABASE_GETALL - Buscar múltiplos registros com filtros → SUPABASE_INSERT - Inserir novo registro na tabela → SUPABASE_UPDATE - Atualizar registro existente → SUPABASE_DELETE - Deletar registro da tabela