Track last sending at

MAILPOET-4998
This commit is contained in:
John Oleksowicz
2023-06-05 16:12:22 -05:00
committed by Aschepikov
parent 0e9b96d0b7
commit b22217420f
4 changed files with 59 additions and 0 deletions

View File

@@ -179,6 +179,11 @@ class SendingQueue {
return;
}
$isTransactional = in_array($newsletter->type, [
NewsletterEntity::TYPE_AUTOMATION_TRANSACTIONAL,
NewsletterEntity::TYPE_WC_TRANSACTIONAL_EMAIL,
]);
// clone the original object to be used for processing
$_newsletter = (object)$newsletter->asArray();
$_newsletter->options = $newsletterEntity->getOptionsAsArray();
@@ -266,6 +271,10 @@ class SendingQueue {
$foundSubscribers,
$timer
);
if (!$isTransactional) {
$now = Carbon::createFromTimestamp((int)current_time('timestamp'));
$this->subscribersRepository->bulkUpdateLastSendingAt($foundSubscribersIds, $now);
}
$this->loggerFactory->getLogger(LoggerFactory::TOPIC_NEWSLETTERS)->info(
'after queue chunk processing',
['newsletter_id' => $newsletter->id, 'task_id' => $queue->taskId]

View File

@@ -2,6 +2,7 @@
namespace MailPoet\Subscribers;
use DateTimeInterface;
use MailPoet\Config\SubscriberChangesNotifier;
use MailPoet\Doctrine\Repository;
use MailPoet\Entities\SegmentEntity;
@@ -287,6 +288,21 @@ class SubscribersRepository extends Repository {
return count($ids);
}
public function bulkUpdateLastSendingAt(array $ids, DateTimeInterface $dateTime): int {
if (empty($ids)) {
return 0;
}
$this->entityManager->createQueryBuilder()
->update(SubscriberEntity::class, 's')
->set('s.lastSendingAt', ':lastSendingAt')
->where('s.id IN (:ids)')
->setParameter('lastSendingAt', $dateTime)
->setParameter('ids', $ids)
->getQuery()
->execute();
return count($ids);
}
public function findWpUserIdAndEmailByEmails(array $emails): array {
return $this->entityManager->createQueryBuilder()
->select('s.wpUserId AS wp_user_id, LOWER(s.email) AS email')

View File

@@ -413,7 +413,10 @@ class SendingQueueTest extends \MailPoetTest {
]
)
);
expect($this->subscriber->getLastSendingAt())->null();
$sendingQueueWorker->process();
$this->subscribersRepository->refresh($this->subscriber);
expect($this->subscriber->getLastSendingAt())->notNull();
// newsletter status is set to sent
$updatedNewsletter = Newsletter::findOne($this->newsletter->id);
@@ -538,7 +541,10 @@ class SendingQueueTest extends \MailPoetTest {
]
)
);
expect($this->subscriber->getLastSendingAt())->null();
$sendingQueueWorker->process();
$this->subscribersRepository->refresh($this->subscriber);
expect($this->subscriber->getLastSendingAt())->notNull();
// newsletter status is set to sent
$updatedNewsletter = Newsletter::findOne($this->newsletter->id);
@@ -1000,6 +1006,9 @@ class SendingQueueTest extends \MailPoetTest {
$this->assertInstanceOf(SendingQueueEntity::class, $sendingQueue);
$this->sendingQueuesRepository->refresh($sendingQueue);
expect($sendingQueue->getCountTotal())->equals($expectSending ? 1 : 0);
// Transactional emails shouldn't update last sending at
$this->subscribersRepository->refresh($subscriber);
expect($subscriber->getLastSendingAt())->null();
}
public function dataForTestItSendsTransactionalEmails(): array {

View File

@@ -3,6 +3,7 @@
namespace MailPoet\Subscribers;
use DateTimeImmutable;
use DateTimeInterface;
use MailPoet\Entities\CustomFieldEntity;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberCustomFieldEntity;
@@ -80,6 +81,30 @@ class SubscribersRepositoryTest extends \MailPoetTest {
expect($subscriberTwo->getDeletedAt())->notNull();
}
public function testItBulkUpdatesLastSendingAt(): void {
$subscriberOne = $this->createSubscriber('one@e.com');
$subscriberTwo = $this->createSubscriber('two@e.com');
$subscriberThree = $this->createSubscriber('three@e.com');
expect($subscriberOne->getLastSendingAt())->null();
expect($subscriberTwo->getLastSendingAt())->null();
expect($subscriberThree->getLastSendingAt())->null();
$idsToUpdate = [
$subscriberOne->getId(),
$subscriberThree->getId(),
];
$now = new DateTimeImmutable();
$this->repository->bulkUpdateLastSendingAt($idsToUpdate, $now);
$this->repository->refresh($subscriberOne);
$this->repository->refresh($subscriberTwo);
$this->repository->refresh($subscriberThree);
$this->assertInstanceOf(DateTimeInterface::class, $subscriberOne->getLastSendingAt());
expect($subscriberOne->getLastSendingAt()->getTimestamp())->equals($now->getTimestamp());
expect($subscriberTwo->getLastSendingAt())->null();
$this->assertInstanceOf(DateTimeInterface::class, $subscriberThree->getLastSendingAt());
expect($subscriberThree->getLastSendingAt()->getTimestamp())->equals($now->getTimestamp());
}
public function testItBulkDeleteSubscribers(): void {
$subscriberOne = $this->createSubscriber('one@delete.com', new DateTimeImmutable());
$subscriberTwo = $this->createSubscriber('two@delete.com', new DateTimeImmutable());