Não enfileirar UpdatePix quando o pix já existe

TLDR: Para de enfileirar Payments::UpdatePixJob a partir de Orders#show quando payment.pix já 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:

  1. Buscar o código do PIX após o checkout (primeira chamada — payment.pix ainda vazio)
  2. Pollar payment.status esperando a confirmação do pagamento (chamadas subsequentes — payment.pix já 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::UpdatePixJob quando o pix já está preenchido
  • Reduzir a pressão na fila payments e 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ó enfileirar Payments::UpdatePixJob.perform_later(order.id) quando order.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/:id após o checkout (com payment.pix vazio) enfileira 1 Payments::UpdatePixJob
  • Chamadas subsequentes ao mesmo endpoint (com payment.pix já 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.