Pular para conteúdo

SUPABASE_DELETE - Deletar Registro no Supabase

O que é este Node?

O SUPABASE_DELETE é o node responsável por deletar um registro específico de uma tabela Supabase usando o ID do registro. Ele remove permanentemente o registro do banco de dados.

Por que este Node existe?

Remover dados é uma operação crítica em aplicações. O SUPABASE_DELETE existe para:

  1. Remover registros obsoletos: Deletar dados que não são mais necessários
  2. Cancelar operações: Remover pedidos cancelados, agendamentos não confirmados, etc.
  3. LGPD/GDPR compliance: Permitir que usuários excluam seus dados pessoais
  4. Limpar dados temporários: Remover logs antigos, sessões expiradas, cache
  5. Desfazer operações: Permitir que usuários cancelem ações recém-criadas

Como funciona internamente?

Quando o SUPABASE_DELETE é 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 rowId substituindo variáveis do contexto (ex: {{registroId}})
  4. Executa DELETE: Remove registro da tabela WHERE id = rowId
  5. Se não encontrado: Retorna erro indicando que registro não existe
  6. Se sucesso: Retorna confirmação com ID do registro deletado
  7. Salva em variável: Armazena resultado da operação na variável especificada

Código interno (supabase.executor.ts:171-189):

private async deleteRow(
  supabase: SupabaseClient,
  table: string,
  rowId: string,
  context: ExecutionContext,
): Promise<any> {
  const replacedId = this.replaceVariables(rowId, context.variables);

  const { error } = await supabase
    .from(table)
    .delete()
    .eq('id', replacedId);

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

  return { deleted: true, rowId: replacedId };
}

Quando você DEVE usar este Node?

Use SUPABASE_DELETE sempre que precisar de remover permanentemente um registro:

Casos de uso

  1. Cancelar pedido: "Remover pedido não pago após timeout"
  2. Excluir conta: "Deletar todos os dados do usuário que solicitou exclusão"
  3. Limpar logs antigos: "Remover logs com mais de 30 dias"
  4. Remover agendamento: "Deletar compromisso cancelado pelo cliente"
  5. Desfazer cadastro duplicado: "Remover registro criado por engano"

Quando NÃO usar SUPABASE_DELETE

  • Arquivar dados: Use SUPABASE_UPDATE para mudar status para 'archived' ao invés de deletar
  • Soft delete: Use UPDATE para marcar como deletado (deleted_at, active=false) mantendo histórico
  • Dados com dependências: Verifique relações antes de deletar para evitar órfãos
  • Dados auditáveis: Mantenha histórico usando soft delete ao invés de hard delete

Parâmetros Detalhados

operation (string, obrigatório)

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

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Supabase Delete - 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": "Deletar Registro",
        "operation": "delete",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "temp_data",
        "rowId": "uuid-temp-123",
        "responseVariable": "resultado"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Registro deletado: {{resultado.rowId}}"
        }
      }
    },
    {
      "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 e um ID de teste. O sistema deve deletar o registro.

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 Delete - 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 Delete",
        "operation": "delete",
        "config": {
          "host": "https://xyzcompany.supabase.co",
          "serviceRole": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
        },
        "table": "test_logs",
        "rowId": "log-test-456",
        "responseVariable": "deletado"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "Log removido com sucesso"
        }
      }
    },
    {
      "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 deletar o log.

table (string, obrigatório)

O que é: Nome da tabela no Supabase de onde deletar o registro.

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Supabase Delete - 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": "Remover Pedido",
        "operation": "delete",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "cancelled_orders",
        "rowId": "order-789",
        "responseVariable": "pedidoRemovido"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Pedido cancelado removido do sistema"
        }
      }
    },
    {
      "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 deletar o registro.

rowId (string, obrigatório)

O que é: ID do registro que você deseja deletar. Aceita variáveis (ex: {{pedidoId}}).

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Supabase Delete - RowId Dinâmico",
  "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": "Aviso",
        "parameters": {
          "message": "ATENÇÃO: Esta ação irá deletar permanentemente o registro."
        }
      }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Pedir ID",
        "parameters": {
          "message": "Digite o ID do registro a ser deletado:",
          "variableName": "registroId"
        }
      }
    },
    {
      "id": "input_2",
      "type": "input",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Digite 'CONFIRMAR' para prosseguir:",
          "variableName": "confirmacao"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Verificar Confirmação",
        "parameters": {
          "variable": "{{confirmacao}}",
          "operator": "equals",
          "value": "CONFIRMAR"
        }
      }
    },
    {
      "id": "supabase_1",
      "type": "supabase",
      "position": { "x": 1100, "y": 50 },
      "data": {
        "label": "Deletar",
        "operation": "delete",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "user_data",
        "rowId": "{{registroId}}",
        "responseVariable": "resultado"
      }
    },
    {
      "id": "message_ok",
      "type": "message",
      "position": { "x": 1300, "y": 50 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "Registro {{resultado.rowId}} deletado com sucesso."
        }
      }
    },
    {
      "id": "message_cancel",
      "type": "message",
      "position": { "x": 1100, "y": 150 },
      "data": {
        "label": "Cancelado",
        "parameters": {
          "message": "Operação cancelada. Nenhum registro foi deletado."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "input_1" },
    { "source": "input_1", "target": "input_2" },
    { "source": "input_2", "target": "condition_1" },
    { "source": "condition_1", "target": "supabase_1", "label": "yes" },
    { "source": "condition_1", "target": "message_cancel", "label": "no" },
    { "source": "supabase_1", "target": "message_ok" },
    { "source": "message_ok", "target": "end_1" },
    { "source": "message_cancel", "target": "end_1" }
  ]
}

