Skip to content

fix(instance): torna opcional a contagem de relações no fetchInstances - #6

Open
adriano-rodrigues99 wants to merge 1 commit into
main-maxpantechfrom
fix-instance-info-count
Open

adriano-rodrigues99 wants to merge 1 commit into
main-maxpantechfrom
fix-instance-info-count

Conversation

@adriano-rodrigues99

@adriano-rodrigues99 adriano-rodrigues99 commented Oct 15, 2026 •

Copy link
Copy Markdown

Resumo

O instanceInfo (usado por todo GET /instance/fetchInstances, inclusive com ?instanceName= / ?instanceId=) incluía _count { Message, Contact, Chat }. No Prisma 6 (sem relationJoins) isso vira:

LEFT JOIN (SELECT "instanceId", COUNT(*) FROM "Contact" WHERE 1=1 GROUP BY "instanceId") ...
LEFT JOIN (SELECT "instanceId", COUNT(*) FROM "Chat"    WHERE 1=1 GROUP BY "instanceId") ...
LEFT JOIN (SELECT "instanceId", COUNT(*) FROM "Message" WHERE 1=1 GROUP BY "instanceId") ...
WHERE "Instance".name IN ($1) ...

As subqueries não filtram pela instância pedida, então cada consulta de uma única instância contava as tabelas inteiras. No RDS evolution-prod, o Performance Insights mostrou isso como 50–70% da carga do banco (varredura de índice sobre ~1,34M linhas de Contact por chamada). Em 14/10 isso foi mitigado na operação (truncate da Contact, DATABASE_SAVE_DATA_CONTACTS=false), mas volta assim que essas tabelas crescerem de novo.

Nenhum serviço nosso lê o _count: backend, ms-routines, ms-operation e ms-ai só usam id, connectionStatus e ownerJid. O único que lê é o Evolution Manager embutido, que mostra os números nos cards das instâncias.

Mudanças

  • O _count só é devolvido quando a chamada pede explicitamente com ?withCounts=true.
  • Quando pedido, a contagem sai de um groupBy por tabela filtrado pelos instanceIds pedidos (com índice), em vez de agregar as tabelas inteiras. O formato da resposta (_count: { Message, Contact, Chat }) não muda.
  • O instanceInfoById e o caminho por token do fetchInstances repassam a opção. A chamada interna do fetchProfile continua sem contagem.

Mudanças de comportamento

  • Sem withCounts=true, a resposta vem sem _count. O Evolution Manager já trata isso com _count?.Contact || 0, então os cards mostram 0 em vez de quebrar. (Mensagens já apareciam 0 em prod, porque a Message está vazia.)
  • O @maxpantech/utils declara _count: InstanceCount como obrigatório no tipo Instance. Ninguém lê, mas vale deixar opcional (_count?:) na próxima vez que mexerem nesse pacote.

Plano de teste

  • tsc --noEmit, eslint e build (tsup) passam (o hook de pre-commit também valida)
  • stg: GET /instance/fetchInstances?instanceName=<x> devolve a instância sem _count, e ...&withCounts=true devolve as contagens
  • stg: a tela de conexão do backend, a lista admin de instâncias e as checagens de prontidão do ms-routines continuam funcionando
  • Prod: a query de Instance some do top SQL do Performance Insights

Refs

Refs maxpantech/infra-iac-aws#163

@adriano-rodrigues99 adriano-rodrigues99 changed the title fix(instance): make fetchInstances relation counts opt-in fix(instance): torna opcional a contagem de relações no fetchInstances Oct 15, 2026
O instanceInfo incluía `_count { Message, Contact, Chat }` em toda chamada
do fetchInstances. No Prisma 6 (sem relationJoins) isso vira
`LEFT JOIN (SELECT "instanceId", COUNT(*) FROM "Contact" WHERE 1=1 GROUP BY
"instanceId")`, que agrega as tabelas inteiras mesmo quando só uma
instância é pedida. Com ~1,3M contatos, essa era a query mais pesada do
RDS evolution-prod (50–70% da carga), disparada por serviços que só leem
connectionStatus e ownerJid.

- O `_count` só é devolvido com `?withCounts=true`.
- Quando pedido, as contagens saem de um groupBy por tabela filtrado pelos
  instanceIds pedidos (índice em instanceId), em vez de agregar as tabelas
  inteiras.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant