fix(tenants): o webhook de PAGAMENTO do Asaas morria no BFF

O arquivo 96-ingress-garmin-public.yaml foi criado para o callback do Garmin e
leva TODO o /api/public para o servico-bff. O BFF relaya o Garmin de proposito
(GarminBffController), mas NAO tem controlador para /api/public/webhooks/asaas —
so o financeiro tem (WebhookAsaasController).

Resultado nos quatro tenants: o aviso de pagamento do Asaas chegava ao BFF e
parava ali. O sintoma seria o pior possivel — a cobranca e paga e NUNCA baixada,
sem erro nenhum do nosso lado; o provedor so registra uma entrega recusada.

Esta dormente hoje porque nenhum dos quatro tem asaas-credentials (cada cliente
traz a propria chave, decisao de 19/09). Passaria a morder no primeiro cliente
que ligasse a cobranca — e o diagnostico comecaria pelo lado errado, olhando o
financeiro, que nunca recebeu nada.

O Traefik ordena por TAMANHO do prefixo, entao a rota nova vence a generica
sozinha; fica escrita primeiro mesmo assim, para ninguem reordenar sem perceber.

Achado a partir do scripts/conferir_rotas_publicas.py, que acusou o piloto. A
acusacao estava certa no problema e errada no alcance: ele le a copia PARCIAL do
monorepo, que nao tem o Ingress de nenhum dos quatro, e concluiu sobre um.
Medido no cluster, os quatro eram identicos e os quatro estavam quebrados.
This commit is contained in:
deploy
2026-09-22 15:01:32 +00:00
parent 2a4b387e37
commit 1dda8d518d
4 changed files with 96 additions and 0 deletions
@@ -15,6 +15,30 @@ spec:
- host: acme.athleticmap.influxdigital.com.br
http:
paths:
# O webhook de PAGAMENTO do Asaas, ANTES do /api/public generico.
#
# Aquele manda tudo de /api/public para o `servico-bff`, e o BFF NAO tem
# controlador para esta rota — so o financeiro tem
# (`WebhookAsaasController`). O BFF relaya o Garmin de proposito; o Asaas,
# nao. Sem esta linha o aviso de pagamento morre no BFF, e o sintoma e o
# pior possivel: **a cobranca e paga e nunca baixada**, sem erro do nosso
# lado — o provedor so registra uma entrega recusada.
#
# O Traefik ordena por TAMANHO do prefixo, entao esta (26 caracteres) vence
# `/api/public` (11) sozinha. Fica escrita primeiro mesmo assim, para
# ninguem reordenar sem perceber.
#
# `servico-financeiro` e o Service; num tenant consolidado ele aponta para
# o `runtime-operacao`, que e onde o financeiro roda de verdade.
#
# Quem autentica e o cabecalho `asaas-access-token`, no controlador.
- path: /api/public/webhooks/asaas
pathType: Prefix
backend:
service:
name: servico-financeiro
port:
number: 80
- path: /api/public
pathType: Prefix
backend:
@@ -15,6 +15,30 @@ spec:
- host: demo.athleticmap.influxdigital.com.br
http:
paths:
# O webhook de PAGAMENTO do Asaas, ANTES do /api/public generico.
#
# Aquele manda tudo de /api/public para o `servico-bff`, e o BFF NAO tem
# controlador para esta rota — so o financeiro tem
# (`WebhookAsaasController`). O BFF relaya o Garmin de proposito; o Asaas,
# nao. Sem esta linha o aviso de pagamento morre no BFF, e o sintoma e o
# pior possivel: **a cobranca e paga e nunca baixada**, sem erro do nosso
# lado — o provedor so registra uma entrega recusada.
#
# O Traefik ordena por TAMANHO do prefixo, entao esta (26 caracteres) vence
# `/api/public` (11) sozinha. Fica escrita primeiro mesmo assim, para
# ninguem reordenar sem perceber.
#
# `servico-financeiro` e o Service; num tenant consolidado ele aponta para
# o `runtime-operacao`, que e onde o financeiro roda de verdade.
#
# Quem autentica e o cabecalho `asaas-access-token`, no controlador.
- path: /api/public/webhooks/asaas
pathType: Prefix
backend:
service:
name: servico-financeiro
port:
number: 80
- path: /api/public
pathType: Prefix
backend:
@@ -15,6 +15,30 @@ spec:
- host: escolinha.athleticmap.influxdigital.com.br
http:
paths:
# O webhook de PAGAMENTO do Asaas, ANTES do /api/public generico.
#
# Aquele manda tudo de /api/public para o `servico-bff`, e o BFF NAO tem
# controlador para esta rota — so o financeiro tem
# (`WebhookAsaasController`). O BFF relaya o Garmin de proposito; o Asaas,
# nao. Sem esta linha o aviso de pagamento morre no BFF, e o sintoma e o
# pior possivel: **a cobranca e paga e nunca baixada**, sem erro do nosso
# lado — o provedor so registra uma entrega recusada.
#
# O Traefik ordena por TAMANHO do prefixo, entao esta (26 caracteres) vence
# `/api/public` (11) sozinha. Fica escrita primeiro mesmo assim, para
# ninguem reordenar sem perceber.
#
# `servico-financeiro` e o Service; num tenant consolidado ele aponta para
# o `runtime-operacao`, que e onde o financeiro roda de verdade.
#
# Quem autentica e o cabecalho `asaas-access-token`, no controlador.
- path: /api/public/webhooks/asaas
pathType: Prefix
backend:
service:
name: servico-financeiro
port:
number: 80
- path: /api/public
pathType: Prefix
backend:
@@ -15,6 +15,30 @@ spec:
- host: piloto.athleticmap.influxdigital.com.br
http:
paths:
# O webhook de PAGAMENTO do Asaas, ANTES do /api/public generico.
#
# Aquele manda tudo de /api/public para o `servico-bff`, e o BFF NAO tem
# controlador para esta rota — so o financeiro tem
# (`WebhookAsaasController`). O BFF relaya o Garmin de proposito; o Asaas,
# nao. Sem esta linha o aviso de pagamento morre no BFF, e o sintoma e o
# pior possivel: **a cobranca e paga e nunca baixada**, sem erro do nosso
# lado — o provedor so registra uma entrega recusada.
#
# O Traefik ordena por TAMANHO do prefixo, entao esta (26 caracteres) vence
# `/api/public` (11) sozinha. Fica escrita primeiro mesmo assim, para
# ninguem reordenar sem perceber.
#
# `servico-financeiro` e o Service; num tenant consolidado ele aponta para
# o `runtime-operacao`, que e onde o financeiro roda de verdade.
#
# Quem autentica e o cabecalho `asaas-access-token`, no controlador.
- path: /api/public/webhooks/asaas
pathType: Prefix
backend:
service:
name: servico-financeiro
port:
number: 80
- path: /api/public
pathType: Prefix
backend: