@@ -70,58 +70,155 @@ public function __construct($pimcoreUserName = null, MailChimpExportService $exp
7070 $ this ->newsletterManager = $ newsletterManager ;
7171 }
7272
73- public function process ()
73+ public function syncStatusChanges ()
7474 {
7575 $ client = $ this ->exportService ->getApiClient ();
7676
7777 foreach ($ this ->newsletterManager ->getNewsletterProviderHandlers () as $ newsletterProviderHandler ) {
7878 if ($ newsletterProviderHandler instanceof Mailchimp) {
7979
8080 // get updates from the last 3 days
81- $ date = Carbon::createFromTimestamp (time () - (60 * 60 * 24 * 3 ));
81+ $ date = Carbon::createFromTimestamp (time () - (60 * 60 * 24 * 300 ));
8282 $ date = $ date ->toIso8601String ();
8383
84- $ result = $ client ->get (
85- $ this ->exportService ->getListResourceUrl ($ newsletterProviderHandler ->getListId (), 'members/?since_last_changed= ' . urlencode ($ date ))
86- );
87-
88- if ($ client ->success () && sizeof ($ result ['members ' ])) {
89- foreach ($ result ['members ' ] as $ row ) {
84+ $ count = 20 ;
85+ $ page = 0 ;
86+ while (true ) {
87+ $ result = $ client ->get (
88+ $ this ->exportService ->getListResourceUrl (
89+ $ newsletterProviderHandler ->getListId (),
90+ 'members/?since_last_changed= ' .urlencode ($ date ) . '&count= ' . $ count . '&offset= ' . ($ page * $ count )
91+ )
92+ );
93+
94+ if ($ client ->success () && sizeof ($ result ['members ' ])) {
95+ foreach ($ result ['members ' ] as $ row ) {
96+
97+ // var_dump($row);
98+ /**
99+ * @var MailchimpAwareCustomerInterface $customer
100+ */
101+ try {
102+ if (!$ customer = $ this ->customerProvider ->getActiveCustomerByEmail (
103+ $ row ['email_address ' ]
104+ )) {
105+ $ this ->getLogger ()->error (
106+ sprintf ('no active customer with email %s found ' , $ row ['email_address ' ])
107+ );
108+ }
109+ } catch (\Exception $ e ) {
110+ $ this ->getLogger ()->error (
111+ sprintf ('multiple active customers with email %s found ' , $ row ['email_address ' ])
112+ );
113+ }
90114
91- // var_dump($row);
92- /**
93- * @var MailchimpAwareCustomerInterface $customer
94- */
95- try {
96- if (!$ customer = $ this ->customerProvider ->getActiveCustomerByEmail ($ row ['email_address ' ])) {
97- $ this ->getLogger ()->error (sprintf ('no active customer with email %s found ' , $ row ['email_address ' ]));
115+ if (!$ customer ) {
116+ continue ;
98117 }
99- } catch (\RuntimeException $ e ) {
100- if (!$ customer = $ this ->customerProvider ->getActiveCustomerByEmail ($ row ['email_address ' ])) {
101- $ this ->getLogger ()->error (sprintf ('multiple active customers with email %s found ' , $ row ['email_address ' ]));
118+
119+ $ status = $ row ['status ' ];
120+
121+ $ statusChanged = $ this ->updateFromMailchimpProcessor ->updateNewsletterStatus (
122+ $ newsletterProviderHandler ,
123+ $ customer ,
124+ $ status
125+ );
126+ $ mergeFieldsChanged = $ this ->updateFromMailchimpProcessor ->processMergeFields (
127+ $ newsletterProviderHandler ,
128+ $ customer ,
129+ $ row ['merge_fields ' ]
130+ );
131+
132+ $ changed = $ statusChanged || $ mergeFieldsChanged ;
133+
134+ if ($ changed ) {
135+ $ this ->getLogger ()->info (
136+ sprintf ('customer id %s changed - updating... ' , $ customer ->getId ())
137+ );
138+ } else {
139+ $ this ->getLogger ()->info (
140+ sprintf ('customer id %s did not change - no update needed. ' , $ customer ->getId ())
141+ );
102142 }
103- }
104143
105- if (!$ customer ) {
106- continue ;
144+ $ this ->updateFromMailchimpProcessor ->saveCustomerIfChanged ($ customer , $ changed );
107145 }
108146
109- $ status = $ row ['status ' ];
147+ $ page ++;
148+ } else {
149+ break ;
150+ }
151+ }
152+ }
153+ }
154+ }
110155
111- $ statusChanged = $ this ->updateFromMailchimpProcessor ->updateNewsletterStatus ($ newsletterProviderHandler , $ customer , $ status );
112- $ mergeFieldsChanged = $ this ->updateFromMailchimpProcessor ->processMergeFields ($ newsletterProviderHandler , $ customer , $ row ['merge_fields ' ]);
156+ public function deleteNonExistingItems ()
157+ {
158+ $ client = $ this ->exportService ->getApiClient ();
113159
114- $ changed = $ statusChanged || $ mergeFieldsChanged ;
160+ foreach ($ this ->newsletterManager ->getNewsletterProviderHandlers () as $ newsletterProviderHandler ) {
161+ if ($ newsletterProviderHandler instanceof Mailchimp) {
115162
116- if ($ changed ) {
117- $ this ->getLogger ()->info (sprintf ('customer id %s changed - updating... ' , $ customer ->getId ()));
118- } else {
119- $ this ->getLogger ()->info (sprintf ('customer id %s did not change - no update needed. ' , $ customer ->getId ()));
120- }
163+ $ count = 20 ;
164+ $ page = 0 ;
165+ while (true ) {
166+ $ result = $ client ->get (
167+ $ this ->exportService ->getListResourceUrl ($ newsletterProviderHandler ->getListId (), 'members/?count= ' . $ count . '&offset= ' . ($ page * $ count ) )
168+ );
169+
170+ if ($ client ->success () && sizeof ($ result ['members ' ])) {
171+ foreach ($ result ['members ' ] as $ row ) {
172+
173+ $ list = $ this ->customerProvider ->getList ();
174+ $ list ->setCondition ('email = ? ' , $ row ['email_address ' ]);
121175
122- $ this ->updateFromMailchimpProcessor ->saveCustomerIfChanged ($ customer , $ changed );
176+ $ this ->getLogger ()->info (sprintf ('check email %s ' , $ row ['email_address ' ]));
177+ if ($ list ->count ()) {
178+ continue ;
179+ }
180+
181+ $ remoteId = $ client ->subscriberHash ($ row ['email_address ' ]);
182+
183+ $ this ->getLogger ()->notice (
184+ sprintf (
185+ '[MailChimp][CUSTOMER %s][%s] Delete email in mailchimp. Remote ID is %s ' ,
186+ $ row ['email_address ' ],
187+ $ newsletterProviderHandler ->getShortcut (),
188+ $ remoteId
189+ )
190+ );
191+
192+ $ client ->delete (
193+ $ this ->exportService ->getListResourceUrl ($ newsletterProviderHandler ->getListId (), sprintf ('members/%s ' , $ remoteId ))
194+ );
195+
196+ if ($ client ->success ()) {
197+ $ this ->getLogger ()->notice (
198+ sprintf (
199+ '[MailChimp][CUSTOMER %s][%s] Deletion was successful. Remote ID is %s ' ,
200+ $ row ['email_address ' ],
201+ $ newsletterProviderHandler ->getShortcut (),
202+ $ remoteId
203+ )
204+ );
205+ } else {
206+ $ this ->getLogger ()->error (
207+ sprintf (
208+ '[MailChimp][CUSTOMER %s][%s] Deletion failed. Remote ID is %s ' ,
209+ $ row ['email_address ' ],
210+ $ newsletterProviderHandler ->getShortcut (),
211+ $ remoteId
212+ )
213+ );
214+ }
215+ }
216+ $ page ++;
217+ } else {
218+ break ;
123219 }
124220 }
221+
125222 }
126223 }
127224 }
0 commit comments