Pular para conteúdo

MARK_READ - Marcar Mensagem Como Lida

O que é este Node?

O MARK_READ é o node responsável por marcar mensagens como lidas via WhatsApp Business API.

Por que este Node existe?

Status de leitura melhora UX. O MARK_READ existe para:

  1. Feedback visual: Mostrar ao usuário que mensagem foi vista
  2. Organização: Gerenciar status de mensagens recebidas
  3. Automação: Marcar automaticamente mensagens processadas
  4. Profissionalismo: Indicar que mensagem está sendo tratada
  5. Analytics: Rastrear mensagens lidas vs não lidas

Como funciona internamente?

Quando o MARK_READ é executado, o sistema:

  1. Requer messageId: ID da mensagem a marcar (do webhook)
  2. Envia requisição: POST para marcar como lida
  3. Atualiza status: WhatsApp exibe checkmarks azuis
  4. Erro se incompleto: Implementação requer parâmetro messageId
  5. Confirma sucesso: Retorna status da operação

Código interno (whatsapp-meta-executor.service.ts:640-644):

private async markAsRead(data: WhatsAppMetaNodeData): Promise<any> {
  // This would require a message ID to be passed
  // Implementation depends on specific requirements
  throw new Error('markAsRead operation not fully implemented - requires message ID parameter');
}

Status de Implementação

⚠️ IMPLEMENTAÇÃO PARCIAL: Esta operação requer parâmetro messageId adicional que não está totalmente implementado no código base atual.

Para usar esta funcionalidade:

  1. Adicione campo messageId aos parâmetros
  2. Implemente POST para endpoint de marcar como lida
  3. Retorne confirmação de sucesso

Parâmetros

Campo Tipo Obrigatório Descrição
operation string Sim Deve ser "mark_read"
accessToken string Sim Token de acesso da WhatsApp Business API
phoneNumberId string Sim ID do número WhatsApp Business
messageId string Sim ID da mensagem a marcar ⚠️ Requer implementação

Exemplo de Implementação Completa

private async markAsRead(data: WhatsAppMetaNodeData): Promise<any> {
  if (!data.messageId) {
    throw new Error('messageId is required for markAsRead operation');
  }

  const payload = {
    messaging_product: 'whatsapp',
    status: 'read',
    message_id: data.messageId
  };

  const response: AxiosResponse = await axios.post(
    `${this.WHATSAPP_API_BASE}/${data.phoneNumberId}/messages`,
    payload,
    {
      headers: {
        'Authorization': `Bearer ${data.accessToken}`,
        'Content-Type': 'application/json'
      }
    }
  );

  return {
    success: true,
    messageId: data.messageId,
    status: 'read'
  };
}

Exemplo de Flow (Conceitual)

{
  "name": "Marcar Como Lida - MARK_READ",
  "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": "MessageId do Webhook",
        "parameters": {
          "variableName": "webhook",
          "value": {
            "messageId": "wamid.HBgNNTUxMTk5OTk5OTk5OQ=="
          }
        }
      }
    },
    {
      "id": "whatsapp_1",
      "type": "whatsapp_meta",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Marcar Lida",
        "parameters": {
          "operation": "mark_read",
          "accessToken": "EAAxxxxxxxx",
          "phoneNumberId": "123456789",
          "messageId": "{{webhook.messageId}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Log",
        "parameters": {
          "message": "✅ Mensagem marcada como lida"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "whatsapp_1" },
    { "source": "whatsapp_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Como Obter messageId

O messageId vem do webhook quando usuário envia mensagem:

{
  "object": "whatsapp_business_account",
  "entry": [{
    "changes": [{
      "value": {
        "messages": [{
          "id": "wamid.HBgNNTUxMTk5OTk5OTk5OQ==",
          "from": "5511999999999",
          "timestamp": "1234567890",
          "text": {
            "body": "Olá!"
          }
        }]
      }
    }]
  }]
}

Resposta Esperada

{
  "success": true,
  "messageId": "wamid.HBgNNTUxMTk5OTk5OTk5OQ==",
  "status": "read"
}

Caso de Uso: Auto-marcar Mensagens Processadas

{
  "name": "Auto-marcar Processadas",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Webhook Recebido" }
    },
    {
      "id": "whatsapp_mark",
      "type": "whatsapp_meta",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Marcar Lida",
        "parameters": {
          "operation": "mark_read",
          "accessToken": "EAAxxxxxxxx",
          "phoneNumberId": "123456789",
          "messageId": "{{webhook.message.id}}"
        }
      }
    },
    {
      "id": "process_1",
      "type": "ai",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Processar Mensagem",
        "parameters": {
          "prompt": "Analisar: {{webhook.message.text}}"
        }
      }
    },
    {
      "id": "whatsapp_reply",
      "type": "whatsapp_meta",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Responder",
        "parameters": {
          "operation": "send_message",
          "accessToken": "EAAxxxxxxxx",
          "phoneNumberId": "123456789",
          "recipientPhone": "{{webhook.message.from}}",
          "messageText": "{{ai.response}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "whatsapp_mark" },
    { "source": "whatsapp_mark", "target": "process_1" },
    { "source": "process_1", "target": "whatsapp_reply" },
    { "source": "whatsapp_reply", "target": "end_1" }
  ]
}

Boas Práticas

SIM: - Marque mensagens assim que forem processadas - Use em automações para indicar recebimento - Implemente antes de processar mensagem - Combine com typing indicator para melhor UX - Marque mesmo se resposta for demorar

NÃO: - Não marque mensagens que ainda não foram vistas/processadas - Não use excessivamente (apenas quando necessário) - Não ignore erros de marcação - Não dependa apenas disso para confirmação de leitura

Dicas

💡 Webhook: Configure webhook para receber messageId de cada mensagem 💡 Timing: Marque como lida imediatamente após receber webhook 💡 UX: Combine com typing indicator para experiência natural 💡 Erro handling: Trate erros se messageId inválido ou expirado 💡 Analytics: Registre mensagens marcadas para métricas

Próximo Node

SEND_MESSAGE - Enviar mensagem → GET_MEDIA - Baixar mídia recebida