Track last sending at
MAILPOET-4998
This commit is contained in:
committed by
Aschepikov
parent
0e9b96d0b7
commit
b22217420f
@@ -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]
|
||||
|
@@ -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')
|
||||
|
@@ -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 {
|
||||
|
@@ -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());
|
||||
|
Reference in New Issue
Block a user