This repository has been archived by the owner on Aug 31, 2020. It is now read-only.
/
export.go
108 lines (89 loc) · 2.36 KB
/
export.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package main
import (
"encoding/json"
"errors"
"log"
"net/http"
"sync"
"github.com/ribtoks/listing/pkg/common"
)
var (
errInvalidNewsletter = errors.New("Invalid newsletter parameter")
emptySubscribers []*common.Subscriber
)
func (c *listingClient) fetchSubscribers(url string) ([]*common.Subscriber, error) {
log.Printf("About to fetch subscribers. url=%v", url)
if c.dryRun {
log.Println("Dry run mode. Exiting...")
return emptySubscribers, nil
}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
req.SetBasicAuth("any", c.authToken)
resp, err := c.client.Do(req)
if err != nil {
return nil, err
}
log.Printf("Received subscribers response. status=%v", resp.StatusCode)
defer resp.Body.Close()
ss := make([]*common.Subscriber, 0)
err = json.NewDecoder(resp.Body).Decode(&ss)
return ss, nil
}
func (c *listingClient) isSubscriberOK(s *common.Subscriber) bool {
if c.noUnconfirmed && !s.Confirmed() {
log.Printf("Skipping unconfirmed subscriber. created_at=%v confirmed_at=%v confirmed=%v", s.CreatedAt, s.ConfirmedAt, s.Confirmed())
return false
}
if c.noUnsubscribed && s.Unsubscribed() {
log.Printf("Skipping unsubscribed subscriber. created_at=%v unsubscribed_at=%v unsubscribed=%v", s.CreatedAt, s.UnsubscribedAt, s.Unsubscribed())
return false
}
if c.noConfirmed && s.Confirmed() {
log.Printf("Skipping confirmed subscriber. created_at=%v confirmed_at=%v confirmed=%v", s.CreatedAt, s.ConfirmedAt, s.Confirmed())
return false
}
if _, ok := c.complaints[s.Email]; ok {
log.Printf("Skipping bounced or complained subscriber. email=%v", s.Email)
return false
}
return true
}
func (c *listingClient) export(newsletter string) error {
if newsletter == "" {
return errInvalidNewsletter
}
endpoint, err := c.subscribersURL(newsletter)
if err != nil {
return err
}
var wg sync.WaitGroup
if !c.ignoreComplaints {
wg.Add(1)
go func() {
defer wg.Done()
err := c.updateComplaints()
if err != nil {
log.Printf("Failed to update complaints. err=%v", err)
}
}()
}
ss, err := c.fetchSubscribers(endpoint)
if err != nil {
return err
}
wg.Wait()
skipped := 0
for _, s := range ss {
if c.isSubscriberOK(s) {
c.printer.Append(s)
} else {
skipped += 1
}
}
c.printer.Render()
log.Printf("Exported subscribers. count=%v skipped=%v", len(ss), skipped)
return nil
}