rewrite psd integration

This commit is contained in:
Aine
2024-02-12 19:03:41 +02:00
parent dd0ad4c245
commit 43e1e7d049

View File

@@ -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 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 nil return ""
}
if !ok {
return ""
}
return "👤"
} }