this repo has no description

:sparkles: better handling of error when making request

Changed files
+14 -4
internal
providers
+14 -4
internal/providers/provider.go
··· 39 attempts := 0 40 41 for _, provider := range p.providers { 42 select { 43 - case data := <-p.charge(ctx, payment, provider): 44 p.logger.Debug("[Payment] Received request successfully", 45 zap.String("provider", provider.GetName()), 46 zap.Int("attempt", attempts)) 47 48 return data, nil 49 case <-time.After(p.timeout): 50 p.logger.Error("[Payment] Timeout for provider to respond", 51 zap.String("provider", provider.GetName()), ··· 59 return nil, err 60 } 61 62 - func (p *UseProviders) charge(ctx context.Context, charge *domain.Payment, provider Provider) chan *domain.Provider { 63 ch := make(chan *domain.Provider) 64 65 go func() { 66 response, err := provider.Charge(ctx, charge) 67 if err != nil { 68 - close(ch) 69 return 70 } 71 ch <- response 72 }() 73 74 - return ch 75 }
··· 39 attempts := 0 40 41 for _, provider := range p.providers { 42 + dataCh, errCh := p.charge(ctx, payment, provider) 43 select { 44 + case data := <-dataCh: 45 p.logger.Debug("[Payment] Received request successfully", 46 zap.String("provider", provider.GetName()), 47 zap.Int("attempt", attempts)) 48 49 return data, nil 50 + case error := <-errCh: 51 + p.logger.Error("[Payment] Received request with error", 52 + zap.String("provider", provider.GetName()), 53 + zap.Int("attempt", attempts), 54 + zap.String("error", error.Error())) 55 + 56 + err = error 57 + continue 58 case <-time.After(p.timeout): 59 p.logger.Error("[Payment] Timeout for provider to respond", 60 zap.String("provider", provider.GetName()), ··· 68 return nil, err 69 } 70 71 + func (p *UseProviders) charge(ctx context.Context, charge *domain.Payment, provider Provider) (chan *domain.Provider, chan error) { 72 ch := make(chan *domain.Provider) 73 + chError := make(chan error) 74 75 go func() { 76 response, err := provider.Charge(ctx, charge) 77 if err != nil { 78 + chError <- err 79 return 80 } 81 ch <- response 82 }() 83 84 + return ch, chError 85 }