Pular para conteúdo

FTP_RENAME - Renomear/Mover Arquivo no Servidor FTP

O que é este Node?

O FTP_RENAME é o node responsável por renomear ou mover arquivos em um servidor FTP remoto. Permite reorganizar arquivos e implementar workflows de processamento.

Por que este Node existe?

Organizar e marcar arquivos como processados é essencial em integrações. O FTP_RENAME existe para:

  1. Marcar como Processado: Renomear arquivo após importação (ex: pedidos.csv → pedidos_processado.csv)
  2. Arquivar: Mover arquivos de /incoming/ para /processed/ ou /archive/
  3. Reorganizar: Mover arquivos para pastas organizadas por data
  4. Workflow: Implementar ciclo de vida de arquivos (novo → processando → concluído)

Como funciona internamente?

Quando o FTP_RENAME é executado, o sistema:

  1. Conecta ao FTP: Estabelece conexão com servidor usando credenciais
  2. Valida Caminhos: Confirma que caminho antigo e novo foram fornecidos
  3. Executa Rename: Envia comando RNFR (rename from) e RNTO (rename to) ao servidor
  4. Move/Renomeia: Servidor move arquivo do caminho antigo para novo
  5. Registra Timestamp: Captura momento da operação
  6. Se falhar: Retorna erro (arquivo não existe, destino já existe, etc)
  7. Se sucesso: Confirma operação com ambos caminhos e timestamp

Código interno (ftp-executor.service.ts:371-385):

private async renameFile(client: FTP.Client, data: FTPNodeData): Promise<any> {
  const oldPath = data.oldPath!;
  const newPath = data.newPath!;

  this.logger.debug(`Renaming file: ${oldPath}${newPath}`);

  await client.rename(oldPath, newPath);

  return {
    success: true,
    oldPath,
    newPath,
    renamedAt: new Date().toISOString()
  };
}

Quando você DEVE usar este Node?

Use FTP_RENAME sempre que precisar de renomear ou mover arquivos no FTP:

Casos de uso

  1. Arquivamento: "Mover CSV de /incoming/ para /processed/ após importar"
  2. Versionamento: "Renomear backup.sql para backup_2025-01-15.sql"
  3. Workflow: "Mover pedido de /pending/ para /processing/ e depois /done/"

Quando NÃO usar FTP_RENAME

  • Copiar Arquivo: FTP_RENAME move (não copia). Para copiar, baixe e faça upload
  • Trocar Extensão: Se precisa converter formato, baixe, processe e faça upload do novo
  • Entre Servidores: FTP_RENAME só funciona no mesmo servidor FTP

Parâmetros Detalhados

oldPath (string, obrigatório)

