From 1dda8d518d9201d544bdcbb0823176d37637f577 Mon Sep 17 00:00:00 2001 From: deploy Date: Tue, 22 Sep 2026 15:01:32 +0000 Subject: [PATCH] fix(tenants): o webhook de PAGAMENTO do Asaas morria no BFF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- tenants/acme/96-ingress-garmin-public.yaml | 24 +++++++++++++++++++ tenants/demo/96-ingress-garmin-public.yaml | 24 +++++++++++++++++++ .../escolinha/96-ingress-garmin-public.yaml | 24 +++++++++++++++++++ tenants/piloto/96-ingress-garmin-public.yaml | 24 +++++++++++++++++++ 4 files changed, 96 insertions(+) diff --git a/tenants/acme/96-ingress-garmin-public.yaml b/tenants/acme/96-ingress-garmin-public.yaml index 2af5fec..0a71fc2 100644 --- a/tenants/acme/96-ingress-garmin-public.yaml +++ b/tenants/acme/96-ingress-garmin-public.yaml @@ -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: diff --git a/tenants/demo/96-ingress-garmin-public.yaml b/tenants/demo/96-ingress-garmin-public.yaml index ae8abf6..efe7fa6 100644 --- a/tenants/demo/96-ingress-garmin-public.yaml +++ b/tenants/demo/96-ingress-garmin-public.yaml @@ -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: diff --git a/tenants/escolinha/96-ingress-garmin-public.yaml b/tenants/escolinha/96-ingress-garmin-public.yaml index 6cd8389..3479650 100644 --- a/tenants/escolinha/96-ingress-garmin-public.yaml +++ b/tenants/escolinha/96-ingress-garmin-public.yaml @@ -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: diff --git a/tenants/piloto/96-ingress-garmin-public.yaml b/tenants/piloto/96-ingress-garmin-public.yaml index f3db6b4..96678c1 100644 --- a/tenants/piloto/96-ingress-garmin-public.yaml +++ b/tenants/piloto/96-ingress-garmin-public.yaml @@ -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: