diff --git a/lib/API/JSON/v1/Newsletters.php b/lib/API/JSON/v1/Newsletters.php index e6a20e487f..bd9515a194 100644 --- a/lib/API/JSON/v1/Newsletters.php +++ b/lib/API/JSON/v1/Newsletters.php @@ -202,15 +202,12 @@ class Newsletters extends APIEndpoint { public function restore($data = []) { $id = (isset($data['id']) ? (int)$data['id'] : false); - $newsletter = Newsletter::findOne($id); - if ($newsletter instanceof Newsletter) { - $newsletter->restore(); - - $newsletter = Newsletter::findOne($newsletter->id); - if(!$newsletter instanceof Newsletter) return $this->errorResponse(); - + $newsletter = $this->newslettersRepository->findOneById($id); + if ($newsletter instanceof NewsletterEntity) { + $this->newslettersRepository->bulkRestore([$id]); + $this->newslettersRepository->refresh($newsletter); return $this->successResponse( - $newsletter->asArray(), + $this->newslettersResponseBuilder->build($newsletter), ['count' => 1] ); } else { @@ -222,14 +219,12 @@ class Newsletters extends APIEndpoint { public function trash($data = []) { $id = (isset($data['id']) ? (int)$data['id'] : false); - $newsletter = Newsletter::findOne($id); - if ($newsletter instanceof Newsletter) { - $newsletter->trash(); - - $newsletter = Newsletter::findOne($newsletter->id); - if(!$newsletter instanceof Newsletter) return $this->errorResponse(); + $newsletter = $this->newslettersRepository->findOneById($id); + if ($newsletter instanceof NewsletterEntity) { + $this->newslettersRepository->bulkTrash([$id]); + $this->newslettersRepository->refresh($newsletter); return $this->successResponse( - $newsletter->asArray(), + $this->newslettersResponseBuilder->build($newsletter), ['count' => 1] ); } else { @@ -241,9 +236,9 @@ class Newsletters extends APIEndpoint { public function delete($data = []) { $id = (isset($data['id']) ? (int)$data['id'] : false); - $newsletter = Newsletter::findOne($id); - if ($newsletter instanceof Newsletter) { - $newsletter->delete(); + $newsletter = $this->newslettersRepository->findOneById($id); + if ($newsletter instanceof NewsletterEntity) { + $this->newslettersRepository->bulkDelete([$id]); return $this->successResponse(null, ['count' => 1]); } else { return $this->errorResponse([ diff --git a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php index 19b43aeaa1..ebd3ce6adb 100644 --- a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php +++ b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php @@ -12,6 +12,7 @@ use MailPoet\Models\Newsletter as NewsletterModel; use MailPoet\Models\NewsletterSegment as NewsletterSegmentModel; use MailPoet\Models\SendingQueue as SendingQueueModel; use MailPoet\Newsletter\Links\Links as NewsletterLinks; +use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Renderer\PostProcess\OpenTracking; use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Settings\SettingsController; @@ -39,6 +40,9 @@ class Newsletter { /** @var Renderer */ private $renderer; + /** @var NewslettersRepository */ + private $newslettersRepository; + /** @var Emoji */ private $emoji; @@ -63,6 +67,7 @@ class Newsletter { } $this->emoji = $emoji; $this->renderer = ContainerWrapper::getInstance()->get(Renderer::class); + $this->newslettersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class); } public function getNewsletterFromQueue($queue) { @@ -137,7 +142,7 @@ class Newsletter { 'no posts in post notification, deleting it', ['newsletter_id' => $newsletter->id, 'task_id' => $sendingTask->taskId] ); - $newsletter->delete(); + $this->newslettersRepository->bulkDelete([(int)$newsletter->id]); return false; } // extract and save newsletter posts diff --git a/lib/Doctrine/Repository.php b/lib/Doctrine/Repository.php index ffd5eab434..1f0f3d4394 100644 --- a/lib/Doctrine/Repository.php +++ b/lib/Doctrine/Repository.php @@ -87,6 +87,13 @@ abstract class Repository { $this->entityManager->remove($entity); } + /** + * @param T $entity + */ + public function refresh($entity) { + $this->entityManager->refresh($entity); + } + public function flush() { $this->entityManager->flush(); } diff --git a/lib/Newsletter/NewslettersRepository.php b/lib/Newsletter/NewslettersRepository.php index 8488d799c5..c38bb4f417 100644 --- a/lib/Newsletter/NewslettersRepository.php +++ b/lib/Newsletter/NewslettersRepository.php @@ -211,6 +211,9 @@ class NewslettersRepository extends Repository { } public function bulkDelete(array $ids) { + if (empty($ids)) { + return 0; + } $this->entityManager->getConnection()->beginTransaction(); try { // Delete children diff --git a/tasks/phpstan/phpstan-baseline-integration-tests.neon b/tasks/phpstan/phpstan-baseline-integration-tests.neon index 87d8c5c3be..4edfbd7d62 100644 --- a/tasks/phpstan/phpstan-baseline-integration-tests.neon +++ b/tasks/phpstan/phpstan-baseline-integration-tests.neon @@ -250,11 +250,6 @@ parameters: count: 1 path: ../../tests/integration/Cron/Workers/SendingQueue/MigrationTest.php - - - message: "#^Cannot call method delete\\(\\) on MailPoet\\\\Models\\\\Newsletter\\|false\\.$#" - count: 1 - path: ../../tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php - - message: "#^Cannot access property \\$status on MailPoet\\\\Models\\\\Newsletter\\|false\\.$#" count: 5 diff --git a/tests/integration/API/JSON/v1/NewslettersTest.php b/tests/integration/API/JSON/v1/NewslettersTest.php index 29197ae750..4d170a0c0c 100644 --- a/tests/integration/API/JSON/v1/NewslettersTest.php +++ b/tests/integration/API/JSON/v1/NewslettersTest.php @@ -42,6 +42,7 @@ use MailPoetVendor\Idiorm\ORM; class NewslettersTest extends \MailPoetTest { public $postNotification; + /** @var Newsletter */ public $newsletter; /** @var Newsletters */ private $endpoint; @@ -49,9 +50,13 @@ class NewslettersTest extends \MailPoetTest { /** @var CronHelper */ private $cronHelper; + /** @var NewslettersRepository */ + private $newsletterRepository; + public function _before() { parent::_before(); $this->cronHelper = ContainerWrapper::getInstance()->get(CronHelper::class); + $this->newsletterRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class); $this->endpoint = Stub::copy( ContainerWrapper::getInstance()->get(Newsletters::class), [ @@ -319,7 +324,7 @@ class NewslettersTest extends \MailPoetTest { } public function testItCanRestoreANewsletter() { - $this->newsletter->trash(); + $this->newsletterRepository->bulkTrash([$this->newsletter->id]); $trashedNewsletter = Newsletter::findOne($this->newsletter->id); expect($trashedNewsletter->deletedAt)->notNull(); diff --git a/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php b/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php index 3007278b61..8b15c642e5 100644 --- a/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -62,6 +62,8 @@ class SendingQueueTest extends \MailPoetTest { private $statsNotificationsWorker; /** @var LoggerFactory */ private $loggerFactory; + /** @var NewslettersRepository */ + private $newslettersRepository; public function _before() { parent::_before(); @@ -118,6 +120,7 @@ class SendingQueueTest extends \MailPoetTest { Stub::makeEmpty(NewslettersRepository::class, ['findOneById' => new NewsletterEntity()]), $this->cronHelper ); + $this->newslettersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class); } private function getDirectUnsubscribeURL() { @@ -261,8 +264,7 @@ class SendingQueueTest extends \MailPoetTest { expect($queue)->notEquals(false); // delete newsletter - Newsletter::findOne($this->newsletter->id) - ->delete(); + $this->newslettersRepository->bulkDelete([$this->newsletter->id]); // queue no longer exists $this->sendingQueueWorker->process();