package main import ( "database/sql" "fmt" "strings" "sync-mailchimp/mailchimp" "time" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" _ "github.com/go-sql-driver/mysql" ) type Member struct { EmailAddress string `json:"email_address"` Status string `json:"status_if_new,omitempty"` } func initConfig() { viper.SetConfigName("config") viper.AddConfigPath(".") viper.AutomaticEnv() if err := viper.ReadInConfig(); err != nil { logrus.Fatalf("Error reading config file: %v", err) } } func getEmailsFromMySQL() ([]string, error) { db, err := sql.Open("mysql", viper.GetString("mysql.dsn")) if err != nil { return nil, err } defer db.Close() rows, err := db.Query(viper.GetString("mysql.query")) if err != nil { return nil, err } defer rows.Close() var emails []string for rows.Next() { var email string if err := rows.Scan(&email); err == nil { emails = append(emails, strings.ToLower(strings.TrimSpace(email))) } } return emails, nil } var rootCmd = &cobra.Command{ Use: "sync-mailchimp", Short: "Sync MySQL emails with Mailchimp", Run: func(cmd *cobra.Command, args []string) { emails, err := getEmailsFromMySQL() if err != nil { logrus.Fatalf("MySQL error: %v", err) } api := mailchimp.NewMailchimpAPI() var toAdd []string for _, email := range emails { exists, err := api.EmailExists(email) if err != nil { logrus.Warnf("Check failed for %s: %v", email, err) continue } if !exists { toAdd = append(toAdd, email) } } if len(toAdd) > 0 { fmt.Printf("%d emails not found. Sync? [y/N]: ", len(toAdd)) var input string fmt.Scanln(&input) if strings.ToLower(input) == "y" { for _, email := range toAdd { if err := api.AddEmail(email); err != nil { logrus.Errorf("Failed to add %s: %v", email, err) } else { logrus.Infof("Added %s", email) } } } } tag := time.Now().Format("January 2006") for _, email := range emails { 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) } } }, } func main() { cobra.OnInitialize(initConfig) if err := rootCmd.Execute(); err != nil { logrus.Fatalf("Command failed: %v", err) } }