|
@@ -1,13 +1,10 @@
|
|
|
package main
|
|
|
|
|
|
import (
|
|
|
- "crypto/md5"
|
|
|
"database/sql"
|
|
|
- "encoding/hex"
|
|
|
- "encoding/json"
|
|
|
"fmt"
|
|
|
- "net/http"
|
|
|
"strings"
|
|
|
+ "sync-mailchimp/mailchimp"
|
|
|
"time"
|
|
|
|
|
|
"github.com/sirupsen/logrus"
|
|
@@ -55,84 +52,6 @@ func getEmailsFromMySQL() ([]string, error) {
|
|
|
return emails, nil
|
|
|
}
|
|
|
|
|
|
-func emailHash(email string) string {
|
|
|
- hash := md5.Sum([]byte(strings.ToLower(email)))
|
|
|
- return hex.EncodeToString(hash[:])
|
|
|
-}
|
|
|
-
|
|
|
-func emailExists(email string) (bool, error) {
|
|
|
- hashStr := emailHash(email)
|
|
|
- url := fmt.Sprintf("https://%s.api.mailchimp.com/3.0/lists/%s/members/%s",
|
|
|
- viper.GetString("mailchimp.server"),
|
|
|
- viper.GetString("mailchimp.audience_id"),
|
|
|
- hashStr)
|
|
|
-
|
|
|
- req, _ := http.NewRequest("GET", url, nil)
|
|
|
- req.SetBasicAuth("anystring", viper.GetString("mailchimp.api_key"))
|
|
|
- resp, err := http.DefaultClient.Do(req)
|
|
|
- if err != nil {
|
|
|
- return false, err
|
|
|
- }
|
|
|
- defer resp.Body.Close()
|
|
|
- return resp.StatusCode == http.StatusOK, nil
|
|
|
-}
|
|
|
-
|
|
|
-func addEmail(email string) error {
|
|
|
- url := fmt.Sprintf("https://%s.api.mailchimp.com/3.0/lists/%s/members",
|
|
|
- viper.GetString("mailchimp.server"),
|
|
|
- viper.GetString("mailchimp.audience_id"))
|
|
|
- member := Member{
|
|
|
- EmailAddress: email,
|
|
|
- Status: "subscribed",
|
|
|
- }
|
|
|
- body, _ := json.Marshal(member)
|
|
|
-
|
|
|
- req, _ := http.NewRequest("POST", url, strings.NewReader(string(body)))
|
|
|
- req.SetBasicAuth("anystring", viper.GetString("mailchimp.api_key"))
|
|
|
- req.Header.Add("Content-Type", "application/json")
|
|
|
-
|
|
|
- resp, err := http.DefaultClient.Do(req)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- defer resp.Body.Close()
|
|
|
-
|
|
|
- if resp.StatusCode >= 400 {
|
|
|
- return fmt.Errorf("failed to add email: %s", email)
|
|
|
- }
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func tagEmail(email, tag string) error {
|
|
|
- hashStr := emailHash(email)
|
|
|
- url := fmt.Sprintf("https://%s.api.mailchimp.com/3.0/lists/%s/members/%s/tags",
|
|
|
- viper.GetString("mailchimp.server"),
|
|
|
- viper.GetString("mailchimp.audience_id"),
|
|
|
- hashStr)
|
|
|
-
|
|
|
- body := map[string]interface{}{
|
|
|
- "tags": []map[string]string{
|
|
|
- {"name": tag, "status": "active"},
|
|
|
- },
|
|
|
- }
|
|
|
- jsonBody, _ := json.Marshal(body)
|
|
|
-
|
|
|
- req, _ := http.NewRequest("POST", url, strings.NewReader(string(jsonBody)))
|
|
|
- req.SetBasicAuth("anystring", viper.GetString("mailchimp.api_key"))
|
|
|
- req.Header.Add("Content-Type", "application/json")
|
|
|
-
|
|
|
- resp, err := http.DefaultClient.Do(req)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- defer resp.Body.Close()
|
|
|
-
|
|
|
- if resp.StatusCode >= 400 {
|
|
|
- return fmt.Errorf("failed to tag email: %s", email)
|
|
|
- }
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
var rootCmd = &cobra.Command{
|
|
|
Use: "sync-mailchimp",
|
|
|
Short: "Sync MySQL emails with Mailchimp",
|
|
@@ -142,9 +61,11 @@ var rootCmd = &cobra.Command{
|
|
|
logrus.Fatalf("MySQL error: %v", err)
|
|
|
}
|
|
|
|
|
|
+ api := mailchimp.NewMailchimpAPI()
|
|
|
+
|
|
|
var toAdd []string
|
|
|
for _, email := range emails {
|
|
|
- exists, err := emailExists(email)
|
|
|
+ exists, err := api.EmailExists(email)
|
|
|
if err != nil {
|
|
|
logrus.Warnf("Check failed for %s: %v", email, err)
|
|
|
continue
|
|
@@ -160,7 +81,7 @@ var rootCmd = &cobra.Command{
|
|
|
fmt.Scanln(&input)
|
|
|
if strings.ToLower(input) == "y" {
|
|
|
for _, email := range toAdd {
|
|
|
- if err := addEmail(email); err != nil {
|
|
|
+ if err := api.AddEmail(email); err != nil {
|
|
|
logrus.Errorf("Failed to add %s: %v", email, err)
|
|
|
} else {
|
|
|
logrus.Infof("Added %s", email)
|
|
@@ -171,7 +92,7 @@ var rootCmd = &cobra.Command{
|
|
|
|
|
|
tag := time.Now().Format("January 2006")
|
|
|
for _, email := range emails {
|
|
|
- if err := tagEmail(email, tag); err != nil {
|
|
|
+ if err := api.TagEmail(email, tag); err != nil {
|
|
|
logrus.Warnf("Failed to tag %s: %v", email, err)
|
|
|
} else {
|
|
|
logrus.Infof("Tagged %s with %s", email, tag)
|