rewrite psd integration
This commit is contained in:
71
utils/psd.go
71
utils/psd.go
@@ -7,17 +7,12 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
)
|
)
|
||||||
|
|
||||||
//nolint:gocritic // sync.Mutex is intended
|
|
||||||
type PSD struct {
|
type PSD struct {
|
||||||
sync.Mutex
|
|
||||||
cachedAt time.Time
|
|
||||||
cache map[string]bool
|
|
||||||
log *zerolog.Logger
|
log *zerolog.Logger
|
||||||
url *url.URL
|
url *url.URL
|
||||||
login string
|
login string
|
||||||
@@ -37,76 +32,50 @@ func NewPSD(baseURL, login, password string, log *zerolog.Logger) *PSD {
|
|||||||
return &PSD{url: uri, login: login, password: password, log: log}
|
return &PSD{url: uri, login: login, password: password, log: log}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PSD) Contains(email string) (bool, error) {
|
func (p *PSD) Contains(identifier string) (bool, error) {
|
||||||
if p.cachedAt.IsZero() || time.Since(p.cachedAt) > 10*time.Minute {
|
|
||||||
err := p.updateCache()
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p.Lock()
|
|
||||||
defer p.Unlock()
|
|
||||||
return p.cache[email], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PSD) Status(email string) string {
|
|
||||||
ok, err := p.Contains(email)
|
|
||||||
if !ok || err != nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return "👤"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PSD) updateCache() error {
|
|
||||||
p.Lock()
|
|
||||||
defer p.Unlock()
|
|
||||||
defer func() {
|
|
||||||
p.cachedAt = time.Now()
|
|
||||||
}()
|
|
||||||
|
|
||||||
if p.url == nil {
|
if p.url == nil {
|
||||||
return nil
|
return false, nil
|
||||||
}
|
}
|
||||||
cloned := *p.url
|
cloned := *p.url
|
||||||
uri := cloned.JoinPath("/emails")
|
uri := cloned.JoinPath("/node/" + identifier)
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), http.NoBody)
|
req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), http.NoBody)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.log.Error().Err(err).Msg("failed to create request")
|
return false, err
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
req.SetBasicAuth(p.login, p.password)
|
req.SetBasicAuth(p.login, p.password)
|
||||||
resp, err := http.DefaultClient.Do(req)
|
resp, err := http.DefaultClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return false, err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK {
|
||||||
err = fmt.Errorf("%s", resp.Status) //nolint:goerr113 // no need to wrap
|
err = fmt.Errorf("%s", resp.Status) //nolint:goerr113 // that's ok
|
||||||
p.log.Error().Err(err).Msg("failed to fetch PSD")
|
return false, err
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
datab, err := io.ReadAll(resp.Body)
|
datab, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.log.Error().Err(err).Msg("failed to read response")
|
return false, err
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
var psd []*PSDTarget
|
var psd []*PSDTarget
|
||||||
err = json.Unmarshal(datab, &psd)
|
err = json.Unmarshal(datab, &psd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.log.Error().Err(err).Msg("failed to unmarshal response")
|
return false, err
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p.cache = make(map[string]bool)
|
return len(psd) > 0, nil
|
||||||
for _, t := range psd {
|
|
||||||
for _, email := range t.Targets {
|
|
||||||
p.cache[email] = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
func (p *PSD) Status(email string) string {
|
||||||
|
ok, err := p.Contains(email)
|
||||||
|
if err != nil {
|
||||||
|
p.log.Error().Err(err).Str("email", email).Msg("error checking PSD")
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return "👤"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user