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