Pular para conteúdo

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:

  1. Buscar informações completas: Retorna todos os campos de um registro específico para exibição ou processamento
  2. Validar existência: Verifica se um registro existe antes de realizar outras operações
  3. Carregar dados do contexto: Busca informações adicionais baseadas em IDs armazenados em variáveis
  4. 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:

  1. Valida configuração: Verifica se host e serviceRole do Supabase estão configurados
  2. Cria cliente: Inicializa conexão com Supabase usando credenciais fornecidas
  3. Substitui variáveis: Processa o rowId substituindo variáveis do contexto (ex: {{userId}})
  4. Executa query: Faz SELECT na tabela especificada filtrando por id = rowId
  5. Se não encontrado: Retorna erro indicando que o registro não existe
  6. Se encontrado: Retorna objeto com todos os campos do registro
  7. 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

  1. Buscar perfil de usuário: "Carregar informações do usuário logado para personalizar atendimento"
  2. Detalhar pedido: "Buscar todos os dados de um pedido específico para enviar confirmação"
  3. Validar acesso: "Verificar se usuário tem permissão antes de executar ação"
  4. 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