O que é: Caminho atual do arquivo no servidor FTP.

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste FTP Rename - OldPath",
  "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": "Arquivo Atual",
        "parameters": {
          "variableName": "arquivo_origem",
          "value": "/temp/documento.pdf"
        }
      }
    },
    {
      "id": "ftp_1",
      "type": "ftp",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Renomear Arquivo",
        "parameters": {
          "host": "ftp.example.com",
          "username": "user",
          "password": "pass",
          "operation": "rename",
          "oldPath": "{{arquivo_origem}}",
          "newPath": "/archive/documento.pdf",
          "outputVariable": "rename_result"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ Movido:\nDe: {{rename_result.oldPath}}\nPara: {{rename_result.newPath}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "ftp_1" },
    { "source": "ftp_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Arquivo será movido de /temp/ para /archive/.

newPath (string, obrigatório)

O que é: Novo caminho/nome do arquivo no servidor FTP.

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste FTP Rename - NewPath",
  "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": "Novo Nome",
        "parameters": {
          "message": "Novo nome do arquivo:",
          "variableName": "novo_nome"
        }
      }
    },
    {
      "id": "ftp_1",
      "type": "ftp",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Renomear",
        "parameters": {
          "host": "ftp.server.com",
          "username": "user",
          "password": "pass",
          "operation": "rename",
          "oldPath": "/uploads/temp.csv",
          "newPath": "/uploads/{{novo_nome}}",
          "outputVariable": "resultado"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "Arquivo renomeado para: {{novo_nome}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "ftp_1" },
    { "source": "ftp_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite "pedidos_2025-01-15.csv". Arquivo será renomeado.

Parâmetros

Campo Tipo Obrigatório Descrição
host string Sim Endereço do servidor FTP
port number Não Porta TCP (padrão: 21)
username string Sim Nome de usuário
password string Sim Senha
secure boolean Não FTPS - SSL/TLS (padrão: false)
operation string Sim Deve ser "rename"
oldPath string Sim Caminho atual do arquivo
newPath string Sim Novo caminho/nome do arquivo
outputVariable string Não Variável de resultado (padrão: ftp_result)

Exemplo 1: Arquivar Arquivo Após Processamento

Objetivo: Mover CSV de /incoming/ para /processed/ após importar dados

JSON para Importar

{
  "name": "Processar e Arquivar",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "ftp_download",
      "type": "ftp",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Baixar Pedidos",
        "parameters": {
          "host": "ftp.parceiro.com",
          "username": "empresa",
          "password": "pass123",
          "operation": "download",
          "remoteFilePathDownload": "/incoming/pedidos.csv",
          "localFilePathDownload": "/tmp/pedidos.csv"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Processar",
        "parameters": {
          "message": "⚙️ Processando pedidos..."
        }
      }
    },
    {
      "id": "ftp_rename",
      "type": "ftp",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Arquivar no Servidor",
        "parameters": {
          "host": "ftp.parceiro.com",
          "username": "empresa",
          "password": "pass123",
          "operation": "rename",
          "oldPath": "/incoming/pedidos.csv",
          "newPath": "/processed/pedidos_2025-01-15.csv",
          "outputVariable": "arquivo_info"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Finalizar",
        "parameters": {
          "message": "✅ Pedidos importados e arquivados!\nArquivo: {{arquivo_info.newPath}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "ftp_download" },
    { "source": "ftp_download", "target": "message_1" },
    { "source": "message_1", "target": "ftp_rename" },
    { "source": "ftp_rename", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: ⚙️ Processando pedidos...
Sistema: ✅ Pedidos importados e arquivados!
Arquivo: /processed/pedidos_2025-01-15.csv

Exemplo 2: Adicionar Timestamp ao Nome do Arquivo

Objetivo: Renomear arquivo adicionando data/hora para versionamento

JSON para Importar

{
  "name": "Versionamento com Timestamp",
  "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": "Data Atual",
        "parameters": {
          "variableName": "timestamp",
          "value": "2025-01-15_10-30"
        }
      }
    },
    {
      "id": "ftp_rename",
      "type": "ftp",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Renomear com Timestamp",
        "parameters": {
          "host": "ftp.backup.com",
          "username": "backup",
          "password": "pass",
          "operation": "rename",
          "oldPath": "/backups/database.sql",
          "newPath": "/backups/database_{{timestamp}}.sql",
          "outputVariable": "backup_versao"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmar Versão",
        "parameters": {
          "message": "💾 Backup versionado!\n{{backup_versao.newPath}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "ftp_rename" },
    { "source": "ftp_rename", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 💾 Backup versionado!
/backups/database_2025-01-15_10-30.sql

Resposta do Node

{
  "success": true,
  "data": {
    "ftp_result": {
      "success": true,
      "oldPath": "/incoming/pedidos.csv",
      "newPath": "/processed/pedidos_2025-01-15.csv",
      "renamedAt": "2025-01-15T10:30:00.000Z"
    },
    "operation": "rename",
    "host": "ftp.parceiro.com",
    "timestamp": "2025-01-15T10:30:00.000Z"
  },
  "executionTime": 456,
  "logs": [
    "Renamed: /incoming/pedidos.csv → /processed/pedidos_2025-01-15.csv"
  ]
}

Boas Práticas

SIM:

  • Use rename para arquivar ao invés de apagar (mantém histórico)
  • Adicione timestamp nos nomes para versionamento
  • Organize arquivos em pastas por status (/incoming/, /processing/, /done/)
  • Verifique se arquivo origem existe antes de renomear
  • Use pasta /archive/ para manter backups organizados

NÃO:

  • Não renomeie se arquivo destino já existir (será sobrescrito)
  • Não use rename para copiar (é uma operação de mover, não copiar)
  • Não renomeie entre diferentes servidores (só funciona no mesmo)
  • Não renomeie diretórios com este node (use comandos específicos)

Dicas

💡 Dica 1: FTP_RENAME é operação ATÔMICA. Não há arquivo duplicado durante rename.

💡 Dica 2: Para criar estrutura de pastas por data: /archive/2025/01/15/arquivo.csv

💡 Dica 3: Adicione sufixos: _processado, _backup, _old para identificar status.

💡 Dica 4: Se newPath já existe, maioria dos servidores FTP sobrescreve sem aviso!

Próximos Nodes

FTP_DELETE - Apagar após arquivar → FTP_DOWNLOAD - Baixar antes de renomear → FTP_LIST - Listar arquivos para renomear em lote → FTP_MKDIR - Criar pasta de destino antes de mover