FIX – Backend Baileys
Manual de Atualização – Correção LID/PN, Contatos e Tickets (multi-empresa)

Ambiente: Backend Node.js / TypeScript compartilhado com Laravel via banco de dados.

Visão Geral

1. Objetivo da Atualização

Esta atualização implementa um conjunto de ajustes no backend que utiliza Baileys, com foco em:

Atenção: a aplicação continua utilizando o mesmo banco compartilhado com o Laravel. As migrations adicionam colunas e índices não-únicos, sem remover nada que já existe.
Pré-requisitos

2. Pré-Requisitos Técnicos

2.1. Ferramentas e dependências

2.2. Recomendações

Crítico: sempre gere um backup do banco antes de executar os scripts de correção (fix:contacts-lid-pn, fix:chats, fix:backfill-messages).
Passo a Passo

3. Atualização de Código

Aplicar no repositório backend os seguintes itens:

Execução

4. Rodar Migrations

Após atualizar os arquivos no repositório e publicar no servidor, execute:

npm run db:migrate

Isso irá:

Importante: se houverem duplicados em (companyId, number), a migration UNIQUE pode falhar. Recomenda-se rodar primeiro os scripts de saneamento antes de aplicar UNIQUE.
Configuração

5. Ajuste de Variáveis de Ambiente

Adicione/ajuste as seguintes entradas no arquivo .env do backend:

5.1. Configuração do Cache LID/PN

LIDPN_CACHE_DRIVER=redis   # ou "memory"
LIDPN_CACHE_TTL_MS=300000  # 5 minutos

5.2. Configuração de Dialeto do Banco (para backup)

DB_DIALECT=postgres

O script backupDb.ts atual implementa backup via pg_dump para Postgres. Caso esteja usando MySQL, o backup deverá ser adaptado ou feito manualmente (mysqldump).

5.3. Filtro opcional por Empresa

Alguns scripts permitem rodar por empresa via variável:

COMPANY_ID=10

Se COMPANY_ID não for informado, os scripts operam sobre todas as empresas; se for informado, restringem a execução àquela companyId, quando implementado.

Validação

6. Subir o Backend e Validar

  1. Reiniciar o backend:
    pm2 restart NOME_DA_APP
    ou o comando equivalente usado no ambiente.
  2. Verificar logs para garantir que não há erros de:
    • Conexão com banco.
    • Carregamento de models (Contact, Ticket, Message).
    • Erro em lidPnCache ou Redis.
  3. Validar, via aplicação, que:
    • Novos contatos continuam sendo criados normalmente.
    • Não há erros ao receber mensagens.
Ajustes de Dados

7. Execução dos Scripts de Correção

7.1. Backup do Banco

Antes de qualquer alteração em massa, executar:

npm run backup:db

Isso gera um arquivo do tipo:

backups/backup-before-chat-fix-YYYYMMDDHHmmss.sql
Em caso de problema grave após os scripts, este arquivo poderá ser usado para restore no banco.

7.2. Correção de Contatos LID/PN

Script: fix:contacts-lid-pn.

7.2.1. Execução de teste (DRY RUN)

Para rodar apenas o diagnóstico (sem gravar nada):

DRY_RUN=true npm run fix:contacts-lid-pn

Exemplo por empresa (se tiver adaptado o script para usar COMPANY_ID):

COMPANY_ID=10 DRY_RUN=true npm run fix:contacts-lid-pn

7.2.2. Execução efetiva

npm run fix:contacts-lid-pn

O script irá:

7.3. Consolidação de Tickets Duplicados

Script: fix:chats.

7.3.1. DRY RUN

DRY_RUN=true npm run fix:chats

Exemplo por empresa:

COMPANY_ID=10 DRY_RUN=true npm run fix:chats

7.3.2. Execução efetiva

npm run fix:chats

O script irá:

7.4. Backfill de lastMessage / lastMessageAt

Script: fix:backfill-messages.

7.4.1. DRY RUN

DRY_RUN=true npm run fix:backfill-messages

Exemplo por empresa:

COMPANY_ID=10 DRY_RUN=true npm run fix:backfill-messages

7.4.2. Execução efetiva

npm run fix:backfill-messages

O script irá, para cada ticket:

Pós-Execução

8. Verificações Pós-Atualização

Rollback

9. Estratégia de Rollback (em caso de problemas graves)

  1. Parar o backend (ex.: pm2 stop ou equivalente).
  2. Restaurar o banco a partir do arquivo gerado por backup:db:
    • Postgres: psql ou ferramenta de administração (ex.: pgAdmin).
    • MySQL: utilizar mysql/mysqldump equivalente (se implementado).
  3. Reverter migrations se necessário:
    npx sequelize db:migrate:undo:all
  4. Retornar para a versão anterior do código (tag, commit ou branch estável).
  5. Subir novamente o backend e validar.
Rollback de banco deve ser feito com cautela e, idealmente, em conjunto com o time responsável pela infraestrutura/DBA, pois impacta todo o sistema que compartilha o mesmo banco (incluindo o Laravel).