PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Newsletter / StatusController.php
mailpoet / lib / Newsletter Last commit date
Editor 2 months ago Embed 1 month ago Links 2 months ago Listing 9 months ago Options 2 years ago Preview 1 month ago Renderer 5 days ago RestApi 1 week ago Scheduler 5 days ago Segment 1 year ago Sending 1 week ago Sharing 1 month ago Shortcodes 4 days ago Statistics 1 week ago ViewInBrowser 1 month ago ApiDataSanitizer.php 3 years ago AutomatedLatestContent.php 2 months ago AutomaticEmailsRepository.php 3 years ago BlockPostQuery.php 2 months ago BulkActionController.php 2 months ago BulkActionException.php 2 months ago DynamicProducts.php 11 months ago NewsletterCoupon.php 2 months ago NewsletterDeleteController.php 2 years ago NewsletterHtmlSanitizer.php 2 years ago NewsletterPostsRepository.php 2 years ago NewsletterResendController.php 5 days ago NewsletterSaveController.php 1 month ago NewsletterValidator.php 1 year ago NewslettersRepository.php 2 weeks ago StatusController.php 2 months ago Url.php 2 months ago index.php 3 years ago
StatusController.php
139 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Newsletter;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Entities\NewsletterEntity;
9 use MailPoet\Entities\NewsletterOptionFieldEntity;
10 use MailPoet\Entities\ScheduledTaskEntity;
11 use MailPoet\Entities\SendingQueueEntity;
12 use MailPoet\InvalidStateException;
13 use MailPoet\Newsletter\Scheduler\PostNotificationScheduler;
14 use MailPoet\Newsletter\Scheduler\Scheduler;
15 use MailPoet\Services\AuthorizedEmailsController;
16 use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
17 use MailPoetVendor\Carbon\Carbon;
18
19 /**
20 * Centralized newsletter status-toggle (active/draft) flow used by the REST
21 * endpoint at `PUT mailpoet/v1/newsletters/{id}/status`.
22 *
23 * Lifts the status change, paused-queue resume, post-notification reschedule,
24 * and authorized-sender gating into one place so the REST endpoint can stay a
25 * thin HTTP adapter.
26 */
27 class StatusController {
28 /** @var NewslettersRepository */
29 private $newslettersRepository;
30
31 /** @var SubscribersFeature */
32 private $subscribersFeature;
33
34 /** @var AuthorizedEmailsController */
35 private $authorizedEmailsController;
36
37 /** @var NewsletterValidator */
38 private $newsletterValidator;
39
40 /** @var Scheduler */
41 private $scheduler;
42
43 /** @var PostNotificationScheduler */
44 private $postNotificationScheduler;
45
46 public function __construct(
47 NewslettersRepository $newslettersRepository,
48 SubscribersFeature $subscribersFeature,
49 AuthorizedEmailsController $authorizedEmailsController,
50 NewsletterValidator $newsletterValidator,
51 Scheduler $scheduler,
52 PostNotificationScheduler $postNotificationScheduler
53 ) {
54 $this->newslettersRepository = $newslettersRepository;
55 $this->subscribersFeature = $subscribersFeature;
56 $this->authorizedEmailsController = $authorizedEmailsController;
57 $this->newsletterValidator = $newsletterValidator;
58 $this->scheduler = $scheduler;
59 $this->postNotificationScheduler = $postNotificationScheduler;
60 }
61
62 /**
63 * @throws BulkActionException
64 */
65 public function setStatus(NewsletterEntity $newsletter, string $status): NewsletterEntity {
66 if ($status === NewsletterEntity::STATUS_ACTIVE && $this->subscribersFeature->check()) {
67 throw new BulkActionException(
68 __('Subscribers limit reached.', 'mailpoet'),
69 'mailpoet_newsletters_subscribers_limit',
70 403
71 );
72 }
73 if ($status === NewsletterEntity::STATUS_ACTIVE && !$this->authorizedEmailsController->isSenderAddressValid($newsletter)) {
74 throw new BulkActionException(
75 __('The sender address is not an authorized sender domain.', 'mailpoet'),
76 'mailpoet_newsletters_unauthorized_sender',
77 403
78 );
79 }
80 if ($status === NewsletterEntity::STATUS_ACTIVE) {
81 $validationError = $this->newsletterValidator->validate($newsletter);
82 if ($validationError !== null) {
83 throw new BulkActionException(
84 $validationError,
85 'mailpoet_newsletters_validation_failed',
86 403
87 );
88 }
89 }
90
91 $this->newslettersRepository->prefetchOptions([$newsletter]);
92 $newsletter->setStatus($status);
93
94 if ($newsletter->getStatus() === NewsletterEntity::STATUS_ACTIVE) {
95 // Unpause any tasks that were halted by an earlier deactivation so a
96 // toggle-off/on cycle resumes rather than orphaning the queue.
97 foreach ($newsletter->getUnfinishedQueues() as $queue) {
98 $task = $queue->getTask();
99 if ($task && $task->getStatus() === ScheduledTaskEntity::STATUS_PAUSED) {
100 $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
101 }
102 }
103 }
104
105 // Past-due post notifications need their next run date computed and a
106 // new sending task scheduled; otherwise re-activation would silently
107 // miss the next interval.
108 if ($newsletter->getType() === NewsletterEntity::TYPE_NOTIFICATION && $status === NewsletterEntity::STATUS_ACTIVE) {
109 $scheduleOption = $newsletter->getOption(NewsletterOptionFieldEntity::NAME_SCHEDULE);
110 if ($scheduleOption === null) {
111 throw new BulkActionException(
112 __('This email has incorrect state.', 'mailpoet'),
113 'mailpoet_newsletters_missing_schedule',
114 400
115 );
116 }
117 $nextRunDate = $this->scheduler->getNextRunDate($scheduleOption->getValue());
118 foreach ($newsletter->getQueues() as $queue) {
119 $task = $queue->getTask();
120 if (
121 $task
122 && $task->getScheduledAt() <= Carbon::now()->millisecond(0)
123 && $task->getStatus() === SendingQueueEntity::STATUS_SCHEDULED
124 ) {
125 $parsedDate = $nextRunDate ? Carbon::createFromFormat('Y-m-d H:i:s', $nextRunDate) : null;
126 if ($parsedDate === false) {
127 throw InvalidStateException::create()->withMessage('Invalid next run date generated');
128 }
129 $task->setScheduledAt($parsedDate);
130 }
131 }
132 $this->postNotificationScheduler->createPostNotificationSendingTask($newsletter);
133 }
134
135 $this->newslettersRepository->flush();
136 return $newsletter;
137 }
138 }
139