45 lines
844 B
Go
45 lines
844 B
Go
package email
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/sony/gobreaker"
|
|
)
|
|
|
|
type Sender struct {
|
|
endpoint string
|
|
breaker *gobreaker.CircuitBreaker
|
|
}
|
|
|
|
func NewSender(endpoint string) *Sender {
|
|
return &Sender{
|
|
endpoint: endpoint,
|
|
breaker: gobreaker.NewCircuitBreaker(gobreaker.Settings{
|
|
Name: "email-service",
|
|
MaxRequests: 3,
|
|
Interval: time.Minute,
|
|
Timeout: 10 * time.Second,
|
|
}),
|
|
}
|
|
}
|
|
|
|
func (s *Sender) SendInvite(ctx context.Context, email, teamName string) error {
|
|
_, err := s.breaker.Execute(func() (any, error) {
|
|
if s.endpoint == "" {
|
|
return nil, errors.New("email endpoint is empty")
|
|
}
|
|
if s.endpoint == "mock://email" {
|
|
return nil, nil
|
|
}
|
|
select {
|
|
case <-ctx.Done():
|
|
return nil, ctx.Err()
|
|
case <-time.After(20 * time.Millisecond):
|
|
return nil, nil
|
|
}
|
|
})
|
|
return err
|
|
}
|