From 43e1e7d049b1ac61fa6938d5b3e620a4341e23cb Mon Sep 17 00:00:00 2001 From: Aine Date: Mon, 12 Feb 2024 19:03:41 +0200 Subject: [PATCH] rewrite psd integration --- utils/psd.go | 75 +++++++++++++++------------------------------------- 1 file changed, 22 insertions(+), 53 deletions(-) diff --git a/utils/psd.go b/utils/psd.go index a731231..7d94d34 100644 --- a/utils/psd.go +++ b/utils/psd.go @@ -7,17 +7,12 @@ import ( "io" "net/http" "net/url" - "sync" "time" "github.com/rs/zerolog" ) -//nolint:gocritic // sync.Mutex is intended type PSD struct { - sync.Mutex - cachedAt time.Time - cache map[string]bool log *zerolog.Logger url *url.URL 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} } -func (p *PSD) Contains(email 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() - }() - +func (p *PSD) Contains(identifier string) (bool, error) { if p.url == nil { - return nil + return false, nil } cloned := *p.url - uri := cloned.JoinPath("/emails") + uri := cloned.JoinPath("/node/" + identifier) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), http.NoBody) if err != nil { - p.log.Error().Err(err).Msg("failed to create request") - return err + return false, err } req.SetBasicAuth(p.login, p.password) resp, err := http.DefaultClient.Do(req) if err != nil { - return err + return false, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - err = fmt.Errorf("%s", resp.Status) //nolint:goerr113 // no need to wrap - p.log.Error().Err(err).Msg("failed to fetch PSD") - return err + err = fmt.Errorf("%s", resp.Status) //nolint:goerr113 // that's ok + return false, err } datab, err := io.ReadAll(resp.Body) if err != nil { - p.log.Error().Err(err).Msg("failed to read response") - return err + return false, err } var psd []*PSDTarget err = json.Unmarshal(datab, &psd) if err != nil { - p.log.Error().Err(err).Msg("failed to unmarshal response") - return err + return false, err } - p.cache = make(map[string]bool) - for _, t := range psd { - for _, email := range t.Targets { - p.cache[email] = true - } - } - - return nil + return len(psd) > 0, 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 "👤" }