Nav apraksta

NewsletterSegmentRepository.php 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. namespace MailPoet\Newsletter\Segment;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Doctrine\Repository;
  5. use MailPoet\Entities\NewsletterEntity;
  6. use MailPoet\Entities\NewsletterSegmentEntity;
  7. use MailPoet\Newsletter\Options\NewsletterOptionsRepository;
  8. use MailPoetVendor\Doctrine\ORM\EntityManager;
  9. /**
  10. * @extends Repository<NewsletterSegmentEntity>
  11. */
  12. class NewsletterSegmentRepository extends Repository {
  13. /** @var NewsletterOptionsRepository */
  14. private $newsletterOptionsRepository;
  15. public function __construct(
  16. NewsletterOptionsRepository $newsletterOptionsRepository,
  17. EntityManager $entityManager
  18. ) {
  19. parent::__construct($entityManager);
  20. $this->newsletterOptionsRepository = $newsletterOptionsRepository;
  21. }
  22. protected function getEntityClassName() {
  23. return NewsletterSegmentEntity::class;
  24. }
  25. public function getSubjectsOfActivelyUsedEmailsForSegments(array $segmentIds): array {
  26. $nameMap = [];
  27. // Welcome emails
  28. foreach ($this->newsletterOptionsRepository->findWelcomeNotificationsForSegments($segmentIds) as $option) {
  29. $newsletter = $option->getNewsletter();
  30. if (!$newsletter instanceof NewsletterEntity) continue;
  31. $nameMap[(string)$option->getValue()][] = $newsletter->getSubject();
  32. }
  33. // Automatic emails
  34. foreach ($this->newsletterOptionsRepository->findAutomaticEmailsForSegments($segmentIds) as $option) {
  35. $newsletter = $option->getNewsletter();
  36. if (!$newsletter instanceof NewsletterEntity) continue;
  37. $nameMap[(string)$option->getValue()][] = $newsletter->getSubject();
  38. }
  39. $otherNewsletters = $this->doctrineRepository->createQueryBuilder('ns')
  40. ->join('ns.newsletter', 'n')
  41. ->leftJoin('n.queues', 'q')
  42. ->leftJoin('q.task', 't')
  43. ->select('IDENTITY(ns.segment) AS segment_id, n.subject')
  44. ->where('(n.type = (:postNotification) OR n.status = :scheduled OR (t.id IS NOT NULL AND t.status IS NULL))')
  45. ->andWhere('ns.segment IN (:segmentIds)')
  46. ->setParameter('postNotification', NewsletterEntity::TYPE_NOTIFICATION)
  47. ->setParameter('segmentIds', $segmentIds)
  48. ->setParameter('scheduled', NewsletterEntity::STATUS_SCHEDULED)
  49. ->addGroupBy('ns.segment, q.id, t.id')
  50. ->getQuery()
  51. ->getResult();
  52. foreach ($otherNewsletters as $result) {
  53. if (isset($nameMap[(string)$result['segment_id']]) && in_array($result['subject'], $nameMap[(string)$result['segment_id']])) {
  54. continue;
  55. }
  56. $nameMap[(string)$result['segment_id']][] = $result['subject'];
  57. }
  58. return $nameMap;
  59. }
  60. }