Skip to content

Commit d03f37f

Browse files
Refactor notification and error handling/logging
1 parent 063716e commit d03f37f

4 files changed

Lines changed: 78 additions & 24 deletions

File tree

app/Synchronizer/CrmToMailchimpSynchronizer.php

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
class CrmToMailchimpSynchronizer
3030
{
31-
use LogTrait;
31+
use LogTrait, NotificationTrait;
3232

3333
private const LOCK_BASE_FOLDER_NAME = 'locks';
3434
private const MAX_LOCK_TIME = 15 * 60; // 15 minutes
@@ -908,28 +908,6 @@ private function saveToSyncLater(int $crmId): void
908908
$entry->save();
909909
}
910910

911-
/**
912-
* Inform data owner that he should only add contact in the crm not in mailchimp
913-
*
914-
* @param array $dataOwner
915-
* @param array $mcData
916-
*/
917-
private function notifyAdminInvalidEmail(array $mcData)
918-
{
919-
$dataOwner = $this->config->getDataOwner();
920-
921-
$mailData = new \stdClass();
922-
$mailData->dataOwnerName = $dataOwner['name'];
923-
$mailData->contactFirstName = $mcData['merge_fields']['FNAME']; // todo: check if we cant get the field keys dynamically
924-
$mailData->contactLastName = $mcData['merge_fields']['LNAME']; // todo: dito
925-
$mailData->contactEmail = $mcData['email_address'];
926-
$mailData->adminEmail = env('ADMIN_EMAIL');
927-
$mailData->configName = $this->configName;
928-
929-
Mail::to($dataOwner['email'])
930-
->send(new InvalidEmailNotification($mailData));
931-
}
932-
933911
/**
934912
* Create a new database entry that marks the given record as already synced
935913
* for this revision so it can be skipped if the program runs twice.

app/Synchronizer/MailchimpToCrmWebhookSynchronizer.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ public function handleMailchimpUpdate(array $mcData)
4646

4747
$this->logWebhook('debug', $callType, $mailchimpId, "Sync single record from Mailchimp to CRM.");
4848

49+
$crmId = null;
50+
$crmData = [];
51+
4952
switch ($callType) {
5053
case self::MC_SUBSCRIBE:
5154
if (!$this->config->getIgnoreSubscribeThroughMailchimp()) {
@@ -123,6 +126,11 @@ public function handleMailchimpUpdate(array $mcData)
123126
return;
124127
}
125128

129+
if (empty($crmId)) {
130+
$this->logWebhook('info', $callType, $mailchimpId, "Cannot update member: CRM ID is missing.");
131+
return;
132+
}
133+
126134
try {
127135
$this->crmClient->put('member/' . $crmId, $crmData);
128136
} catch (ClientException $e) {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace App\Synchronizer;
4+
5+
use Illuminate\Support\Facades\Mail;
6+
use App\Mail\InvalidEmailNotification;
7+
8+
trait NotificationTrait
9+
{
10+
/**
11+
* Inform data owner about invalid email submission
12+
*
13+
* @param array $mcData
14+
*/
15+
private function notifyAdminInvalidEmail(array $mcData): void
16+
{
17+
$dataOwner = $this->config->getDataOwner();
18+
19+
$mailData = new \stdClass();
20+
$mailData->dataOwnerName = $dataOwner['name'];
21+
$mailData->contactFirstName = $mcData['merge_fields']['FNAME'] ?? '';
22+
$mailData->contactLastName = $mcData['merge_fields']['LNAME'] ?? '';
23+
$mailData->contactEmail = $mcData['email_address'];
24+
$mailData->adminEmail = env('ADMIN_EMAIL');
25+
$mailData->configName = $this->configName;
26+
27+
Mail::to($dataOwner['email'])
28+
->send(new InvalidEmailNotification($mailData));
29+
}
30+
}

app/Synchronizer/WebsiteToMailchimpSynchronizer.php

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,19 @@
55
use App\Synchronizer\Mapper\Mapper;
66
use App\Http\MailChimpClient;
77
use App\Synchronizer\Filter;
8+
use App\Exceptions\FakeEmailException;
9+
use App\Exceptions\InvalidEmailException;
10+
use App\Exceptions\AlreadyInListException;
11+
use App\Exceptions\CleanedEmailException;
12+
use App\Exceptions\UnsubscribedEmailException;
13+
use App\Exceptions\ArchivedException;
14+
use App\Exceptions\EmailComplianceException;
15+
use App\Exceptions\MailchimpTooManySubscriptionsException;
16+
use Illuminate\Support\Facades\Log;
817

918
class WebsiteToMailchimpSynchronizer
1019
{
20+
use NotificationTrait;
1121
/**
1222
* @var Config
1323
*/
@@ -69,6 +79,7 @@ public function __construct(string $configFileName)
6979
* @throws \App\Exceptions\MergeFieldException
7080
* @throws \App\Exceptions\MailchimpTooManySubscriptionsException
7181
* @throws \App\Exceptions\ArchivedException
82+
* @throws \App\Exceptions\CleanedEmailException
7283
*/
7384
public function syncSingle(array $websiteData)
7485
{
@@ -99,7 +110,34 @@ public function syncSingle(array $websiteData)
99110
$mailchimpData['status'] = 'subscribed';
100111

101112
// Add the subscriber to Mailchimp
102-
$response = $this->mailchimpClient->putSubscriber($mailchimpData);
113+
try {
114+
$response = $this->mailchimpClient->putSubscriber($mailchimpData);
115+
} catch (AlreadyInListException $e) {
116+
Log::debug("Subscriber already in list: {$mailchimpData['email_address']}");
117+
return ['status' => 'success'];
118+
} catch (InvalidEmailException $e) {
119+
Log::info("Invalid email address: {$mailchimpData['email_address']}");
120+
return ['status' => 'success'];
121+
} catch (FakeEmailException $e) {
122+
$this->notifyAdminInvalidEmail($mailchimpData);
123+
Log::info("Fake or invalid email detected: {$mailchimpData['email_address']}");
124+
return ['status' => 'success'];
125+
} catch (CleanedEmailException $e) {
126+
Log::info("Email marked as cleaned (bounced): {$mailchimpData['email_address']}");
127+
return ['status' => 'success'];
128+
} catch (UnsubscribedEmailException $e) {
129+
Log::info("Email previously unsubscribed: {$mailchimpData['email_address']}");
130+
return ['status' => 'success'];
131+
} catch (ArchivedException $e) {
132+
Log::info("Email is archived: {$mailchimpData['email_address']}");
133+
return ['status' => 'success'];
134+
} catch (EmailComplianceException $e) {
135+
Log::info("Email compliance issue: {$mailchimpData['email_address']}");
136+
return ['status' => 'success'];
137+
} catch (MailchimpTooManySubscriptionsException $e) {
138+
Log::info("Too many subscriptions from email: {$mailchimpData['email_address']}");
139+
return ['status' => 'success'];
140+
}
103141

104142
// Add tags to new subscriber
105143
$tags = [$this->config->getNewTag()];

0 commit comments

Comments
 (0)