Skip to content

Perf/otimizacao - #8

Draft
glauberx86 wants to merge 9 commits into
mainfrom
perf/otimizacao
Draft

glauberx86 wants to merge 9 commits into
mainfrom
perf/otimizacao

Conversation

@glauberx86

Copy link
Copy Markdown
Member

No description provided.

glauberx86 and others added 9 commits September 13, 2026 02:16
- LOG_QUERIES=1 acrescenta "query" ao log do PrismaClient
- LOG_HTTP=1 loga "método caminho status duração_ms" por request via
  middleware em server/index.ts
- compression() registrado antes das rotas: gzip/brotli nas respostas
  (bundle JS/CSS e JSON grandes) — cada KB ajuda na viagem até o navegador
- index.html passa a ir com Cache-Control: no-cache (revalida a cada
  load para pegar deploy novo); assets com hash continuam immutable
- correção incidental: sendFile(path.join(...)) falhava com 404 quando
  o diretório do projeto tem algum segmento começando com "." (o
  módulo `send` aplica o check de dotfile no path absoluto inteiro);
  trocado para sendFile("index.html", { root: clientDist }), que checa
  só o path relativo ao root
- connection_limit do Prisma configurável via DB_CONNECTION_LIMIT, com
  padrão 10 em produção e 2 fora dela: o pooler do Supabase em modo
  sessão limita a 15 clientes no total, e um `npm run dev` local com 10
  conexões disputava slots com o container em produção (EMAXCONNSESSION)
- adiciona compression e @types/compression
… no hover

- login e recarregar a página passam a usar só a request de boot (/init) para
  saber quem é o usuário, eliminando uma chamada extra só para isso
- abrir uma pasta ou trocar de pasta dispara a busca na hora; o atraso de
  digitação só entra quando o usuário está de fato digitando num filtro, e
  uma busca em andamento é cancelada se a tela mudar antes dela terminar
- corrigido o cache do "pré-carregamento" ao passar o mouse pelas pastas na
  barra lateral: a chave usada para guardar o resultado agora é a mesma usada
  ao abrir a pasta, então o hover realmente evita a busca repetida; o
  pré-carregamento só dispara depois de um instante parado sobre a pasta e é
  cancelado se o mouse sair antes disso
- pastas passam a ser identificadas pelo nome (já único) tanto ao carregar a
  grade quanto ao mover/excluir em lote, permitindo abrir a grade de uma
  pasta em paralelo com o carregamento da barra lateral em vez de esperar por
  ela; a API continua aceitando o identificador antigo e devolve erro claro
  para um nome de pasta inexistente
… editar status

- Grid de operações: query principal, placas duplicadas e regras de prazo
  agora disparam juntas (antes a principal esperava terminar para só então
  buscar as outras duas).
- Editar o status de uma operação grava tudo em uma única instrução no banco
  (antes eram duas idas: uma para conferir o status atual, outra para salvar),
  sem mudar quando a data de status é atualizada.
- Novo cache em memória (server/lib/cache.ts) para dados que mudam pouco:
  lista de usuários do Supabase e ordem das colunas da grid. Fica quente por
  ~10 minutos e é invalidado nas telas de gestão de usuários assim que algo
  muda (criar, editar, bloquear, ativar, excluir).
- O servidor já aquece esses caches e outros dados de boot logo ao subir, para
  que o primeiro acesso de cada usuário não pague essa espera.
- A lista de faturistas só é buscada quando o formulário de criar/editar
  pasta está aberto, em vez de em toda navegação pela sidebar.
- Sessão própria de 30 dias guardada em cookie assinado, sem depender mais de
  chamadas ao Supabase a cada requisição para saber quem é o usuário logado
  (só login, logout e a tela de usuários continuam falando com o Supabase).
  Rebaixar ou bloquear alguém pelo painel passa a valer em poucos minutos.
- Tela de perfil: os dados da página carregam em paralelo, e renomear o
  próprio usuário usa o mesmo caminho administrativo já usado na tela de
  usuários, refletindo o novo nome sem precisar relogar.
- Removido código que não era mais usado depois dessas mudanças de sessão.
- A planilha de exportação (xlsx, ~1 MB) só é baixada quando o usuário
  realmente clica em "Exportar Excel", em vez de entrar no pacote inicial.
- Dashboard, Automações, Usuários, Perfil e Login viram pedaços separados do
  bundle, carregados só na primeira vez que a tela é aberta; a tela de
  operações (a mais usada) continua no pacote principal.
