Editor
2 months ago
Embed
1 month ago
Links
2 months ago
Listing
9 months ago
Options
2 years ago
Preview
1 month ago
Renderer
4 days ago
RestApi
1 week ago
Scheduler
4 days ago
Segment
1 year ago
Sending
1 week ago
Sharing
1 month ago
Shortcodes
3 days ago
Statistics
1 week ago
ViewInBrowser
1 month ago
ApiDataSanitizer.php
3 years ago
AutomatedLatestContent.php
2 months ago
AutomaticEmailsRepository.php
3 years ago
BlockPostQuery.php
2 months ago
BulkActionController.php
1 month ago
BulkActionException.php
1 month ago
DynamicProducts.php
11 months ago
NewsletterCoupon.php
2 months ago
NewsletterDeleteController.php
2 years ago
NewsletterHtmlSanitizer.php
2 years ago
NewsletterPostsRepository.php
2 years ago
NewsletterResendController.php
4 days ago
NewsletterSaveController.php
1 month ago
NewsletterValidator.php
1 year ago
NewslettersRepository.php
2 weeks ago
StatusController.php
1 month ago
Url.php
2 months ago
index.php
3 years ago
NewsletterDeleteController.php
160 lines
| 1 | <?php declare(strict_types = 1); |
| 2 | |
| 3 | namespace MailPoet\Newsletter; |
| 4 | |
| 5 | if (!defined('ABSPATH')) exit; |
| 6 | |
| 7 | |
| 8 | use MailPoet\Cron\Workers\StatsNotifications\NewsletterLinkRepository; |
| 9 | use MailPoet\Cron\Workers\StatsNotifications\StatsNotificationsRepository; |
| 10 | use MailPoet\Entities\NewsletterEntity; |
| 11 | use MailPoet\Entities\SendingQueueEntity; |
| 12 | use MailPoet\Entities\StatsNotificationEntity; |
| 13 | use MailPoet\Newsletter\Options\NewsletterOptionsRepository; |
| 14 | use MailPoet\Newsletter\Segment\NewsletterSegmentRepository; |
| 15 | use MailPoet\Newsletter\Sending\ScheduledTasksRepository; |
| 16 | use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository; |
| 17 | use MailPoet\Newsletter\Sending\SendingQueuesRepository; |
| 18 | use MailPoet\Statistics\StatisticsClicksRepository; |
| 19 | use MailPoet\Statistics\StatisticsNewslettersRepository; |
| 20 | use MailPoet\Statistics\StatisticsOpensRepository; |
| 21 | use MailPoet\Statistics\StatisticsWooCommercePurchasesRepository; |
| 22 | use MailPoet\WP\Functions as WPFunctions; |
| 23 | use MailPoetVendor\Doctrine\ORM\EntityManager; |
| 24 | use Throwable; |
| 25 | |
| 26 | class NewsletterDeleteController { |
| 27 | private EntityManager $entityManager; |
| 28 | private NewslettersRepository $newslettersRepository; |
| 29 | private NewsletterLinkRepository $newsletterLinkRepository; |
| 30 | private NewsletterOptionsRepository $newsletterOptionsRepository; |
| 31 | private NewsletterPostsRepository $newsletterPostsRepository; |
| 32 | private NewsletterSegmentRepository $newsletterSegmentRepository; |
| 33 | private ScheduledTasksRepository $scheduledTasksRepository; |
| 34 | private ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository; |
| 35 | private SendingQueuesRepository $sendingQueuesRepository; |
| 36 | private StatisticsClicksRepository $statisticsClicksRepository; |
| 37 | private StatisticsNewslettersRepository $statisticsNewslettersRepository; |
| 38 | private StatisticsOpensRepository $statisticsOpensRepository; |
| 39 | private StatisticsWooCommercePurchasesRepository $statisticsWooCommercePurchasesRepository; |
| 40 | private StatsNotificationsRepository $statsNotificationsRepository; |
| 41 | private WPFunctions $wp; |
| 42 | |
| 43 | public function __construct( |
| 44 | EntityManager $entityManager, |
| 45 | NewslettersRepository $newslettersRepository, |
| 46 | NewsletterLinkRepository $newsletterLinkRepository, |
| 47 | NewsletterOptionsRepository $newsletterOptionsRepository, |
| 48 | NewsletterPostsRepository $newsletterPostsRepository, |
| 49 | NewsletterSegmentRepository $newsletterSegmentRepository, |
| 50 | ScheduledTasksRepository $scheduledTasksRepository, |
| 51 | ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository, |
| 52 | SendingQueuesRepository $sendingQueuesRepository, |
| 53 | StatisticsClicksRepository $statisticsClicksRepository, |
| 54 | StatisticsNewslettersRepository $statisticsNewslettersRepository, |
| 55 | StatisticsOpensRepository $statisticsOpensRepository, |
| 56 | StatisticsWooCommercePurchasesRepository $statisticsWooCommercePurchasesRepository, |
| 57 | StatsNotificationsRepository $statsNotificationsRepository, |
| 58 | WPFunctions $wp |
| 59 | ) { |
| 60 | $this->entityManager = $entityManager; |
| 61 | $this->newslettersRepository = $newslettersRepository; |
| 62 | $this->newsletterLinkRepository = $newsletterLinkRepository; |
| 63 | $this->newsletterOptionsRepository = $newsletterOptionsRepository; |
| 64 | $this->newsletterPostsRepository = $newsletterPostsRepository; |
| 65 | $this->newsletterSegmentRepository = $newsletterSegmentRepository; |
| 66 | $this->scheduledTasksRepository = $scheduledTasksRepository; |
| 67 | $this->scheduledTaskSubscribersRepository = $scheduledTaskSubscribersRepository; |
| 68 | $this->sendingQueuesRepository = $sendingQueuesRepository; |
| 69 | $this->statisticsClicksRepository = $statisticsClicksRepository; |
| 70 | $this->statisticsNewslettersRepository = $statisticsNewslettersRepository; |
| 71 | $this->statisticsOpensRepository = $statisticsOpensRepository; |
| 72 | $this->statisticsWooCommercePurchasesRepository = $statisticsWooCommercePurchasesRepository; |
| 73 | $this->statsNotificationsRepository = $statsNotificationsRepository; |
| 74 | $this->wp = $wp; |
| 75 | } |
| 76 | |
| 77 | /** @param int[] $ids */ |
| 78 | public function bulkDelete(array $ids): int { |
| 79 | if (!$ids) { |
| 80 | return 0; |
| 81 | } |
| 82 | |
| 83 | // Fetch children ids for deleting |
| 84 | $childrenIds = $this->newslettersRepository->fetchChildrenIds($ids); |
| 85 | $ids = array_merge($ids, $childrenIds); |
| 86 | |
| 87 | $this->entityManager->beginTransaction(); |
| 88 | try { |
| 89 | // Delete statistics data |
| 90 | $this->statisticsNewslettersRepository->deleteByNewsletterIds($ids); |
| 91 | $this->statisticsOpensRepository->deleteByNewsletterIds($ids); |
| 92 | $this->statisticsClicksRepository->deleteByNewsletterIds($ids); |
| 93 | |
| 94 | // Update WooCommerce statistics and remove newsletter and click id |
| 95 | $this->statisticsWooCommercePurchasesRepository->removeNewsletterDataByNewsletterIds($ids); |
| 96 | |
| 97 | // Delete newsletter posts, options, links, and segments |
| 98 | $this->newsletterPostsRepository->deleteByNewsletterIds($ids); |
| 99 | $this->newsletterOptionsRepository->deleteByNewsletterIds($ids); |
| 100 | $this->newsletterLinkRepository->deleteByNewsletterIds($ids); |
| 101 | $this->newsletterSegmentRepository->deleteByNewsletterIds($ids); |
| 102 | |
| 103 | // Delete stats notifications and related tasks |
| 104 | /** @var string[] $taskIds */ |
| 105 | $taskIds = $this->entityManager->createQueryBuilder() |
| 106 | ->select('IDENTITY(sn.task)') |
| 107 | ->from(StatsNotificationEntity::class, 'sn') |
| 108 | ->where('sn.newsletter IN (:ids)') |
| 109 | ->setParameter('ids', $ids) |
| 110 | ->getQuery() |
| 111 | ->getSingleColumnResult(); |
| 112 | $taskIds = array_map('intval', $taskIds); |
| 113 | |
| 114 | $this->scheduledTasksRepository->deleteByIds($taskIds); |
| 115 | $this->statsNotificationsRepository->deleteByNewsletterIds($ids); |
| 116 | |
| 117 | // Delete scheduled task subscribers, scheduled tasks, and sending queues |
| 118 | /** @var string[] $taskIds */ |
| 119 | $taskIds = $this->entityManager->createQueryBuilder() |
| 120 | ->select('IDENTITY(q.task)') |
| 121 | ->from(SendingQueueEntity::class, 'q') |
| 122 | ->where('q.newsletter IN (:ids)') |
| 123 | ->setParameter('ids', $ids) |
| 124 | ->getQuery() |
| 125 | ->getSingleColumnResult(); |
| 126 | $taskIds = array_map('intval', $taskIds); |
| 127 | |
| 128 | $this->scheduledTaskSubscribersRepository->deleteByTaskIds($taskIds); |
| 129 | $this->scheduledTasksRepository->deleteByIds($taskIds); |
| 130 | $this->sendingQueuesRepository->deleteByNewsletterIds($ids); |
| 131 | |
| 132 | // Fetch WP Posts IDs and delete them |
| 133 | /** @var string[] $wpPostIds */ |
| 134 | $wpPostIds = $this->entityManager->createQueryBuilder() |
| 135 | ->select('IDENTITY(n.wpPost) AS id') |
| 136 | ->from(NewsletterEntity::class, 'n') |
| 137 | ->where('n.id IN (:ids)') |
| 138 | ->andWhere('n.wpPost IS NOT NULL') |
| 139 | ->setParameter('ids', $ids) |
| 140 | ->getQuery() |
| 141 | ->getSingleColumnResult(); |
| 142 | $wpPostIds = array_map('intval', $wpPostIds); |
| 143 | |
| 144 | foreach ($wpPostIds as $wpPostId) { |
| 145 | $this->wp->wpDeletePost($wpPostId, true); |
| 146 | } |
| 147 | |
| 148 | // Delete newsletter entities |
| 149 | $this->newslettersRepository->deleteByIds($ids); |
| 150 | |
| 151 | $this->entityManager->commit(); |
| 152 | } catch (Throwable $e) { |
| 153 | $this->entityManager->rollback(); |
| 154 | throw $e; |
| 155 | } |
| 156 | |
| 157 | return count($ids); |
| 158 | } |
| 159 | } |
| 160 |