Нема описа

SubscriberSegmentRepository.php 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace MailPoet\Subscribers;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Doctrine\Repository;
  5. use MailPoet\Entities\SegmentEntity;
  6. use MailPoet\Entities\SubscriberEntity;
  7. use MailPoet\Entities\SubscriberSegmentEntity;
  8. use MailPoetVendor\Doctrine\ORM\Query\Expr\Join;
  9. /**
  10. * @extends Repository<SubscriberSegmentEntity>
  11. */
  12. class SubscriberSegmentRepository extends Repository {
  13. protected function getEntityClassName() {
  14. return SubscriberSegmentEntity::class;
  15. }
  16. public function getNonDefaultSubscribedSegments(int $subscriberId): array {
  17. $qb = $this->entityManager->createQueryBuilder();
  18. return $qb->select('ss')
  19. ->from(SubscriberSegmentEntity::class, 'ss')
  20. ->join('ss.segment', 'seg', Join::WITH, 'seg.type != :typeDefault')
  21. ->where('ss.subscriber = :subscriberId')
  22. ->andWhere('ss.status = :subscribed')
  23. ->setParameter('subscriberId', $subscriberId)
  24. ->setParameter('subscribed', SubscriberEntity::STATUS_SUBSCRIBED)
  25. ->setParameter('typeDefault', SegmentEntity::TYPE_DEFAULT)
  26. ->getQuery()
  27. ->getResult();
  28. }
  29. /**
  30. * @param SegmentEntity[] $segments
  31. */
  32. public function unsubscribeFromSegments(SubscriberEntity $subscriber, array $segments = []): void {
  33. $subscriber->setConfirmationsCount(0);
  34. if (!empty($segments)) {
  35. // unsubscribe from segments
  36. foreach ($segments as $segment) {
  37. // do not remove subscriptions to the WP Users segment
  38. if ($segment->getType() === SegmentEntity::TYPE_WP_USERS) {
  39. continue;
  40. }
  41. $this->createOrUpdate($subscriber, $segment, SubscriberEntity::STATUS_UNSUBSCRIBED);
  42. }
  43. $this->entityManager->flush();
  44. } else {
  45. $subscriberSegmentTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
  46. $segmentTable = $this->entityManager->getClassMetadata(SegmentEntity::class)->getTableName();
  47. $this->entityManager->getConnection()->executeUpdate("
  48. UPDATE $subscriberSegmentTable ss
  49. JOIN $segmentTable s ON s.`id` = ss.`segment_id` AND ss.`subscriber_id` = :subscriberId
  50. SET ss.`status` = :status
  51. WHERE s.`type` != :typeWordPress
  52. ", [
  53. 'subscriberId' => $subscriber->getId(),
  54. 'status' => SubscriberEntity::STATUS_UNSUBSCRIBED,
  55. 'typeWordPress' => SegmentEntity::TYPE_WP_USERS,
  56. ]);
  57. // Refresh SubscriberSegments status
  58. foreach ($subscriber->getSubscriberSegments() as $subscriberSegment) {
  59. $this->entityManager->refresh($subscriberSegment);
  60. }
  61. }
  62. }
  63. public function resetSubscriptions(SubscriberEntity $subscriber, array $segments): void {
  64. $this->unsubscribeFromSegments($subscriber);
  65. $this->subscribeToSegments($subscriber, $segments);
  66. }
  67. /**
  68. * @param SegmentEntity[] $segments
  69. */
  70. public function subscribeToSegments(SubscriberEntity $subscriber, array $segments): void {
  71. foreach ($segments as $segment) {
  72. $this->createOrUpdate($subscriber, $segment, SubscriberEntity::STATUS_SUBSCRIBED);
  73. }
  74. }
  75. public function createOrUpdate(SubscriberEntity $subscriber, SegmentEntity $segment, string $status): SubscriberSegmentEntity {
  76. $subscriberSegment = $this->findOneBy(['segment' => $segment, 'subscriber' => $subscriber]);
  77. if ($subscriberSegment instanceof SubscriberSegmentEntity) {
  78. $subscriberSegment->setStatus($status);
  79. } else {
  80. $subscriberSegment = new SubscriberSegmentEntity($segment, $subscriber, $status);
  81. $subscriber->getSubscriberSegments()->add($subscriberSegment);
  82. $this->entityManager->persist($subscriberSegment);
  83. }
  84. $this->entityManager->flush();
  85. return $subscriberSegment;
  86. }
  87. }