Add method for sending confirmation email with duplicates check

[MAILPOET-2876]
This commit is contained in:
Rostislav Wolny
2020-09-04 10:50:19 +02:00
committed by Veljko V
parent 2697bbc9fe
commit c6bb38cc69
2 changed files with 34 additions and 1 deletions

View File

@ -32,6 +32,9 @@ class ConfirmationEmailMailer {
/** @var SubscriptionUrlFactory */ /** @var SubscriptionUrlFactory */
private $subscriptionUrlFactory; private $subscriptionUrlFactory;
/** @var array Cache for confirmation emails sent within a request */
private $sentEmails = [];
public function __construct(Mailer $mailer, WPFunctions $wp, SettingsController $settings, SubscriptionUrlFactory $subscriptionUrlFactory) { public function __construct(Mailer $mailer, WPFunctions $wp, SettingsController $settings, SubscriptionUrlFactory $subscriptionUrlFactory) {
$this->mailer = $mailer; $this->mailer = $mailer;
$this->wp = $wp; $this->wp = $wp;
@ -40,6 +43,18 @@ class ConfirmationEmailMailer {
$this->subscriptionUrlFactory = $subscriptionUrlFactory; $this->subscriptionUrlFactory = $subscriptionUrlFactory;
} }
/**
* Use this method if you want to make sure the confirmation email
* is not sent multiple times within a single request
* e.g. if sending confirmation emails from hooks
*/
public function sendConfirmationEmailOnce(Subscriber $subscriber): bool {
if (isset($this->sentEmails[$subscriber->id])) {
return true;
}
return $this->sendConfirmationEmail($subscriber);
}
public function sendConfirmationEmail(Subscriber $subscriber) { public function sendConfirmationEmail(Subscriber $subscriber) {
$signupConfirmation = $this->settings->get('signup_confirmation'); $signupConfirmation = $this->settings->get('signup_confirmation');
if ((bool)$signupConfirmation['enabled'] === false) { if ((bool)$signupConfirmation['enabled'] === false) {
@ -99,10 +114,12 @@ class ConfirmationEmailMailer {
$subscriber->setError(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet')); $subscriber->setError(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet'));
return false; return false;
}; };
if (!$this->wp->isUserLoggedIn()) { if (!$this->wp->isUserLoggedIn()) {
$subscriber->countConfirmations++; $subscriber->countConfirmations++;
$subscriber->save(); $subscriber->save();
} }
$this->sentEmails[$subscriber->id] = true;
return true; return true;
} catch (\Exception $e) { } catch (\Exception $e) {
$subscriber->setError(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet')); $subscriber->setError(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet'));

View File

@ -18,6 +18,12 @@ class ConfirmationEmailMailerTest extends \MailPoetTest {
$subcriptionUrlFacroryMock = $this->createMock(SubscriptionUrlFactory::class); $subcriptionUrlFacroryMock = $this->createMock(SubscriptionUrlFactory::class);
$subcriptionUrlFacroryMock->method('getConfirmationUrl')->willReturn('http://example.com'); $subcriptionUrlFacroryMock->method('getConfirmationUrl')->willReturn('http://example.com');
$settings = $this->diContainer->get(SettingsController::class);
$settings->set(
'signup_confirmation.body',
$settings->get('signup_confirmation.body') . "\nLists: [lists_to_confirm]"
);
$subscriber = Subscriber::create(); $subscriber = Subscriber::create();
$subscriber->hydrate([ $subscriber->hydrate([
'first_name' => 'John', 'first_name' => 'John',
@ -26,6 +32,7 @@ class ConfirmationEmailMailerTest extends \MailPoetTest {
'status' => 'unconfirmed', 'status' => 'unconfirmed',
'source' => 'api', 'source' => 'api',
]); ]);
$subscriber->save();
$mailer = Stub::makeEmpty(Mailer::class, [ $mailer = Stub::makeEmpty(Mailer::class, [
'send' => 'send' =>
@ -37,6 +44,7 @@ class ConfirmationEmailMailerTest extends \MailPoetTest {
'subscriber_status' => 'unconfirmed', 'subscriber_status' => 'unconfirmed',
'subscriber_source' => 'api', 'subscriber_source' => 'api',
]); ]);
return ['response' => true];
}), }),
], $this); ], $this);
@ -58,7 +66,15 @@ class ConfirmationEmailMailerTest extends \MailPoetTest {
[$segment->id] [$segment->id]
); );
$sender->sendConfirmationEmail($subscriber); $result = $sender->sendConfirmationEmail($subscriber);
expect($result)->true();
codecept_debug($subscriber);
expect($subscriber->countConfirmations)->equals(1);
$sender->sendConfirmationEmailOnce($subscriber);
$subscriberFromDb = Subscriber::findOne($subscriber->id);
expect($subscriberFromDb->countConfirmations)->equals(1);
expect($subscriber->countConfirmations)->equals(1);
} }
public function testItSetsErrorsWhenConfirmationEmailCannotBeSent() { public function testItSetsErrorsWhenConfirmationEmailCannotBeSent() {