omnichannel-deploy/docs/chat-whatsapp.md

4.1 KiB

Arquitetura e Integracao do Modulo WhatsApp (Omnichannel)

Visao Geral do Sistema

Este documento descreve a arquitetura de alto nivel do modulo de WhatsApp integrado ao ecossistema Sothis Omnichannel. A solucao une uma interface web moderna de atendimento, uma API NestJS robusta e o controle nativo do WhatsApp Web via automacao e WebSockets em tempo real.


Diagrama de Fluxo e Integracao

O fluxo de comunicacao entre os diferentes componentes do ecossistema e estruturado conforme o diagrama a seguir:

graph TD
    %% Componentes
    FE[Frontend - React/Vite]
    BE[Backend - NestJS]
    DB[(Banco PostgreSQL)]
    PERSIST[(Persistencia JSON Local)]
    PUPP[Puppeteer Client - WhatsApp Web]
    WPP[Servidores do WhatsApp]

    %% Relacionamentos do Frontend
    FE <-->|WebSockets: Socket.io| BE
    FE -->|HTTP: Enviar Mensagem / Atribuir / Liberar| BE

    %% Relacionamentos do Backend
    BE <-->|Transacoes SQL| DB
    BE <-->|Leitura/Escrita Cache| PERSIST
    BE <-->|Automacao de Headless Chrome| PUPP

    %% WhatsApp Web
    PUPP <-->|Sincronizacao Nativa| WPP

Divisao de Responsabilidades

1. Frontend (Interface Operacional)

  • Visualizacao: Renderiza o historico de bolhas de mensagens e arquivos de midia (imagens, audios, anexos).
  • Posse de Chat (Ownership): Permite ao operador assumir chats livres (takeChat) ou libera-los (releaseChat), aplicando travas visuais se a conversa estiver sob a posse de outro colaborador.
  • UX Ininterrupta: Aplica de-duplicação temporal em milissegundos e cria bolhas locais com ID temporario antes do disparo de rede para garantir experiencia livre de lag.

2. Backend (Orquestracao e Integracao)

  • Automacao (whatsapp-web.js): Carrega o headless Chrome (via Puppeteer), autentica a sessao por QR Code, inicializa o cliente e gerencia reconexoes.
  • Transmissao em Tempo Real: Escuta eventos de mensagem (message_create) do Puppeteer, formata o payload (com suporte a midias baixadas e resolucao inteligente de nomes) e distribui via Socket.io Gateway para a interface do atendente.
  • Processamento Pesado: Aceita payloads de midia em Base64 de ate 50MB no canal de entrada para evitar falhas de upload.

3. Banco de Dados PostgreSQL (Persistencia Transacional)

  • Controle de Atribuicoes: A tabela whatsapp_chat_atribuicoes atua como fonte unica da verdade (Single Source of Truth) para posse de atendimento.
  • Chaves Estrangeiras: Vincula transacionalmente o ID do chat (chat_id) com chaves numericas de usuarios (user_id) e setores operacionais (area_id).

4. Cache JSON Local (whatsapp-chats-persist.json)

  • Performance de Listagem: Evita multiplas consultas a servidores de rede locais ou API do WhatsApp na listagem inicial de chats operacionais.
  • Historico e previews: Armazena carimbos de tempo (timestamps), contadores de nao lidas e previews de midia de forma otimizada.

Casos de Uso Principais

A. Assumir Chat Automaticamente ao Enviar Mensagem

  1. O operador envia uma mensagem em uma conversa livre.
  2. O frontend verifica se o chat esta sem dono e faz um POST para /whatsapp/assign.
  3. O backend insere na tabela whatsapp_chat_atribuicoes o ID do atendente e o ID numerico de sua respectiva area de trabalho.
  4. A transacao e confirmada. O frontend atualiza a UI marcando o operador como dono e libera o canal de conversacao.

B. Envio e Recebimento de Midias

  1. O cliente envia uma imagem pelo WhatsApp.
  2. O Puppeteer no backend detecta a mensagem com midia e baixa seus bytes em tempo real.
  3. O backend emite via socket os metadados e os bytes brutos (mimetype, data em base64, filename).
  4. O frontend identifica a presenca da midia e renderiza o player de audio, imagem ou link de download de forma nativa e estetica.

Politicas de Segurança e Versionamento

  • As pastas de sessoes (/whatsapp-session), arquivos locais de persistencia JSON e logs de desenvolvimento estao estritamente declarados nos arquivos .gitignore para nao serem expostos nos repositorios Git.
  • Credenciais de banco residem exclusivamente em arquivos .env.* mantidos fora do controle de versao.