Refactor parameter from int to entity

[MAILPOET-4372]
This commit is contained in:
Jan Lysý
2022-09-29 14:41:00 +02:00
committed by Aschepikov
parent c93c42518a
commit d2247a1c76
8 changed files with 38 additions and 34 deletions

View File

@@ -165,11 +165,11 @@ class AbandonedCart {
} }
$meta = [self::TASK_META_NAME => $cartProductIds]; $meta = [self::TASK_META_NAME => $cartProductIds];
$this->scheduler->scheduleOrRescheduleAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, (int)$subscriber->getId(), $meta); $this->scheduler->scheduleOrRescheduleAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, $subscriber, $meta);
} }
private function rescheduleAbandonedCartEmail(SubscriberEntity $subscriberEntity) { private function rescheduleAbandonedCartEmail(SubscriberEntity $subscriber) {
$this->scheduler->rescheduleAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, (int)$subscriberEntity->getId()); $this->scheduler->rescheduleAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, $subscriber);
} }
private function cancelAbandonedCartEmail() { private function cancelAbandonedCartEmail() {
@@ -177,7 +177,7 @@ class AbandonedCart {
if (!$subscriber) { if (!$subscriber) {
return; return;
} }
$this->scheduler->cancelAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, (int)$subscriber->getId()); $this->scheduler->cancelAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, $subscriber);
} }
private function getSubscriber(): ?SubscriberEntity { private function getSubscriber(): ?SubscriberEntity {

View File

@@ -188,7 +188,7 @@ class FirstPurchase {
'subscriber_id' => $subscriber->getId(), 'subscriber_id' => $subscriber->getId(),
] ]
); );
$this->scheduler->scheduleAutomaticEmail(WooCommerce::SLUG, self::SLUG, $checkEmailWasNotScheduled, $subscriber->getId(), $meta); $this->scheduler->scheduleAutomaticEmail(WooCommerce::SLUG, self::SLUG, $checkEmailWasNotScheduled, $subscriber, $meta);
} }
public function getCustomerOrderCount($customerEmail) { public function getCustomerOrderCount($customerEmail) {

View File

@@ -160,7 +160,7 @@ class PurchasedInCategory {
WooCommerce::SLUG, WooCommerce::SLUG,
self::SLUG, self::SLUG,
$schedulingCondition, $schedulingCondition,
$subscriber->getId(), $subscriber,
['orderedProductCategories' => $orderedProductCategories], ['orderedProductCategories' => $orderedProductCategories],
[$this, 'metaModifier'] [$this, 'metaModifier']
); );

View File

@@ -162,7 +162,7 @@ class PurchasedProduct {
WooCommerce::SLUG, WooCommerce::SLUG,
self::SLUG, self::SLUG,
$schedulingCondition, $schedulingCondition,
$subscriber->getId(), $subscriber,
['orderedProducts' => $orderedProducts], ['orderedProducts' => $orderedProducts],
[$this, 'metaModifier'] [$this, 'metaModifier']
); );

View File

