this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

:sparkles: better handling of error when making request

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