main.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "strings"
  6. "sync-mailchimp/mailchimp"
  7. "time"
  8. "github.com/sirupsen/logrus"
  9. "github.com/spf13/cobra"
  10. "github.com/spf13/viper"
  11. _ "github.com/go-sql-driver/mysql"
  12. )
  13. type Member struct {
  14. EmailAddress string `json:"email_address"`
  15. Status string `json:"status_if_new,omitempty"`
  16. }
  17. func initConfig() {
  18. viper.SetConfigName("config")
  19. viper.AddConfigPath(".")
  20. viper.AutomaticEnv()
  21. if err := viper.ReadInConfig(); err != nil {
  22. logrus.Fatalf("Error reading config file: %v", err)
  23. }
  24. }
  25. func getEmailsFromMySQL() ([]string, error) {
  26. db, err := sql.Open("mysql", viper.GetString("mysql.dsn"))
  27. if err != nil {
  28. return nil, err
  29. }
  30. defer db.Close()
  31. rows, err := db.Query(viper.GetString("mysql.query"))
  32. if err != nil {
  33. return nil, err
  34. }
  35. defer rows.Close()
  36. var emails []string
  37. for rows.Next() {
  38. var email string
  39. if err := rows.Scan(&email); err == nil {
  40. emails = append(emails, strings.ToLower(strings.TrimSpace(email)))
  41. }
  42. }
  43. return emails, nil
  44. }
  45. var rootCmd = &cobra.Command{
  46. Use: "sync-mailchimp",
  47. Short: "Sync MySQL emails with Mailchimp",
  48. Run: func(cmd *cobra.Command, args []string) {
  49. emails, err := getEmailsFromMySQL()
  50. if err != nil {
  51. logrus.Fatalf("MySQL error: %v", err)
  52. }
  53. api := mailchimp.NewMailchimpAPI()
  54. var toAdd []string
  55. for _, email := range emails {
  56. exists, err := api.EmailExists(email)
  57. if err != nil {
  58. logrus.Warnf("Check failed for %s: %v", email, err)
  59. continue
  60. }
  61. if !exists {
  62. toAdd = append(toAdd, email)
  63. }
  64. }
  65. if len(toAdd) > 0 {
  66. fmt.Printf("%d emails not found. Sync? [y/N]: ", len(toAdd))
  67. var input string
  68. fmt.Scanln(&input)
  69. if strings.ToLower(input) == "y" {
  70. for _, email := range toAdd {
  71. if err := api.AddEmail(email); err != nil {
  72. logrus.Errorf("Failed to add %s: %v", email, err)
  73. } else {
  74. logrus.Infof("Added %s", email)
  75. }
  76. }
  77. }
  78. }
  79. tag := time.Now().Format("January 2006")
  80. for _, email := range emails {
  81. if err := api.TagEmail(email, tag); err != nil {
  82. logrus.Warnf("Failed to tag %s: %v", email, err)
  83. } else {
  84. logrus.Infof("Tagged %s with %s", email, tag)
  85. }
  86. }
  87. },
  88. }
  89. func main() {
  90. cobra.OnInitialize(initConfig)
  91. if err := rootCmd.Execute(); err != nil {
  92. logrus.Fatalf("Command failed: %v", err)
  93. }
  94. }