@@ -8,10 +8,10 @@ use MailPoet\Entities\NewsletterOptionFieldEntity;
use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\ScheduledTaskSubscriberEntity; use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository; use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository; use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository;
use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Subscribers\SubscribersRepository;
class AutomaticEmailScheduler { class AutomaticEmailScheduler {
@@ -27,24 +27,26 @@ class AutomaticEmailScheduler {
/** @var ScheduledTaskSubscribersRepository */ /** @var ScheduledTaskSubscribersRepository */
private $scheduledTaskSubscribersRepository; private $scheduledTaskSubscribersRepository;
/** @var SubscribersRepository */
private $subscribersRepository;
public function __construct( public function __construct(
Scheduler $scheduler, Scheduler $scheduler,
ScheduledTasksRepository $scheduledTasksRepository, ScheduledTasksRepository $scheduledTasksRepository,
ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository, ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository,
SendingQueuesRepository $sendingQueuesRepository, SendingQueuesRepository $sendingQueuesRepository
SubscribersRepository $subscribersRepository
) { ) {
$this->scheduler = $scheduler; $this->scheduler = $scheduler;
$this->scheduledTasksRepository = $scheduledTasksRepository; $this->scheduledTasksRepository = $scheduledTasksRepository;
$this->scheduledTaskSubscribersRepository = $scheduledTaskSubscribersRepository; $this->scheduledTaskSubscribersRepository = $scheduledTaskSubscribersRepository;
$this->sendingQueuesRepository = $sendingQueuesRepository; $this->sendingQueuesRepository = $sendingQueuesRepository;
$this->subscribersRepository = $subscribersRepository;
} }
public function scheduleAutomaticEmail(string $group, string $event, $schedulingCondition = false, $subscriberId = false, $meta = false, $metaModifier = null) { public function scheduleAutomaticEmail(
string $group,
string $event,
?callable $schedulingCondition = null,
?SubscriberEntity $subscriber = null,
?array $meta = null,
?callable $metaModifier = null
) {
$newsletters = $this->scheduler->getNewsletters(NewsletterEntity::TYPE_AUTOMATIC, $group); $newsletters = $this->scheduler->getNewsletters(NewsletterEntity::TYPE_AUTOMATIC, $group);
if (empty($newsletters)) return false; if (empty($newsletters)) return false;
foreach ($newsletters as $newsletter) { foreach ($newsletters as $newsletter) {
@@ -62,11 +64,11 @@ class AutomaticEmailScheduler {
if (is_callable($metaModifier)) { if (is_callable($metaModifier)) {
$meta = $metaModifier($newsletter, $meta); $meta = $metaModifier($newsletter, $meta);
} }
$this->createAutomaticEmailScheduledTask($newsletter, $subscriberId, $meta); $this->createAutomaticEmailScheduledTask($newsletter, $subscriber, $meta);
} }
} }
public function scheduleOrRescheduleAutomaticEmail(string $group, string $event, int $subscriberId, array $meta): void { public function scheduleOrRescheduleAutomaticEmail(string $group, string $event, SubscriberEntity $subscriber, array $meta): void {
$newsletters = $this->scheduler->getNewsletters(NewsletterEntity::TYPE_AUTOMATIC, $group); $newsletters = $this->scheduler->getNewsletters(NewsletterEntity::TYPE_AUTOMATIC, $group);
if (empty($newsletters)) { if (empty($newsletters)) {
return; return;
@@ -78,16 +80,16 @@ class AutomaticEmailScheduler {
} }
// try to find existing scheduled task for given subscriber // try to find existing scheduled task for given subscriber
$task = $this->scheduledTasksRepository->findOneScheduledByNewsletterAndSubscriberId($newsletter, $subscriberId); $task = $this->scheduledTasksRepository->findOneScheduledByNewsletterAndSubscriber($newsletter, $subscriber);
if ($task) { if ($task) {
$this->rescheduleAutomaticEmailSendingTask($newsletter, $task, $meta); $this->rescheduleAutomaticEmailSendingTask($newsletter, $task, $meta);
} else { } else {
$this->createAutomaticEmailScheduledTask($newsletter, $subscriberId, $meta); $this->createAutomaticEmailScheduledTask($newsletter, $subscriber, $meta);
} }
} }
} }
public function rescheduleAutomaticEmail(string $group, string $event, int $subscriberId): void { public function rescheduleAutomaticEmail(string $group, string $event, SubscriberEntity $subscriber): void {
$newsletters = $this->scheduler->getNewsletters(NewsletterEntity::TYPE_AUTOMATIC, $group); $newsletters = $this->scheduler->getNewsletters(NewsletterEntity::TYPE_AUTOMATIC, $group);
if (empty($newsletters)) { if (empty($newsletters)) {
return; return;
@@ -99,14 +101,14 @@ class AutomaticEmailScheduler {
} }
// try to find existing scheduled task for given subscriber // try to find existing scheduled task for given subscriber
$task = $this->scheduledTasksRepository->findOneScheduledByNewsletterAndSubscriberId($newsletter, $subscriberId); $task = $this->scheduledTasksRepository->findOneScheduledByNewsletterAndSubscriber($newsletter, $subscriber);
if ($task) { if ($task) {
$this->rescheduleAutomaticEmailSendingTask($newsletter, $task); $this->rescheduleAutomaticEmailSendingTask($newsletter, $task);
} }
} }
} }
public function cancelAutomaticEmail(string $group, string $event, int $subscriberId): void { public function cancelAutomaticEmail(string $group, string $event, SubscriberEntity $subscriber): void {
$newsletters = $this->scheduler->getNewsletters(NewsletterEntity::TYPE_AUTOMATIC, $group); $newsletters = $this->scheduler->getNewsletters(NewsletterEntity::TYPE_AUTOMATIC, $group);
if (empty($newsletters)) { if (empty($newsletters)) {
return; return;
@@ -118,7 +120,7 @@ class AutomaticEmailScheduler {
} }
// try to find existing scheduled task for given subscriber // try to find existing scheduled task for given subscriber
$task = $this->scheduledTasksRepository->findOneScheduledByNewsletterAndSubscriberId($newsletter, $subscriberId); $task = $this->scheduledTasksRepository->findOneScheduledByNewsletterAndSubscriber($newsletter, $subscriber);
if ($task) { if ($task) {
$this->sendingQueuesRepository->deleteByTask($task); $this->sendingQueuesRepository->deleteByTask($task);
$this->scheduledTaskSubscribersRepository->deleteByTask($task); $this->scheduledTaskSubscribersRepository->deleteByTask($task);
@@ -128,8 +130,7 @@ class AutomaticEmailScheduler {
} }
} }
public function createAutomaticEmailScheduledTask(NewsletterEntity $newsletter, $subscriberId, $meta = false): ScheduledTaskEntity { public function createAutomaticEmailScheduledTask(NewsletterEntity $newsletter, ?SubscriberEntity $subscriber, ?array $meta = null): ScheduledTaskEntity {
$subscriber = $subscriberId ? $this->subscribersRepository->findOneById($subscriberId) : null;
$scheduledTask = new ScheduledTaskEntity(); $scheduledTask = new ScheduledTaskEntity();
$scheduledTask->setType(SendingQueue::TASK_TYPE); $scheduledTask->setType(SendingQueue::TASK_TYPE);
$scheduledTask->setStatus(SendingQueueEntity::STATUS_SCHEDULED); $scheduledTask->setStatus(SendingQueueEntity::STATUS_SCHEDULED);
@@ -165,7 +166,7 @@ class AutomaticEmailScheduler {
return $scheduledTask; return $scheduledTask;
} }
private function rescheduleAutomaticEmailSendingTask(NewsletterEntity $newsletter, ScheduledTaskEntity $scheduledTask, $meta = false) { private function rescheduleAutomaticEmailSendingTask(NewsletterEntity $newsletter, ScheduledTaskEntity $scheduledTask, ?array $meta = null): void {
$sendingQueue = $this->sendingQueuesRepository->findOneBy(['task' => $scheduledTask]); $sendingQueue = $this->sendingQueuesRepository->findOneBy(['task' => $scheduledTask]);
if (!$sendingQueue) { if (!$sendingQueue) {
return; return;

View File

@@ -9,6 +9,7 @@ use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\ScheduledTaskSubscriberEntity; use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Carbon\CarbonImmutable; use MailPoetVendor\Carbon\CarbonImmutable;
@@ -96,7 +97,7 @@ class ScheduledTasksRepository extends Repository {
->getResult(); ->getResult();
} }
public function findOneScheduledByNewsletterAndSubscriberId(NewsletterEntity $newsletter, int $subscriberId): ?ScheduledTaskEntity { public function findOneScheduledByNewsletterAndSubscriber(NewsletterEntity $newsletter, SubscriberEntity $subscriber): ?ScheduledTaskEntity {
$scheduledTask = $this->doctrineRepository->createQueryBuilder('st') $scheduledTask = $this->doctrineRepository->createQueryBuilder('st')
->join(SendingQueueEntity::class, 'sq', Join::WITH, 'st = sq.task') ->join(SendingQueueEntity::class, 'sq', Join::WITH, 'st = sq.task')
->join(ScheduledTaskSubscriberEntity::class, 'sts', Join::WITH, 'st = sts.task') ->join(ScheduledTaskSubscriberEntity::class, 'sts', Join::WITH, 'st = sts.task')
@@ -106,7 +107,7 @@ class ScheduledTasksRepository extends Repository {
->setMaxResults(1) ->setMaxResults(1)
->setParameter('status', ScheduledTaskEntity::STATUS_SCHEDULED) ->setParameter('status', ScheduledTaskEntity::STATUS_SCHEDULED)
->setParameter('newsletter', $newsletter) ->setParameter('newsletter', $newsletter)
->setParameter('subscriber', $subscriberId) ->setParameter('subscriber', $subscriber)
->getQuery() ->getQuery()
->getOneOrNullResult(); ->getOneOrNullResult();
// for phpstan because it detects mixed instead of entity // for phpstan because it detects mixed instead of entity

View File

@@ -10,11 +10,13 @@ use MailPoet\Entities\NewsletterOptionFieldEntity;
use MailPoet\Entities\NewsletterPostEntity; use MailPoet\Entities\NewsletterPostEntity;
use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Scheduler\AutomaticEmailScheduler; use MailPoet\Newsletter\Scheduler\AutomaticEmailScheduler;
use MailPoet\Tasks\Sending; use MailPoet\Tasks\Sending;
use MailPoet\Test\DataFactories\NewsletterOption; use MailPoet\Test\DataFactories\NewsletterOption;
use MailPoet\Test\DataFactories\Subscriber;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
class AbandonedCartContentTest extends \MailPoetTest { class AbandonedCartContentTest extends \MailPoetTest {
@@ -136,7 +138,7 @@ class AbandonedCartContentTest extends \MailPoetTest {
$this->setGroupAndEventOptions($newsletter); $this->setGroupAndEventOptions($newsletter);
$this->accBlock['displayType'] = 'titleOnly'; $this->accBlock['displayType'] = 'titleOnly';
$this->accBlock['pricePosition'] = 'hidden'; $this->accBlock['pricePosition'] = 'hidden';
$sendingTask = $this->createSendingTask($newsletter, 1, [AbandonedCart::TASK_META_NAME => []]); $sendingTask = $this->createSendingTask($newsletter, [AbandonedCart::TASK_META_NAME => []]);
$result = $this->block->render($newsletter, $this->accBlock, false, $sendingTask); $result = $this->block->render($newsletter, $this->accBlock, false, $sendingTask);
$encodedResult = json_encode($result); $encodedResult = json_encode($result);
expect($encodedResult)->equals('[]'); expect($encodedResult)->equals('[]');
@@ -183,10 +185,10 @@ class AbandonedCartContentTest extends \MailPoetTest {
]); ]);
} }
private function createSendingTask($newsletter, $subscriberId = null, $meta = null) { private function createSendingTask(NewsletterEntity $newsletter, ?array $meta = null) {
$subscriberId = $subscriberId ?: 1; // dummy default value $subscriber = (new Subscriber())->create(); // dummy default value
$meta = $meta ?: [AbandonedCart::TASK_META_NAME => array_slice($this->productIds, 0, 3)]; $meta = $meta ?: [AbandonedCart::TASK_META_NAME => array_slice($this->productIds, 0, 3)];
$scheduledTask = $this->automaticEmailScheduler->createAutomaticEmailScheduledTask($newsletter, $subscriberId, $meta); $scheduledTask = $this->automaticEmailScheduler->createAutomaticEmailScheduledTask($newsletter, $subscriber, $meta);
// this can be removed when SendingTask usage is removed from AbandonedCartContent // this can be removed when SendingTask usage is removed from AbandonedCartContent
$parisTask = ScheduledTask::findOne($scheduledTask->getId()); $parisTask = ScheduledTask::findOne($scheduledTask->getId());
$this->assertInstanceOf(ScheduledTask::class, $parisTask); $this->assertInstanceOf(ScheduledTask::class, $parisTask);

View File

@@ -67,7 +67,7 @@ class AutomaticEmailTest extends \MailPoetTest {
$this->assertInstanceOf(NewsletterEntity::class, $newsletter); $this->assertInstanceOf(NewsletterEntity::class, $newsletter);
$subscriber = (new SubscriberFactory())->create(); $subscriber = (new SubscriberFactory())->create();
$this->automaticEmailScheduler->createAutomaticEmailScheduledTask($newsletter, $subscriber->getId()); $this->automaticEmailScheduler->createAutomaticEmailScheduledTask($newsletter, $subscriber);
// new scheduled task should be created // new scheduled task should be created
$task = $this->scheduledTasksRepository->findOneByNewsletter($newsletter); $task = $this->scheduledTasksRepository->findOneByNewsletter($newsletter);
$currentTime = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp')); $currentTime = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp'));
@@ -92,7 +92,7 @@ class AutomaticEmailTest extends \MailPoetTest {
$subscriber = (new SubscriberFactory())->create(); $subscriber = (new SubscriberFactory())->create();
$meta = ['some' => 'value']; $meta = ['some' => 'value'];
$this->automaticEmailScheduler->createAutomaticEmailScheduledTask($newsletter, $subscriber->getId(), $meta); $this->automaticEmailScheduler->createAutomaticEmailScheduledTask($newsletter, $subscriber, $meta);
// new queue record should be created with meta data // new queue record should be created with meta data
$queue = $this->sendingQueuesRepository->findOneBy(['newsletter' => $newsletter]); $queue = $this->sendingQueuesRepository->findOneBy(['newsletter' => $newsletter]);
$this->assertInstanceOf(SendingQueueEntity::class, $queue); $this->assertInstanceOf(SendingQueueEntity::class, $queue);