From a188bcec3fa5a8bd23f0ac30b210d6cfdaf84997 Mon Sep 17 00:00:00 2001 From: Mlcarvalho1 Date: Fri, 29 May 2026 00:31:00 -0300 Subject: [PATCH] =?UTF-8?q?fix(cdi):=20cachear=20resposta=20vazia=20do=20B?= =?UTF-8?q?CB=20at=C3=A9=2023:59=20quando=20dado=20ainda=20n=C3=A3o=20publ?= =?UTF-8?q?icado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BCB retorna objeto de erro (não array) quando a taxa do dia ainda não foi publicada. Antes: decode falhava, cache ficava vazio, BCB era chamado a cada request. Agora: decode error → put(nil) no cache → requests seguintes servidas do cache em <1ms até fim do dia --- apps/api/internal/service/cdi.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/api/internal/service/cdi.go b/apps/api/internal/service/cdi.go index 5d592ba..85f0603 100644 --- a/apps/api/internal/service/cdi.go +++ b/apps/api/internal/service/cdi.go @@ -106,7 +106,7 @@ func (s *CDIYieldService) ApplyYield(ctx context.Context, a *model.Account) erro log.Printf("[cdi] account=%d calling BCB for [%s, %s]", a.ID, startDate, yesterday) rates, err := s.fetchCDIRates(startDate, yesterday) if err != nil { - log.Printf("[cdi] account=%d BCB error: %v", a.ID, err) + log.Printf("[cdi] account=%d BCB unreachable: %v", a.ID, err) return nil } log.Printf("[cdi] account=%d BCB returned %d rates", a.ID, len(rates)) @@ -192,6 +192,7 @@ func (s *CDIYieldService) fetchCDIRates(startDate, endDate string) ([]bcbEntry, resp, err := s.client.Get(url) if err != nil { + // sem conectividade — não cachear, tentar na próxima request return nil, err } defer resp.Body.Close() @@ -201,7 +202,11 @@ func (s *CDIYieldService) fetchCDIRates(startDate, endDate string) ([]bcbEntry, Valor string `json:"valor"` } if err := json.NewDecoder(resp.Body).Decode(&raw); err != nil { - return nil, err + // BCB retornou objeto de erro em vez de array (dado ainda não publicado) + // cachear resultado vazio até fim do dia para não bater no BCB a cada request + log.Printf("[cdi] BCB decode error para [%s, %s]: %v — cacheando vazio até 23:59", startDate, endDate, err) + s.cache.put(nil, startDate, endDate) + return nil, nil } var entries []bcbEntry