43 lines
679 B
Go
43 lines
679 B
Go
package paymentsvc
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sync"
|
|
)
|
|
|
|
var ErrPaymentInProgress = errors.New("payment is already in progress")
|
|
|
|
type Provider interface {
|
|
Sale(ctx context.Context, req SaleRequest) (*Result, error)
|
|
}
|
|
|
|
type Service struct {
|
|
provider Provider
|
|
|
|
mu sync.Mutex
|
|
busy bool
|
|
}
|
|
|
|
func NewService(provider Provider) *Service {
|
|
return &Service{provider: provider}
|
|
}
|
|
|
|
func (s *Service) Sale(ctx context.Context, req SaleRequest) (*Result, error) {
|
|
s.mu.Lock()
|
|
if s.busy {
|
|
s.mu.Unlock()
|
|
return nil, ErrPaymentInProgress
|
|
}
|
|
s.busy = true
|
|
s.mu.Unlock()
|
|
|
|
defer func() {
|
|
s.mu.Lock()
|
|
s.busy = false
|
|
s.mu.Unlock()
|
|
}()
|
|
|
|
return s.provider.Sale(ctx, req)
|
|
}
|