fix(cdi): cachear resposta vazia do BCB até 23:59 quando dado ainda não publicado

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
This commit is contained in:
2026-05-29 00:31:00 -03:00
parent 3c13c85081
commit a188bcec3f
+7 -2
View File
@@ -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) log.Printf("[cdi] account=%d calling BCB for [%s, %s]", a.ID, startDate, yesterday)
rates, err := s.fetchCDIRates(startDate, yesterday) rates, err := s.fetchCDIRates(startDate, yesterday)
if err != nil { 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 return nil
} }
log.Printf("[cdi] account=%d BCB returned %d rates", a.ID, len(rates)) 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) resp, err := s.client.Get(url)
if err != nil { if err != nil {
// sem conectividade — não cachear, tentar na próxima request
return nil, err return nil, err
} }
defer resp.Body.Close() defer resp.Body.Close()
@@ -201,7 +202,11 @@ func (s *CDIYieldService) fetchCDIRates(startDate, endDate string) ([]bcbEntry,
Valor string `json:"valor"` Valor string `json:"valor"`
} }
if err := json.NewDecoder(resp.Body).Decode(&raw); err != nil { 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 var entries []bcbEntry