+14
-4
internal/providers/provider.go
+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
}