- Se um novo deploy apagar os pedaços antigos do site enquanto alguém ainda
  está com a aba aberta, o app recarrega a página sozinho para buscar a
  versão nova (no máximo uma vez por minuto, pra não entrar em loop).
- A folha de estilo das fontes do Google deixou de travar a primeira pintura
  da página: ela carrega em paralelo e só é aplicada quando termina.
…a toda

- Cache do resumo da dashboard no servidor passa de 30s para 60s, maior que
  o intervalo de atualização automática do cliente, para o segundo poll
  aproveitar o cache em vez de recalcular tudo de novo
- useDashboard e useDashboardFaturista mantêm os números anteriores na tela
  ao trocar de filtro, com uma leve redução de opacidade até a resposta
  nova chegar, em vez de sumir o conteúdo; o polling em segundo plano
  atualiza os números sem mexer na tela
- formatarMoeda reaproveita uma única instância de Intl.NumberFormat em vez
  de criar uma nova a cada valor formatado (grid e dashboard formatam muitos
  valores por render)
- Editar uma célula da grid de operações deixou de re-varrer todas as linhas
  carregadas a cada edição; a atualização local já era aplicada por outro
  caminho, então o passo redundante foi removido
- Contador global de requests em voo (app/lib/loading.ts) ligado ao
  fetch wrapper (app/lib/api.ts), acendendo uma faixa fina no topo
  (TopProgress) sempre que algo está carregando — grid, dashboard,
  troca de página, polls em segundo plano — sem depender só do React
  Query, já que a grid busca dados manualmente.
- Splash inicial e troca de rota lazy usam a mesma faixa/barrinha em
  vez de texto piscando, e a sidebar não troca mais o ícone por um
  spinner a cada request (evita re-render desnecessário).
- Novo componente Skeleton (bloco cinza pulsando) e util cn (clsx +
  tailwind-merge) reaproveitados para desenhar a forma do conteúdo
  enquanto carrega: grid de operações, dashboard (geral e por
  faturista), perfil e lista de prazos. O conteúdo não some mais para
  dar lugar a um texto — só aparece a faixa do topo quando já há dados
  em tela e o carregamento é uma atualização em segundo plano.
- Backup do estado anterior, remoção das linhas que saíram da planilha (modo
  Substituir) e inserção das novas linhas passam a ser feitos direto no
  Postgres (json_agg / json_populate_recordset), sem trazer a tabela inteira
  de operações para o Node nem fatiar a inserção em vários lotes.
- O parse da planilha roda antes de qualquer consulta ao banco, e o backup da
  versão anterior sai em paralelo com a busca das regras de automação, caindo
  de mais de dez idas sequenciais ao banco por importação para poucas.
- O parser evita reprocessar a planilha inteira só para achar a linha do
  cabeçalho e reaproveita as normalizações de nome de coluna já calculadas,
  deixando o parse mais leve em arquivos com milhares de linhas.
- A restauração de um snapshot ganha mais tempo de transação, para não
  estourar em planilhas maiores.
- Reabre e refaz automaticamente a primeira consulta que falhar por queda de
  conexão com o banco (comum após um tempo sem uso), sem o usuário precisar
  recarregar a página
- Mantém a conexão com o banco e o cache de usuários sempre "quentes" em
  produção, para a primeira requisição depois de um tempo parado não pagar o
  preço de reconectar
- Remove o cache condicional (ETag/304) das respostas da API, que fazia o
  navegador travar requisições repetidas sem ganho nenhum de velocidade
- Corrige o health check por HEAD na raiz do site, hoje respondendo 404
- Adiciona um header de diagnóstico (Server-Timing) nas rotas mais usadas,
  detalhando quanto tempo cada etapa (autenticação, banco, total) levou no
  servidor
- Evita que abrir/trocar de pasta na grid dispare requisições repetidas ou
  abortadas: limpar os filtros ao trocar de pasta não recria mais objetos
  desnecessários, e a busca reaproveita o resultado do prefetch feito no
  hover da sidebar em vez de refazer a mesma chamada
- Skeleton com cor própria (`--skeleton`) nos dois temas, em vez de reusar o
  tom de superfície, e bordas mais suaves na grade de carregamento da lista
- Limpa as linhas da pasta anterior ao trocar de pasta, para o skeleton
  aparecer no lugar delas em vez de piscar dados da pasta antiga
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.

2 participants