Teste: Digite um ID válido e confirme com "CONFIRMAR". O sistema deve deletar o registro.

responseVariable (string, obrigatório)

O que é: Nome da variável onde o resultado da operação será armazenado (objeto com deleted e rowId).

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Supabase Delete - 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": "Remover Sessão",
        "operation": "delete",
        "config": {
          "host": "https://seu-projeto.supabase.co",
          "serviceRole": "sua-service-role-key"
        },
        "table": "sessions",
        "rowId": "session-expired-123",
        "responseVariable": "sessaoRemovida"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Status",
        "parameters": {
          "message": "Sessão removida: {{sessaoRemovida.deleted}}"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "ID",
        "parameters": {
          "message": "ID da sessão: {{sessaoRemovida.rowId}}"
        }
      }
    },
    {
      "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 resultado deve estar acessível em múltiplos nodes com .deleted e .rowId.

Parâmetros

Campo Tipo Obrigatório Descrição
operation string Sim Tipo de operação: "delete"
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 deletar
responseVariable string Sim Nome da variável para armazenar resultado

Exemplo 1: Cancelar Agendamento

Objetivo: Permitir que cliente cancele agendamento e remova do banco de dados.

JSON para Importar

{
  "name": "Cancelar Agendamento - Supabase Delete",
  "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": "Cancelamento de Agendamento"
        }
      }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "ID Agendamento",
        "parameters": {
          "message": "Digite o número do seu agendamento:",
          "variableName": "agendamentoId"
        }
      }
    },
    {
      "id": "supabase_get",
      "type": "supabase",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Buscar Agendamento",
        "operation": "getRow",
        "config": {
          "host": "https://clinica.supabase.co",
          "serviceRole": "service-role-key"
        },
        "table": "appointments",
        "rowId": "{{agendamentoId}}",
        "responseVariable": "agendamento"
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Detalhes",
        "parameters": {
          "message": "Agendamento encontrado:\n\nData: {{agendamento.date}}\nHorário: {{agendamento.time}}\nProfissional: {{agendamento.doctor_name}}\n\nDeseja realmente cancelar?"
        }
      }
    },
    {
      "id": "input_2",
      "type": "input",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Digite 'SIM' para confirmar o cancelamento:",
          "variableName": "confirmacao"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Confirmar?",
        "parameters": {
          "variable": "{{confirmacao}}",
          "operator": "equals",
          "value": "SIM"
        }
      }
    },
    {
      "id": "supabase_delete",
      "type": "supabase",
      "position": { "x": 1500, "y": 50 },
      "data": {
        "label": "Cancelar Agendamento",
        "operation": "delete",
        "config": {
          "host": "https://clinica.supabase.co",
          "serviceRole": "service-role-key"
        },
        "table": "appointments",
        "rowId": "{{agendamentoId}}",
        "responseVariable": "cancelado"
      }
    },
    {
      "id": "message_ok",
      "type": "message",
      "position": { "x": 1700, "y": 50 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "Agendamento cancelado com sucesso!\n\nSeu horário foi liberado.\nCaso precise, faça um novo agendamento."
        }
      }
    },
    {
      "id": "message_cancel",
      "type": "message",
      "position": { "x": 1500, "y": 150 },
      "data": {
        "label": "Mantido",
        "parameters": {
          "message": "Agendamento mantido. Seu horário continua reservado."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "input_1" },
    { "source": "input_1", "target": "supabase_get" },
    { "source": "supabase_get", "target": "message_2" },
    { "source": "message_2", "target": "input_2" },
    { "source": "input_2", "target": "condition_1" },
    { "source": "condition_1", "target": "supabase_delete", "label": "yes" },
    { "source": "condition_1", "target": "message_cancel", "label": "no" },
    { "source": "supabase_delete", "target": "message_ok" },
    { "source": "message_ok", "target": "end_1" },
    { "source": "message_cancel", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Cancelamento de Agendamento
Sistema: Digite o número do seu agendamento:
Usuário: APT-12345
Sistema: Agendamento encontrado:

Data: 2025-01-20
Horário: 14:30
Profissional: Dr. João Silva

Deseja realmente cancelar?
Sistema: Digite 'SIM' para confirmar o cancelamento:
Usuário: SIM
Sistema: Agendamento cancelado com sucesso!

Seu horário foi liberado.
Caso precise, faça um novo agendamento.

Exemplo 2: Excluir Conta (LGPD)

Objetivo: Permitir que usuário exclua sua conta e todos os dados pessoais conforme LGPD.

JSON para Importar

{
  "name": "Excluir Conta LGPD - Supabase Delete",
  "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": "Aviso Importante",
        "parameters": {
          "message": "⚠️ ATENÇÃO: Exclusão de Conta\n\nVocê está prestes a excluir sua conta.\n\nIsso irá:\n• Remover todos os seus dados pessoais\n• Cancelar todos os agendamentos futuros\n• Apagar seu histórico\n\n❌ Esta ação é IRREVERSÍVEL"
        }
      }
    },
    {
      "id": "email_1",
      "type": "email",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Verificar Email",
        "parameters": {
          "message": "Para confirmar, digite seu email cadastrado:",
          "variableName": "emailConfirmacao"
        }
      }
    },
    {
      "id": "supabase_get",
      "type": "supabase",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Buscar Usuário",
        "operation": "getAll",
        "config": {
          "host": "https://app.supabase.co",
          "serviceRole": "service-role-key"
        },
        "table": "users",
        "filters": {
          "email": "{{emailConfirmacao}}"
        },
        "responseVariable": "usuarios"
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Usuário Existe?",
        "parameters": {
          "variable": "{{usuarios.count}}",
          "operator": "greater_than",
          "value": "0"
        }
      }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 1100, "y": 50 },
      "data": {
        "label": "Confirmação Final",
        "parameters": {
          "message": "Digite 'EXCLUIR MINHA CONTA' para confirmar:",
          "variableName": "confirmacao"
        }
      }
    },
    {
      "id": "condition_2",
      "type": "condition",
      "position": { "x": 1300, "y": 50 },
      "data": {
        "label": "Confirmar Exclusão?",
        "parameters": {
          "variable": "{{confirmacao}}",
          "operator": "equals",
          "value": "EXCLUIR MINHA CONTA"
        }
      }
    },
    {
      "id": "supabase_delete",
      "type": "supabase",
      "position": { "x": 1500, "y": 25 },
      "data": {
        "label": "Excluir Conta",
        "operation": "delete",
        "config": {
          "host": "https://app.supabase.co",
          "serviceRole": "service-role-key"
        },
        "table": "users",
        "rowId": "{{usuarios.rows[0].id}}",
        "responseVariable": "contaExcluida"
      }
    },
    {
      "id": "message_deleted",
      "type": "message",
      "position": { "x": 1700, "y": 25 },
      "data": {
        "label": "Conta Excluída",
        "parameters": {
          "message": "Sua conta foi excluída com sucesso.\n\nTodos os seus dados foram removidos conforme LGPD.\n\nSentiremos sua falta. Até breve!"
        }
      }
    },
    {
      "id": "message_wrong",
      "type": "message",
      "position": { "x": 1500, "y": 75 },
      "data": {
        "label": "Texto Incorreto",
        "parameters": {
          "message": "Texto de confirmação incorreto. Exclusão cancelada."
        }
      }
    },
    {
      "id": "message_notfound",
      "type": "message",
      "position": { "x": 1100, "y": 150 },
      "data": {
        "label": "Email Não Encontrado",
        "parameters": {
          "message": "Email não encontrado em nossa base. Verifique e tente novamente."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "email_1" },
    { "source": "email_1", "target": "supabase_get" },
    { "source": "supabase_get", "target": "condition_1" },
    { "source": "condition_1", "target": "input_1", "label": "yes" },
    { "source": "condition_1", "target": "message_notfound", "label": "no" },
    { "source": "input_1", "target": "condition_2" },
    { "source": "condition_2", "target": "supabase_delete", "label": "yes" },
    { "source": "condition_2", "target": "message_wrong", "label": "no" },
    { "source": "supabase_delete", "target": "message_deleted" },
    { "source": "message_deleted", "target": "end_1" },
    { "source": "message_wrong", "target": "end_1" },
    { "source": "message_notfound", "target": "end_1" }
  ]
}

