Refactor Sending::removeSubscribers() to use Doctrine instead of Paris

[MAILPOET-4368]
This commit is contained in:
Rodrigo Primo
2023-07-06 12:09:48 -03:00
committed by Aschepikov
parent 59d4ce3ba2
commit fefaf174cd
4 changed files with 58 additions and 14 deletions

View File

@@ -126,6 +126,19 @@ class ScheduledTaskSubscribersRepository extends Repository {
->execute();
}
public function deleteByScheduledTaskAndSubscriberIds(ScheduledTaskEntity $scheduledTask, array $subscriberIds): void {
$this->entityManager->createQueryBuilder()
->delete(ScheduledTaskSubscriberEntity::class, 'sts')
->where('sts.task = :task')
->andWhere('sts.subscriber IN (:subscriberIds)')
->setParameter('task', $scheduledTask)
->setParameter('subscriberIds', $subscriberIds, Connection::PARAM_INT_ARRAY)
->getQuery()
->execute();
$this->checkCompleted($scheduledTask);
}
public function setSubscribers(ScheduledTaskEntity $task, array $subscriberIds): void {
$this->deleteByScheduledTask($task);

View File

@@ -254,8 +254,20 @@ class Sending {
}
public function removeSubscribers(array $subscriberIds) {
$this->taskSubscribers->removeSubscribers($subscriberIds);
$this->updateCount();
$scheduledTaskEntity = $this->scheduledTasksRepository->findOneById($this->task->id);
if ($scheduledTaskEntity instanceof ScheduledTaskEntity) {
$this->scheduledTaskSubscribersRepository->deleteByScheduledTaskAndSubscriberIds($scheduledTaskEntity, $subscriberIds);
// we need to update those fields here as the Sending class is in a mixed state using Paris and Doctrine at the same time
// this probably won't be necessary anymore once https://mailpoet.atlassian.net/browse/MAILPOET-4375 is finished
$this->task->status = $scheduledTaskEntity->getStatus();
if (!is_null($scheduledTaskEntity->getProcessedAt())) {
$this->task->processedAt = $scheduledTaskEntity->getProcessedAt()->format('Y-m-d H:i:s');
}
$this->updateCount();
}
}
public function removeAllSubscribers() {

View File

@@ -18,13 +18,6 @@ class Subscribers {
return ScheduledTaskSubscriber::where('task_id', $this->task->id);
}
public function removeSubscribers(array $subscribersToRemove) {
$this->getSubscribers()
->whereIn('subscriber_id', $subscribersToRemove)
->deleteMany();
$this->checkCompleted();
}
public function removeAllSubscribers() {
$this->getSubscribers()
->deleteMany();

View File

@@ -3,6 +3,7 @@
namespace integration\Newsletter\Sending;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository;
use MailPoet\Test\DataFactories\ScheduledTask as ScheduledTaskFactory;
@@ -29,6 +30,21 @@ class ScheduledTaskSubscribersRepositoryTest extends \MailPoetTest {
/** @var SubscriberEntity */
private $subscriberProcessed;
/** @var ScheduledTaskSubscriberEntity */
private $taskSubscriber1;
/** @var ScheduledTaskSubscriberEntity */
private $taskSubscriber2;
/** @var ScheduledTaskSubscriberEntity */
private $taskSubscriber3;
/** @var ScheduledTaskSubscriberEntity */
private $taskSubscriber4;
/** @var ScheduledTaskSubscriberEntity */
private $taskSubscriber5;
public function _before() {
parent::_before();
$this->repository = $this->diContainer->get(ScheduledTaskSubscribersRepository::class);
@@ -44,12 +60,12 @@ class ScheduledTaskSubscribersRepositoryTest extends \MailPoetTest {
$this->scheduledTask1 = $scheduledTaskFactory->create('sending', ScheduledTaskEntity::STATUS_COMPLETED, Carbon::now()->subDay());
$this->scheduledTask2 = $scheduledTaskFactory->create('sending', ScheduledTaskEntity::STATUS_COMPLETED, Carbon::now()->subDay());
$taskSubscriberFactory->createUnprocessed($this->scheduledTask1, $this->subscriberUnprocessed);
$taskSubscriberFactory->createProcessed($this->scheduledTask1, $this->subscriberProcessed);
$taskSubscriberFactory->createFailed($this->scheduledTask1, $subscriberFailed, 'Error Message');
$this->taskSubscriber1 = $taskSubscriberFactory->createUnprocessed($this->scheduledTask1, $this->subscriberUnprocessed);
$this->taskSubscriber2 = $taskSubscriberFactory->createProcessed($this->scheduledTask1, $this->subscriberProcessed);
$this->taskSubscriber3 = $taskSubscriberFactory->createFailed($this->scheduledTask1, $subscriberFailed, 'Error Message');
$taskSubscriberFactory->createUnprocessed($this->scheduledTask2, $this->subscriberUnprocessed);
$taskSubscriberFactory->createProcessed($this->scheduledTask2, $this->subscriberProcessed);
$this->taskSubscriber4 = $taskSubscriberFactory->createUnprocessed($this->scheduledTask2, $this->subscriberUnprocessed);
$this->taskSubscriber5 = $taskSubscriberFactory->createProcessed($this->scheduledTask2, $this->subscriberProcessed);
}
public function testItSetsSubscribers() {
@@ -70,4 +86,14 @@ class ScheduledTaskSubscribersRepositoryTest extends \MailPoetTest {
$this->assertEquals($this->subscriberUnprocessed->getId(), $task2Subscribers[0]->getSubscriber()->getId());
$this->assertEquals($this->subscriberProcessed->getId(), $task2Subscribers[1]->getSubscriber()->getId());
}
public function testItDeleteByScheduledTaskAndSubscriberIds() {
$this->repository->deleteByScheduledTaskAndSubscriberIds($this->scheduledTask1, [$this->taskSubscriber1->getSubscriberId()]);
$this->assertSame([$this->taskSubscriber2, $this->taskSubscriber3], $this->repository->findBy(['task' => $this->scheduledTask1]));
$this->assertSame([$this->taskSubscriber4, $this->taskSubscriber5], $this->repository->findBy(['task' => $this->scheduledTask2]));
$this->repository->deleteByScheduledTaskAndSubscriberIds($this->scheduledTask2, [$this->taskSubscriber4->getSubscriberId(), $this->taskSubscriber5->getSubscriberId()]);
$this->assertSame([$this->taskSubscriber2, $this->taskSubscriber3], $this->repository->findBy(['task' => $this->scheduledTask1]));
$this->assertSame([], $this->repository->findBy(['task' => $this->scheduledTask2]));
}
}