Pular para conteúdo

SUPABASE_GETALL - Buscar Múltiplos Registros no Supabase

O que é este Node?

O SUPABASE_GETALL é o node responsável por buscar múltiplos registros de uma tabela Supabase com suporte a filtros, ordenação e paginação. Ele retorna uma lista de registros que atendem aos critérios especificados.

Por que este Node existe?

Em aplicações reais, raramente buscamos um único registro. Precisamos listar produtos, pedidos, usuários, etc. O SUPABASE_GETALL existe para:

  1. Listar registros: Buscar todos os registros de uma tabela ou um subconjunto filtrado
  2. Filtrar dados: Aplicar condições para retornar apenas registros relevantes (ex: status = 'ativo')
  3. Ordenar resultados: Controlar ordem dos registros (crescente/decrescente por campo)
  4. Paginar dados: Limitar quantidade de registros retornados para melhor performance
  5. Buscar sem ID: Encontrar registros usando outros campos como critério (email, CPF, categoria, etc.)

Como funciona internamente?

Quando o SUPABASE_GETALL é 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. Monta query base: Cria SELECT * FROM tabela
  4. Aplica filtros: Se filters fornecido, adiciona condições WHERE (ex: .eq('status', 'active'))
  5. Aplica ordenação: Se sort fornecido, adiciona ORDER BY campo ASC/DESC
  6. Aplica limite: Se limit fornecido e returnAll = false, adiciona LIMIT
  7. Executa query: Busca registros do Supabase
  8. Retorna resultado: Objeto com array rows (registros) e count (quantidade)
  9. Salva em variável: Armazena resultado na variável especificada

Código interno (supabase.executor.ts:90-124):

private async getAllRows(
  supabase: SupabaseClient,
  table: string,
  filters: Record<string, any>,
  options: any,
  context: ExecutionContext,
): Promise<any> {
  let query = supabase.from(table).select('*');

  if (filters) {
    const replacedFilters = this.replaceObjectVariables(filters, context.variables);
    Object.entries(replacedFilters).forEach(([key, value]) => {
      query = query.eq(key, value);
    });
  }

  if (options.limit && !options.returnAll) {
    query = query.limit(parseInt(options.limit));
  }

  if (options.sort) {
    query = query.order(options.sort.field, { ascending: options.sort.ascending !== false });
  }

  const { data, error } = await query;

  if (error) {
    throw new Error(`Supabase getAll error: ${error.message}`);
  }

  return {
    rows: data,
    count: data.length,
  };
}

Quando você DEVE usar este Node?

Use SUPABASE_GETALL sempre que precisar de buscar múltiplos registros ou buscar sem saber o ID:

Casos de uso

  1. Listar produtos de categoria: "Mostrar todos os produtos da categoria 'eletrônicos'"
  2. Buscar pedidos pendentes: "Listar todos os pedidos com status 'pendente'"
  3. Encontrar usuário por email: "Buscar usuário pelo email informado"
  4. Listar últimos registros: "Mostrar os 10 últimos clientes cadastrados"
  5. Dashboard de relatórios: "Buscar todas as vendas do mês atual"

Quando NÃO usar SUPABASE_GETALL

  • Buscar por ID específico: Use SUPABASE_GETROW que é otimizado para busca por ID
  • Filtros complexos com OR: Use queries SQL customizadas ou RPC functions do Supabase
  • Agregações: Use RPC functions para COUNT, SUM, AVG, etc.

Parâmetros Detalhados

operation (string, obrigatório)