Saída esperada (sucesso):

Sistema: ⚠️ ATENÇÃO: Exclusão de Conta

Você está prestes a excluir sua conta.

Isso irá:
• Remover todos os seus dados pessoais
• Cancelar todos os agendamentos futuros
• Apagar seu histórico

❌ Esta ação é IRREVERSÍVEL
Sistema: Para confirmar, digite seu email cadastrado:
Usuário: usuario@example.com
Sistema: Digite 'EXCLUIR MINHA CONTA' para confirmar:
Usuário: EXCLUIR MINHA CONTA
Sistema: Sua conta foi excluída com sucesso.

Todos os seus dados foram removidos conforme LGPD.

Sentiremos sua falta. Até breve!

Exemplo 3: Limpar Logs Antigos

Objetivo: Criar rotina automatizada para deletar logs com mais de 30 dias.

JSON para Importar

{
  "name": "Limpar Logs Antigos - Supabase Delete",
  "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": "Início Limpeza",
        "parameters": {
          "message": "Iniciando limpeza de logs antigos..."
        }
      }
    },
    {
      "id": "calculator_1",
      "type": "calculator",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Data Limite",
        "parameters": {
          "expression": "{{_timestamp}} - (30 * 24 * 60 * 60 * 1000)",
          "variableName": "dataLimite"
        }
      }
    },
    {
      "id": "supabase_get",
      "type": "supabase",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Buscar Logs Antigos",
        "operation": "getAll",
        "config": {
          "host": "https://sistema.supabase.co",
          "serviceRole": "service-role-key"
        },
        "table": "system_logs",
        "filters": {
          "created_at_lt": "{{dataLimite}}"
        },
        "limit": 100,
        "responseVariable": "logsAntigos"
      }
    },
    {
      "id": "loop_1",
      "type": "loop",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Para Cada Log",
        "parameters": {
          "array": "{{logsAntigos.rows}}",
          "itemVariable": "log"
        }
      }
    },
    {
      "id": "supabase_delete",
      "type": "supabase",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Deletar Log",
        "operation": "delete",
        "config": {
          "host": "https://sistema.supabase.co",
          "serviceRole": "service-role-key"
        },
        "table": "system_logs",
        "rowId": "{{log.id}}",
        "responseVariable": "logDeletado"
      }
    },
    {
      "id": "delay_1",
      "type": "delay",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Aguardar",
        "parameters": {
          "duration": 100
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 1500, "y": 100 },
      "data": {
        "label": "Relatório",
        "parameters": {
          "message": "Limpeza concluída!\n\nLogs removidos: {{logsAntigos.count}}\nData limite: {{dataLimite}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "calculator_1" },
    { "source": "calculator_1", "target": "supabase_get" },
    { "source": "supabase_get", "target": "loop_1" },
    { "source": "loop_1", "target": "supabase_delete" },
    { "source": "supabase_delete", "target": "delay_1" },
    { "source": "delay_1", "target": "loop_1" },
    { "source": "loop_1", "target": "message_2", "label": "done" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Iniciando limpeza de logs antigos...
Sistema: Limpeza concluída!

Logs removidos: 47
Data limite: 2024-12-15T10:00:00.000Z

Resposta do Node

{
  "deleted": true,
  "rowId": "uuid-do-registro-deletado"
}

Boas Práticas

SIM:

  • Sempre confirme antes de deletar (use CONDITION)
  • Busque e mostre dados antes de deletar para usuário revisar
  • Use soft delete (UPDATE com deleted_at) ao invés de hard delete quando possível
  • Implemente dupla confirmação para operações críticas
  • Registre logs de exclusão para auditoria
  • Verifique dependências antes de deletar

NÃO:

  • Não delete sem confirmação do usuário
  • Não delete registros com relacionamentos sem verificar
  • Não use delete para "arquivar" dados (use UPDATE)
  • Não exponha Service Role Key em código front-end
  • Não delete em massa sem verificar impacto
  • Não assuma que delete sempre funciona (trate erros)

Dicas

💡 Dica 1: Prefira soft delete (UPDATE com deleted_at ou active=false) ao invés de hard delete. Permite recuperar dados se necessário.

💡 Dica 2: DELETE é irreversível! Sempre implemente confirmação dupla para operações críticas de exclusão.

💡 Dica 3: Configure cascading delete no banco para lidar com relacionamentos. Ou delete manualmente registros dependentes primeiro.

💡 Dica 4: Para LGPD/GDPR, além de deletar da tabela principal, delete de todas as tabelas relacionadas (logs, histórico, etc.).

💡 Dica 5: Se delete falhar (registro não existe ou constraint violation), o erro será retornado. Use CONDITION para verificar sucesso.

Próximos Nodes

SUPABASE_GETROW - Buscar registro específico por ID → SUPABASE_GETALL - Buscar múltiplos registros com filtros → SUPABASE_INSERT - Inserir novo registro na tabela → SUPABASE_UPDATE - Atualizar registro existente