entityManager = $entityManager; $this->newslettersRepository = $newslettersRepository; $this->newsletterLinkRepository = $newsletterLinkRepository; $this->newsletterOptionsRepository = $newsletterOptionsRepository; $this->newsletterPostsRepository = $newsletterPostsRepository; $this->newsletterSegmentRepository = $newsletterSegmentRepository; $this->scheduledTasksRepository = $scheduledTasksRepository; $this->scheduledTaskSubscribersRepository = $scheduledTaskSubscribersRepository; $this->sendingQueuesRepository = $sendingQueuesRepository; $this->statisticsClicksRepository = $statisticsClicksRepository; $this->statisticsNewslettersRepository = $statisticsNewslettersRepository; $this->statisticsOpensRepository = $statisticsOpensRepository; $this->statisticsWooCommercePurchasesRepository = $statisticsWooCommercePurchasesRepository; $this->statsNotificationsRepository = $statsNotificationsRepository; $this->wp = $wp; } /** @param int[] $ids */ public function bulkDelete(array $ids): int { if (!$ids) { return 0; } // Fetch children ids for deleting $childrenIds = $this->newslettersRepository->fetchChildrenIds($ids); $ids = array_merge($ids, $childrenIds); $this->entityManager->beginTransaction(); try { // Delete statistics data $this->statisticsNewslettersRepository->deleteByNewsletterIds($ids); $this->statisticsOpensRepository->deleteByNewsletterIds($ids); $this->statisticsClicksRepository->deleteByNewsletterIds($ids); // Update WooCommerce statistics and remove newsletter and click id $this->statisticsWooCommercePurchasesRepository->removeNewsletterDataByNewsletterIds($ids); // Delete newsletter posts, options, links, and segments $this->newsletterPostsRepository->deleteByNewsletterIds($ids); $this->newsletterOptionsRepository->deleteByNewsletterIds($ids); $this->newsletterLinkRepository->deleteByNewsletterIds($ids); $this->newsletterSegmentRepository->deleteByNewsletterIds($ids); // Delete stats notifications and related tasks /** @var string[] $taskIds */ $taskIds = $this->entityManager->createQueryBuilder() ->select('IDENTITY(sn.task)') ->from(StatsNotificationEntity::class, 'sn') ->where('sn.newsletter IN (:ids)') ->setParameter('ids', $ids) ->getQuery() ->getSingleColumnResult(); $taskIds = array_map('intval', $taskIds); $this->scheduledTasksRepository->deleteByIds($taskIds); $this->statsNotificationsRepository->deleteByNewsletterIds($ids); // Delete scheduled task subscribers, scheduled tasks, and sending queues /** @var string[] $taskIds */ $taskIds = $this->entityManager->createQueryBuilder() ->select('IDENTITY(q.task)') ->from(SendingQueueEntity::class, 'q') ->where('q.newsletter IN (:ids)') ->setParameter('ids', $ids) ->getQuery() ->getSingleColumnResult(); $taskIds = array_map('intval', $taskIds); $this->scheduledTaskSubscribersRepository->deleteByTaskIds($taskIds); $this->scheduledTasksRepository->deleteByIds($taskIds); $this->sendingQueuesRepository->deleteByNewsletterIds($ids); // Fetch WP Posts IDs and delete them /** @var string[] $wpPostIds */ $wpPostIds = $this->entityManager->createQueryBuilder() ->select('IDENTITY(n.wpPost) AS id') ->from(NewsletterEntity::class, 'n') ->where('n.id IN (:ids)') ->andWhere('n.wpPost IS NOT NULL') ->setParameter('ids', $ids) ->getQuery() ->getSingleColumnResult(); $wpPostIds = array_map('intval', $wpPostIds); foreach ($wpPostIds as $wpPostId) { $this->wp->wpDeletePost($wpPostId, true); } // Delete newsletter entities $this->newslettersRepository->deleteByIds($ids); $this->entityManager->commit(); } catch (Throwable $e) { $this->entityManager->rollback(); throw $e; } return count($ids); } }