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];
$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) {
$this->scheduler->rescheduleAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, (int)$subscriberEntity->getId());
private function rescheduleAbandonedCartEmail(SubscriberEntity $subscriber) {
$this->scheduler->rescheduleAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, $subscriber);
}
private function cancelAbandonedCartEmail() {
@@ -177,7 +177,7 @@ class AbandonedCart {
if (!$subscriber) {
return;
}
$this->scheduler->cancelAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, (int)$subscriber->getId());
$this->scheduler->cancelAutomaticEmail(WooCommerceEmail::SLUG, self::SLUG, $subscriber);
}
private function getSubscriber(): ?SubscriberEntity {

View File

@@ -188,7 +188,7 @@ class FirstPurchase {
'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) {

View File

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

View File

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

View File

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

View File

@@ -9,6 +9,7 @@ use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Carbon\CarbonImmutable;
@@ -96,7 +97,7 @@ class ScheduledTasksRepository extends Repository {
->getResult();
}
public function findOneScheduledByNewsletterAndSubscriberId(NewsletterEntity $newsletter, int $subscriberId): ?ScheduledTaskEntity {
public function findOneScheduledByNewsletterAndSubscriber(NewsletterEntity $newsletter, SubscriberEntity $subscriber): ?ScheduledTaskEntity {
$scheduledTask = $this->doctrineRepository->createQueryBuilder('st')
->join(SendingQueueEntity::class, 'sq', Join::WITH, 'st = sq.task')
->join(ScheduledTaskSubscriberEntity::class, 'sts', Join::WITH, 'st = sts.task')
@@ -106,7 +107,7 @@ class ScheduledTasksRepository extends Repository {
->setMaxResults(1)
->setParameter('status', ScheduledTaskEntity::STATUS_SCHEDULED)
->setParameter('newsletter', $newsletter)
->setParameter('subscriber', $subscriberId)
->setParameter('subscriber', $subscriber)
->getQuery()
->getOneOrNullResult();
// 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\ScheduledTaskEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\ScheduledTask;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Scheduler\AutomaticEmailScheduler;
use MailPoet\Tasks\Sending;
use MailPoet\Test\DataFactories\NewsletterOption;
use MailPoet\Test\DataFactories\Subscriber;
use MailPoet\WP\Functions as WPFunctions;
class AbandonedCartContentTest extends \MailPoetTest {
@@ -136,7 +138,7 @@ class AbandonedCartContentTest extends \MailPoetTest {
$this->setGroupAndEventOptions($newsletter);
$this->accBlock['displayType'] = 'titleOnly';
$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);
$encodedResult = json_encode($result);
expect($encodedResult)->equals('[]');
@@ -183,10 +185,10 @@ class AbandonedCartContentTest extends \MailPoetTest {
]);
}
private function createSendingTask($newsletter, $subscriberId = null, $meta = null) {
$subscriberId = $subscriberId ?: 1; // dummy default value
private function createSendingTask(NewsletterEntity $newsletter, ?array $meta = null) {
$subscriber = (new Subscriber())->create(); // dummy default value
$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
$parisTask = ScheduledTask::findOne($scheduledTask->getId());
$this->assertInstanceOf(ScheduledTask::class, $parisTask);

View File

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