| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- <?php
- namespace MailPoet\Newsletter;
- if (!defined('ABSPATH')) exit;
- use MailPoet\Doctrine\Repository;
- use MailPoet\Entities\NewsletterEntity;
- use MailPoet\Entities\SendingQueueEntity;
- use MailPoetVendor\Doctrine\ORM\QueryBuilder;
- /**
- * @extends Repository<NewsletterEntity>
- */
- class AutomaticEmailsRepository extends Repository {
- protected function getEntityClassName() {
- return NewsletterEntity::class;
- }
- public function wasScheduledForSubscriber(int $newsletterId, int $subscriberId): bool {
- $query = $this->doctrineRepository->createQueryBuilder('n')
- ->select('COUNT(q)')
- ->from(SendingQueueEntity::class, 'q');
- $query = $this->getAllQueuesForSubscscriberQuery($query, $newsletterId, $subscriberId);
- $count = $query->getQuery()
- ->getSingleScalarResult() ?: 0;
- return ((int)$count) > 0;
- }
- private function getAllQueuesForSubscscriberQuery(QueryBuilder $query, int $newsletterId, int $subscriberId): QueryBuilder {
- return $query
- ->join('q.task', 't')
- ->join('t.subscribers', 's')
- ->andWhere('q.newsletter = :newsletterId')
- ->andWhere('s.subscriber = :subscriberId')
- ->setParameter('newsletterId', $newsletterId)
- ->setParameter('subscriberId', $subscriberId);
- }
- /**
- * Search products/categories in meta if all of the ordered products have already been sent to the subscriber.
- */
- public function alreadySentAllProducts(int $newsletterId, int $subscriberId, string $orderedKey, array $ordered): bool {
- $query = $this->doctrineRepository->createQueryBuilder('n')
- ->select('q')
- ->from(SendingQueueEntity::class, 'q');
- $queues = $this->getAllQueuesForSubscscriberQuery($query, $newsletterId, $subscriberId)
- ->getQuery()
- ->getResult();
- $sent = [];
- foreach ($queues as $queue) {
- $meta = $queue->getMeta();
- if (isset($meta[$orderedKey])) {
- $sent = array_merge($sent, $meta[$orderedKey]);
- }
- }
- $notSentProducts = array_diff($ordered, $sent);
- return empty($notSentProducts);
- }
- }
|