O que é: Tipo da operação Supabase a ser executada. Para este node, sempre deve ser "getAll".

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Supabase GetAll - 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": "Listar Produtos",
        "operation": "getAll",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "products",
        "responseVariable": "produtos"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Mostrar Quantidade",
        "parameters": {
          "message": "Encontrados {{produtos.count}} produtos"
        }
      }
    },
    {
      "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. O sistema deve retornar todos os produtos da tabela.

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 GetAll - 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": "getAll",
        "config": {
          "host": "https://xyzcompany.supabase.co",
          "serviceRole": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
        },
        "table": "customers",
        "responseVariable": "clientes"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Conectado! Total de clientes: {{clientes.count}}"
        }
      }
    },
    {
      "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 a contagem de clientes.

table (string, obrigatório)

O que é: Nome da tabela no Supabase de onde buscar os registros.

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Supabase GetAll - 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": "Listar Pedidos",
        "operation": "getAll",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "orders",
        "responseVariable": "pedidos"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Detalhes",
        "parameters": {
          "message": "Total de pedidos: {{pedidos.count}}"
        }
      }
    },
    {
      "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 listar os registros.

filters (object, opcional)

O que é: Objeto com condições para filtrar registros. Cada chave é um campo da tabela e cada valor é o valor esperado.

Padrão: null (sem filtros, retorna todos os registros)

Flow completo para testar:

{
  "name": "Teste Supabase GetAll - Filters",
  "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 Produtos Ativos",
        "operation": "getAll",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "products",
        "filters": {
          "status": "active",
          "category": "electronics"
        },
        "responseVariable": "produtosAtivos"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Encontrados {{produtosAtivos.count}} produtos ativos de eletrônicos"
        }
      }
    },
    {
      "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: O sistema deve retornar apenas produtos com status='active' e category='electronics'.

limit (number, opcional)

O que é: Quantidade máxima de registros a retornar. Útil para paginação e performance.

Padrão: Sem limite (retorna todos os registros)

Flow completo para testar:

{
  "name": "Teste Supabase GetAll - Limit",
  "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": "Top 5 Produtos",
        "operation": "getAll",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "products",
        "limit": 5,
        "responseVariable": "top5"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Mostrar Quantidade",
        "parameters": {
          "message": "Retornados {{top5.count}} produtos (máximo 5)"
        }
      }
    },
    {
      "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: Mesmo se houver 100 produtos na tabela, deve retornar apenas 5.

returnAll (boolean, opcional)

O que é: Se true, ignora o limit e retorna todos os registros. Se false, respeita o limit.

Padrão: false

Flow completo para testar:

{
  "name": "Teste Supabase GetAll - ReturnAll",
  "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": "Todos os Clientes",
        "operation": "getAll",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "customers",
        "limit": 10,
        "returnAll": true,
        "responseVariable": "todosClientes"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Total",
        "parameters": {
          "message": "Total de clientes: {{todosClientes.count}} (limit ignorado)"
        }
      }
    },
    {
      "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: Mesmo com limit=10, se returnAll=true, deve retornar todos os clientes.

sort (object, opcional)

O que é: Objeto para ordenar resultados. Contém field (campo para ordenar) e ascending (true=crescente, false=decrescente).

Padrão: Sem ordenação específica

Flow completo para testar:

{
  "name": "Teste Supabase GetAll - Sort",
  "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": "Produtos por Preço",
        "operation": "getAll",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "products",
        "sort": {
          "field": "price",
          "ascending": false
        },
        "limit": 3,
        "responseVariable": "produtosCaros"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Mostrar Top 3",
        "parameters": {
          "message": "Top 3 produtos mais caros:\n1. {{produtosCaros.rows[0].name}} - R$ {{produtosCaros.rows[0].price}}\n2. {{produtosCaros.rows[1].name}} - R$ {{produtosCaros.rows[1].price}}\n3. {{produtosCaros.rows[2].name}} - R$ {{produtosCaros.rows[2].price}}"
        }
      }
    },
    {
      "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: Deve retornar os 3 produtos com maior preço (ordem decrescente).

responseVariable (string, obrigatório)

O que é: Nome da variável onde os registros serão armazenados. Estrutura: {rows: [], count: number}.

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Supabase GetAll - 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": "Listar Pedidos",
        "operation": "getAll",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "orders",
        "filters": {
          "status": "pending"
        },
        "responseVariable": "pedidosPendentes"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Total",
        "parameters": {
          "message": "Você tem {{pedidosPendentes.count}} pedidos pendentes"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Primeiro Pedido",
        "parameters": {
          "message": "Próximo pedido: #{{pedidosPendentes.rows[0].order_number}}"
        }
      }
    },
    {
      "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: A variável pedidosPendentes deve estar acessível em múltiplos nodes com .count e .rows[index].

Parâmetros

Campo Tipo Obrigatório Descrição
operation string Sim Tipo de operação: "getAll"
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
filters object Não Filtros para busca (campo: valor)
limit number Não Limite de registros a retornar
returnAll boolean Não Se true, ignora limit (padrão: false)
sort object Não Ordenação:
responseVariable string Sim Nome da variável para armazenar resultado

Exemplo 1: Buscar Usuário por Email (Login)

Objetivo: Encontrar usuário pelo email para validar login.

JSON para Importar

{
  "name": "Login com Supabase GetAll",
  "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": "Boas-vindas",
        "parameters": {
          "message": "Bem-vindo ao sistema! Vamos fazer seu login."
        }
      }
    },
    {
      "id": "email_1",
      "type": "email",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Pedir Email",
        "parameters": {
          "message": "Por favor, digite seu email:",
          "variableName": "userEmail"
        }
      }
    },
    {
      "id": "supabase_1",
      "type": "supabase",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Buscar Usuário",
        "operation": "getAll",
        "config": {
          "host": "https://myapp.supabase.co",
          "serviceRole": "your-service-role-key"
        },
        "table": "users",
        "filters": {
          "email": "{{userEmail}}"
        },
        "responseVariable": "foundUsers"
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Usuário Existe?",
        "parameters": {
          "variable": "{{foundUsers.count}}",
          "operator": "greater_than",
          "value": "0"
        }
      }
    },
    {
      "id": "message_yes",
      "type": "message",
      "position": { "x": 1100, "y": 50 },
      "data": {
        "label": "Login OK",
        "parameters": {
          "message": "Bem-vindo de volta, {{foundUsers.rows[0].name}}!"
        }
      }
    },
    {
      "id": "message_no",
      "type": "message",
      "position": { "x": 1100, "y": 150 },
      "data": {
        "label": "Não Encontrado",
        "parameters": {
          "message": "Email não encontrado. Por favor, cadastre-se primeiro."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "email_1" },
    { "source": "email_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 (usuário existe):

Sistema: Bem-vindo ao sistema! Vamos fazer seu login.
Sistema: Por favor, digite seu email:
Usuário: joao@example.com
Sistema: Bem-vindo de volta, João Silva!

Saída esperada (usuário não existe):

Sistema: Bem-vindo ao sistema! Vamos fazer seu login.
Sistema: Por favor, digite seu email:
Usuário: novousuario@example.com
Sistema: Email não encontrado. Por favor, cadastre-se primeiro.

Exemplo 2: Listar Produtos por Categoria com Ordenação

Objetivo: Permitir que usuário consulte produtos de uma categoria ordenados por preço.

JSON para Importar

{
  "name": "Catálogo de Produtos - Supabase GetAll",
  "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": "Olá! Veja nossos produtos por categoria."
        }
      }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Escolher Categoria",
        "parameters": {
          "message": "Digite a categoria desejada (ex: livros, eletrônicos, roupas):",
          "variableName": "categoria"
        }
      }
    },
    {
      "id": "supabase_1",
      "type": "supabase",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Buscar Produtos",
        "operation": "getAll",
        "config": {
          "host": "https://loja.supabase.co",
          "serviceRole": "service-role-key"
        },
        "table": "products",
        "filters": {
          "category": "{{categoria}}",
          "available": true
        },
        "sort": {
          "field": "price",
          "ascending": true
        },
        "limit": 5,
        "responseVariable": "produtosCategoria"
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Tem Produtos?",
        "parameters": {
          "variable": "{{produtosCategoria.count}}",
          "operator": "greater_than",
          "value": "0"
        }
      }
    },
    {
      "id": "message_produtos",
      "type": "message",
      "position": { "x": 1100, "y": 50 },
      "data": {
        "label": "Listar",
        "parameters": {
          "message": "Top 5 produtos de {{categoria}} (mais baratos):\n\n1. {{produtosCategoria.rows[0].name}} - R$ {{produtosCategoria.rows[0].price}}\n2. {{produtosCategoria.rows[1].name}} - R$ {{produtosCategoria.rows[1].price}}\n3. {{produtosCategoria.rows[2].name}} - R$ {{produtosCategoria.rows[2].price}}"
        }
      }
    },
    {
      "id": "message_vazio",
      "type": "message",
      "position": { "x": 1100, "y": 150 },
      "data": {
        "label": "Sem Produtos",
        "parameters": {
          "message": "Desculpe, não temos produtos disponíveis nesta categoria."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "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": "condition_1" },
    { "source": "condition_1", "target": "message_produtos", "label": "yes" },
    { "source": "condition_1", "target": "message_vazio", "label": "no" },
    { "source": "message_produtos", "target": "end_1" },
    { "source": "message_vazio", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Olá! Veja nossos produtos por categoria.
Sistema: Digite a categoria desejada (ex: livros, eletrônicos, roupas):
Usuário: eletrônicos
Sistema: Top 5 produtos de eletrônicos (mais baratos):

1. Mouse USB - R$ 25.90
2. Teclado Gamer - R$ 89.90
3. Webcam HD - R$ 159.90

Exemplo 3: Dashboard de Pedidos Pendentes

Objetivo: Mostrar lista de pedidos pendentes ordenados por data para equipe de atendimento.

JSON para Importar

{
  "name": "Dashboard Pedidos Pendentes - Supabase GetAll",
  "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": "Header",
        "parameters": {
          "message": "Dashboard de Atendimento - Pedidos Pendentes"
        }
      }
    },
    {
      "id": "supabase_1",
      "type": "supabase",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar Pendentes",
        "operation": "getAll",
        "config": {
          "host": "https://empresa.supabase.co",
          "serviceRole": "service-role-key"
        },
        "table": "orders",
        "filters": {
          "status": "pending"
        },
        "sort": {
          "field": "created_at",
          "ascending": true
        },
        "limit": 10,
        "responseVariable": "pedidosPendentes"
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Resumo",
        "parameters": {
          "message": "Total de pedidos pendentes: {{pedidosPendentes.count}}\n\nPróximos 10 pedidos (mais antigos):"
        }
      }
    },
    {
      "id": "message_3",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Lista",
        "parameters": {
          "message": "1. Pedido #{{pedidosPendentes.rows[0].order_number}} - Cliente: {{pedidosPendentes.rows[0].customer_name}} - R$ {{pedidosPendentes.rows[0].total}}\n\n2. Pedido #{{pedidosPendentes.rows[1].order_number}} - Cliente: {{pedidosPendentes.rows[1].customer_name}} - R$ {{pedidosPendentes.rows[1].total}}\n\n3. Pedido #{{pedidosPendentes.rows[2].order_number}} - Cliente: {{pedidosPendentes.rows[2].customer_name}} - R$ {{pedidosPendentes.rows[2].total}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "supabase_1" },
    { "source": "supabase_1", "target": "message_2" },
    { "source": "message_2", "target": "message_3" },
    { "source": "message_3", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Dashboard de Atendimento - Pedidos Pendentes
Sistema: Total de pedidos pendentes: 23

Próximos 10 pedidos (mais antigos):
Sistema: 1. Pedido #ORD-001 - Cliente: Maria Santos - R$ 259.90

2. Pedido #ORD-003 - Cliente: João Silva - R$ 89.50

3. Pedido #ORD-005 - Cliente: Ana Costa - R$ 1.250.00

Resposta do Node

{
  "rows": [
    {
      "id": "uuid-1",
      "name": "Produto 1",
      "price": 99.90,
      "category": "electronics",
      "available": true,
      "created_at": "2025-01-10T10:00:00.000Z"
    },
    {
      "id": "uuid-2",
      "name": "Produto 2",
      "price": 149.90,
      "category": "electronics",
      "available": true,
      "created_at": "2025-01-11T14:30:00.000Z"
    }
  ],
  "count": 2
}

Boas Práticas

SIM:

  • Use filters para reduzir quantidade de dados retornados
  • Use limit para melhorar performance em tabelas grandes
  • Use sort para ordenar resultados de forma consistente
  • Combine múltiplos filtros para buscas mais específicas
  • Verifique count antes de acessar rows[0] para evitar erros
  • Use variáveis dinâmicas nos filtros ({{categoria}})

NÃO:

  • Não busque todos os registros sem necessidade (use limit)
  • Não assuma que rows[0] existe sem verificar count
  • Não use getAll quando souber o ID (use getRow)
  • Não faça filtros complexos com getAll (use RPC functions)
  • Não exponha Service Role Key em código front-end

Dicas

💡 Dica 1: A estrutura do resultado sempre tem rows (array) e count (número). Acesse registros com {{variavel.rows[0].campo}}.

💡 Dica 2: Filtros atualmente suportam apenas operador = (igualdade). Para filtros mais complexos (>, <, LIKE, IN), use RPC functions do Supabase.

💡 Dica 3: Use returnAll: false e limit para implementar paginação. Para próxima página, use offset (adicione parâmetro customizado no futuro).

💡 Dica 4: Ordene por campos com índice no banco para melhor performance. Campos como created_at, id, price geralmente têm índices.

💡 Dica 5: Para buscar por múltiplos valores do mesmo campo (ex: categorias), faça múltiplas chamadas getAll ou use RPC function.

Próximos Nodes

SUPABASE_GETROW - Buscar registro específico por ID → SUPABASE_INSERT - Inserir novo registro na tabela → SUPABASE_UPDATE - Atualizar registros existentes → SUPABASE_DELETE - Deletar registros da tabela