Нема описа

ViewInBrowserController.php 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace MailPoet\Newsletter\ViewInBrowser;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\NewsletterEntity;
  5. use MailPoet\Entities\SendingQueueEntity;
  6. use MailPoet\Newsletter\NewslettersRepository;
  7. use MailPoet\Newsletter\Sending\SendingQueuesRepository;
  8. use MailPoet\Newsletter\Url as NewsletterUrl;
  9. use MailPoet\Subscribers\LinkTokens;
  10. use MailPoet\Subscribers\SubscribersRepository;
  11. class ViewInBrowserController {
  12. /** @var LinkTokens */
  13. private $linkTokens;
  14. /** @var NewsletterUrl */
  15. private $newsletterUrl;
  16. /** @var ViewInBrowserRenderer */
  17. private $viewInBrowserRenderer;
  18. /** @var SubscribersRepository */
  19. private $subscribersRepository;
  20. /** @var SendingQueuesRepository */
  21. private $sendingQueuesRepository;
  22. /** @var NewslettersRepository */
  23. private $newslettersRepository;
  24. public function __construct(
  25. LinkTokens $linkTokens,
  26. NewsletterUrl $newsletterUrl,
  27. NewslettersRepository $newslettersRepository,
  28. ViewInBrowserRenderer $viewInBrowserRenderer,
  29. SendingQueuesRepository $sendingQueuesRepository,
  30. SubscribersRepository $subscribersRepository
  31. ) {
  32. $this->linkTokens = $linkTokens;
  33. $this->viewInBrowserRenderer = $viewInBrowserRenderer;
  34. $this->subscribersRepository = $subscribersRepository;
  35. $this->sendingQueuesRepository = $sendingQueuesRepository;
  36. $this->newsletterUrl = $newsletterUrl;
  37. $this->newslettersRepository = $newslettersRepository;
  38. }
  39. public function view(array $data) {
  40. $data = $this->newsletterUrl->transformUrlDataObject($data);
  41. $isPreview = !empty($data['preview']);
  42. $newsletter = $this->getNewsletter($data);
  43. $subscriber = $this->getSubscriber($data);
  44. // if this is a preview and subscriber does not exist,
  45. // attempt to set subscriber to the current logged-in WP user
  46. if (!$subscriber && $isPreview) {
  47. $subscriber = $this->subscribersRepository->getCurrentWPUser();
  48. }
  49. // if queue and subscriber exist, subscriber must have received the newsletter
  50. $queue = $this->getQueue($newsletter, $data);
  51. if (!$isPreview && $queue && $subscriber && !$this->sendingQueuesRepository->isSubscriberProcessed($queue, $subscriber)) {
  52. throw new \InvalidArgumentException("Subscriber did not receive the newsletter yet");
  53. }
  54. return $this->viewInBrowserRenderer->render($isPreview, $newsletter, $subscriber, $queue);
  55. }
  56. private function getNewsletter(array $data) {
  57. // newsletter - ID is mandatory, hash must be set and valid
  58. if (empty($data['newsletter_id'])) {
  59. throw new \InvalidArgumentException("Missing 'newsletter_id'");
  60. }
  61. if (empty($data['newsletter_hash'])) {
  62. throw new \InvalidArgumentException("Missing 'newsletter_hash'");
  63. }
  64. $newsletter = $this->newslettersRepository->findOneById($data['newsletter_id']);
  65. if (!$newsletter) {
  66. throw new \InvalidArgumentException("Invalid 'newsletter_id'");
  67. }
  68. if ($data['newsletter_hash'] !== $newsletter->getHash()) {
  69. throw new \InvalidArgumentException("Invalid 'newsletter_hash'");
  70. }
  71. return $newsletter;
  72. }
  73. private function getSubscriber(array $data) {
  74. // subscriber is optional; if exists, token must validate
  75. if (empty($data['subscriber_id'])) {
  76. return null;
  77. }
  78. $subscriber = $this->subscribersRepository->findOneById($data['subscriber_id']);
  79. if (!$subscriber) {
  80. return null;
  81. }
  82. if (empty($data['subscriber_token'])) {
  83. throw new \InvalidArgumentException("Missing 'subscriber_token'");
  84. }
  85. if (!$this->linkTokens->verifyToken($subscriber, $data['subscriber_token'])) {
  86. throw new \InvalidArgumentException("Invalid 'subscriber_token'");
  87. }
  88. return $subscriber;
  89. }
  90. private function getQueue(NewsletterEntity $newsletter, array $data): ?SendingQueueEntity {
  91. // queue is optional; try to find it if it's not defined and this is not a welcome email
  92. if ($newsletter->getType() === NewsletterEntity::TYPE_WELCOME) {
  93. return null;
  94. }
  95. // reset queue when automatic email is being previewed
  96. if ($newsletter->getType() === NewsletterEntity::TYPE_AUTOMATIC && !empty($data['preview'])) {
  97. return null;
  98. }
  99. return !empty($data['queue_id'])
  100. ? $this->sendingQueuesRepository->findOneById($data['queue_id'])
  101. : $this->sendingQueuesRepository->findOneBy(['newsletter' => $newsletter->getId()]);
  102. }
  103. }