Não enfileirar UpdatePix quando o pix já existe
TLDR: Para de enfileirar
Payments::UpdatePixJoba partir deOrders#showquandopayment.pixjá está preenchido, eliminando dezenas de jobs no-op por checkout causados pelo polling do frontend.
Contexto
Um único PIX gerado pela interface está produzindo dezenas de Payments::UpdatePixJob no GoodJob — todos succeeded em ~0 s, todos no-op.
O API::V1::OrdersController#show enfileira Payments::UpdatePixJob.perform_later(order.id) em toda requisição. O frontend usa esse endpoint para duas coisas:
- Buscar o código do PIX após o checkout (primeira chamada —
payment.pixainda vazio) - Pollar
payment.statusesperando a confirmação do pagamento (chamadas subsequentes —payment.pixjá preenchido)
O UpdatePixJob existe apenas como fallback para popular payment.pix. O status do pagamento (paid?) é atualizado por outro caminho — webhook POST /zeuspay/payment_statuses → Payments::UpdateStatusFlow —, então o polling do frontend não depende do job.
Resultado: a partir da 2ª chamada de show, todo job enfileirado é desperdício — sai cedo via return if hash_pix.present? em Payments::UpdatePix#call. Isso infla a fila payments, contribui para o R14 do dyno de jobs no Heroku e polui o painel do GoodJob.
Continuação da task pai fix: jobs dyno estourando memória no Heroku.
Objetivos
- Eliminar o enfileiramento redundante de
Payments::UpdatePixJobquando opixjá está preenchido - Reduzir a pressão na fila
paymentse no dyno de jobs
Fora de escopo
- Alterar o caminho de atualização do status do pagamento — continua sendo o webhook
Mudanças
app/controllers/api/v1/orders_controller.rb: só enfileirarPayments::UpdatePixJob.perform_later(order.id)quandoorder.payment.present? && order.payment.pix.blank?spec/requests/api/v1/orders_spec.rb(ou equivalente): cobrir os dois cenários — pix ausente (enfileira) e pix presente (não enfileira)
Como verificar
- A primeira chamada a
GET /api/v1/me/orders/:idapós o checkout (compayment.pixvazio) enfileira 1Payments::UpdatePixJob - Chamadas subsequentes ao mesmo endpoint (com
payment.pixjá preenchido) não enfileiram nenhum job - O polling do status do pagamento (
paid?) continua funcionando via webhook - Os testes do controller cobrem ambos os ramos
Documentação
Nenhuma mudança de documentação necessária.