Pular para conteúdo

END - Finalizar Flow

O que é este Node?

O END é o node responsável por finalizar a execução do flow. Ele marca o ponto onde o processamento termina e, opcionalmente, pode enviar uma mensagem de despedida ao usuário.

Por que este Node existe?

Todo sistema precisa de um ponto de término claro. O END existe para:

  1. Marcar o fim da execução: O sistema precisa saber quando parar de processar o flow
  2. Liberar recursos: Quando o END é atingido, o sistema pode limpar memória e conexões
  3. Enviar mensagem de encerramento: Opcionalmente, informar o usuário que a interação terminou
  4. Permitir múltiplos caminhos: Flows complexos podem ter vários ENDs para diferentes finais (sucesso, erro, cancelamento)

Sem o END, o flow ficaria "pendurado" sem saber quando terminar.

Como funciona internamente?

Quando o END é executado, o sistema:

  1. Verifica se há mensagem: Se você passou o parâmetro message ou endMessage
  2. Envia a mensagem (se houver)
  3. Registra o término: Salva timestamp e status de conclusão
  4. Encerra a execução: Para o processamento do flow
  5. Libera recursos: Limpa contexto, variáveis temporárias, etc.
  6. Retorna resultado final: Indica sucesso ou falha

Código interno (basic-flow-executor.service.ts:114-139):

private async executeEnd(parameters: any, context: any): Promise<any> {
  const { message, endMessage } = parameters;

  this.logger.log(`🔴 END - Flow execution completed`);

  const result: any = {
    success: true,
    data: {
      action: 'flow_ended',
      timestamp: new Date().toISOString(),
      flowId: context.flowId || 'unknown'
    }
  };

  // Add message only if provided
  const finalMessage = message || endMessage;
  if (finalMessage) {
    result.data.message = finalMessage;
    result.data.messageType = 'text';
  }

  return result;
}

Quando você DEVE usar este Node?

SEMPRE! Todo flow PRECISA ter pelo menos UM node END.

Casos de uso:

  1. Fim único: Flow linear com um só caminho de saída
  2. Múltiplos fins: Flow com branches (if/else) onde cada caminho tem seu END
  3. Fim com mensagem: Despedir-se do usuário
  4. Fim silencioso: Terminar sem mensagem adicional

Parâmetros Detalhados

message (string, opcional)

O que é: Mensagem de texto enviada ao usuário antes de finalizar o flow.

Por que usar: Dar feedback final, agradecer, ou informar próximos passos.

Quando NÃO usar: Se já enviou mensagem de despedida em node MESSAGE anterior.

endMessage (string, opcional)

O que é: Alternativa ao message (mantida por compatibilidade com versões antigas).

Diferença: Funciona igual ao message. Se ambos forem fornecidos, message tem prioridade.

Parâmetros

Campo Tipo Obrigatório Descrição
message string Não Mensagem final (opcional)
endMessage string Não Mensagem final alternativa (compatibilidade)

Exemplo 1: Flow Completo Básico

Objetivo: Flow simples com início, mensagem e fim

JSON para Importar

{
  "name": "Flow Completo Básico",
  "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": "Mensagem Principal",
        "parameters": {
          "message": "Processamento realizado com sucesso!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Fim",
        "parameters": {
          "message": "Obrigado por usar nosso sistema!"
        }
      }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Exemplo 2: END sem Mensagem

Objetivo: Finalizar flow sem mensagem adicional

JSON para Importar

{
  "name": "Flow End Silencioso",
  "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": "Única Mensagem",
        "parameters": {
          "message": "Dados salvos!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Fim Silencioso"
      }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Exemplo 3: Múltiplos Fins (Diferentes Caminhos)

Objetivo: Flow com 2 caminhos que terminam diferente

JSON para Importar

{
  "name": "Flow Múltiplos Fins",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 200 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Caminho Sucesso",
        "parameters": {
          "message": "✅ Operação bem-sucedida!"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 300, "y": 300 },
      "data": {
        "label": "Caminho Erro",
        "parameters": {
          "message": "❌ Ocorreu um erro!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Fim Sucesso",
        "parameters": {
          "message": "Até logo!"
        }
      }
    },
    {
      "id": "end_2",
      "type": "end",
      "position": { "x": 500, "y": 300 },
      "data": {
        "label": "Fim Erro",
        "parameters": {
          "message": "Tente novamente mais tarde."
        }
      }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "start_1", "target": "message_2" },
    { "source": "message_1", "target": "end_1" },
    { "source": "message_2", "target": "end_2" }
  ]
}

Exemplo 4: END com Variáveis

Objetivo: Mensagem final personalizada com variáveis

JSON para Importar

{
  "name": "Flow End Personalizado",
  "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": "Processar Dados",
        "parameters": {
          "message": "Processando pedido #12345..."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Finalizar",
        "parameters": {
          "message": "Pedido concluído! Flow ID: {{flowId}}"
        }
      }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Resposta do Node

{
  "success": true,
  "data": {
    "action": "flow_ended",
    "timestamp": "2025-01-15T10:35:00.000Z",
    "flowId": "flow_123",
    "message": "Obrigado por usar nosso sistema!",
    "messageType": "text"
  }
}

Se o END não tiver mensagem:

{
  "success": true,
  "data": {
    "action": "flow_ended",
    "timestamp": "2025-01-15T10:35:00.000Z",
    "flowId": "flow_123"
  }
}

Como Importar

  1. Copie o JSON do exemplo
  2. Vá em Flow BuilderImportar
  3. Cole o JSON
  4. Clique em Importar
  5. Pronto! Flow criado

Testar o Flow

  1. Clique em Executar
  2. Veja as mensagens sendo enviadas
  3. Flow termina automaticamente no END
  4. Veja o resultado final

Diferença: message vs endMessage

O END aceita dois parâmetros para compatibilidade:

  • message - Forma padrão
  • endMessage - Forma alternativa (legado)

Se ambos forem passados, message tem prioridade.

{
  "parameters": {
    "message": "Esta mensagem será usada"
  }
}

Boas Práticas

SIM: - Todo flow DEVE ter pelo menos um END - Use mensagem final para feedback ao usuário - Flows com múltiplos caminhos podem ter múltiplos ENDs

NÃO: - Não deixe flow sem END - Não conecte END a outro node (ele é sempre o último)

Dicas

💡 Múltiplos fins: Use ENDs diferentes para caminhos de sucesso/erro 💡 Mensagem opcional: Pode omitir mensagem se já enviou antes 💡 Flow ID: Use {{flowId}} na mensagem para debug

Próximo Node

INPUT - Capturar entrada do usuário → START - Voltar para início