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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user