Нет описания

Settings.php 9.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. namespace MailPoet\API\JSON\v1;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\API\JSON\Endpoint as APIEndpoint;
  5. use MailPoet\API\JSON\Error as APIError;
  6. use MailPoet\Config\AccessControl;
  7. use MailPoet\Config\ServicesChecker;
  8. use MailPoet\Cron\Workers\InactiveSubscribers;
  9. use MailPoet\Cron\Workers\SubscribersEngagementScore;
  10. use MailPoet\Cron\Workers\WooCommerceSync;
  11. use MailPoet\Entities\ScheduledTaskEntity;
  12. use MailPoet\Form\FormMessageController;
  13. use MailPoet\Mailer\MailerLog;
  14. use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
  15. use MailPoet\Segments\SegmentsRepository;
  16. use MailPoet\Services\AuthorizedEmailsController;
  17. use MailPoet\Services\Bridge;
  18. use MailPoet\Settings\SettingsController;
  19. use MailPoet\Statistics\StatisticsOpensRepository;
  20. use MailPoet\Subscribers\SubscribersCountsController;
  21. use MailPoet\WooCommerce\TransactionalEmails;
  22. use MailPoet\WP\Functions as WPFunctions;
  23. use MailPoetVendor\Carbon\Carbon;
  24. use MailPoetVendor\Doctrine\ORM\EntityManager;
  25. class Settings extends APIEndpoint {
  26. /** @var SettingsController */
  27. private $settings;
  28. /** @var Bridge */
  29. private $bridge;
  30. /** @var AuthorizedEmailsController */
  31. private $authorizedEmailsController;
  32. /** @var TransactionalEmails */
  33. private $wcTransactionalEmails;
  34. /** @var ServicesChecker */
  35. private $servicesChecker;
  36. /** @var WPFunctions */
  37. private $wp;
  38. /** @var EntityManager */
  39. private $entityManager;
  40. /** @var StatisticsOpensRepository */
  41. private $statisticsOpensRepository;
  42. /** @var ScheduledTasksRepository */
  43. private $scheduledTasksRepository;
  44. /** @var FormMessageController */
  45. private $messageController;
  46. /** @var SegmentsRepository */
  47. private $segmentsRepository;
  48. /** @var SubscribersCountsController */
  49. private $subscribersCountsController;
  50. public $permissions = [
  51. 'global' => AccessControl::PERMISSION_MANAGE_SETTINGS,
  52. ];
  53. public function __construct(
  54. SettingsController $settings,
  55. Bridge $bridge,
  56. AuthorizedEmailsController $authorizedEmailsController,
  57. TransactionalEmails $wcTransactionalEmails,
  58. WPFunctions $wp,
  59. EntityManager $entityManager,
  60. StatisticsOpensRepository $statisticsOpensRepository,
  61. ScheduledTasksRepository $scheduledTasksRepository,
  62. FormMessageController $messageController,
  63. ServicesChecker $servicesChecker,
  64. SegmentsRepository $segmentsRepository,
  65. SubscribersCountsController $subscribersCountsController
  66. ) {
  67. $this->settings = $settings;
  68. $this->bridge = $bridge;
  69. $this->authorizedEmailsController = $authorizedEmailsController;
  70. $this->wcTransactionalEmails = $wcTransactionalEmails;
  71. $this->servicesChecker = $servicesChecker;
  72. $this->wp = $wp;
  73. $this->entityManager = $entityManager;
  74. $this->statisticsOpensRepository = $statisticsOpensRepository;
  75. $this->scheduledTasksRepository = $scheduledTasksRepository;
  76. $this->messageController = $messageController;
  77. $this->segmentsRepository = $segmentsRepository;
  78. $this->subscribersCountsController = $subscribersCountsController;
  79. }
  80. public function get() {
  81. return $this->successResponse($this->settings->getAll());
  82. }
  83. public function set($settings = []) {
  84. if (empty($settings)) {
  85. return $this->badRequest(
  86. [
  87. APIError::BAD_REQUEST =>
  88. WPFunctions::get()->__('You have not specified any settings to be saved.', 'mailpoet'),
  89. ]);
  90. } else {
  91. $oldSettings = $this->settings->getAll();
  92. $signupConfirmation = $this->settings->get('signup_confirmation.enabled');
  93. foreach ($settings as $name => $value) {
  94. $this->settings->set($name, $value);
  95. }
  96. $this->onSettingsChange($oldSettings, $this->settings->getAll());
  97. // when pending approval, leave this to cron / Key Activation tab logic
  98. if (!$this->servicesChecker->isMailPoetAPIKeyPendingApproval()) {
  99. $this->bridge->onSettingsSave($settings);
  100. }
  101. $this->authorizedEmailsController->onSettingsSave($settings);
  102. if ($signupConfirmation !== $this->settings->get('signup_confirmation.enabled')) {
  103. $this->messageController->updateSuccessMessages();
  104. }
  105. return $this->successResponse($this->settings->getAll());
  106. }
  107. }
  108. public function recalculateSubscribersScore() {
  109. $this->statisticsOpensRepository->resetSubscribersScoreCalculation();
  110. $this->statisticsOpensRepository->resetSegmentsScoreCalculation();
  111. $task = $this->scheduledTasksRepository->findOneBy([
  112. 'type' => SubscribersEngagementScore::TASK_TYPE,
  113. 'status' => ScheduledTaskEntity::STATUS_SCHEDULED,
  114. ]);
  115. if (!$task) {
  116. $task = new ScheduledTaskEntity();
  117. $task->setType(SubscribersEngagementScore::TASK_TYPE);
  118. $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
  119. }
  120. $task->setScheduledAt(Carbon::createFromTimestamp($this->wp->currentTime('timestamp')));
  121. $this->entityManager->persist($task);
  122. $this->entityManager->flush();
  123. return $this->successResponse();
  124. }
  125. public function setAuthorizedFromAddress($data = []) {
  126. $address = $data['address'] ?? null;
  127. if (!$address) {
  128. return $this->badRequest([
  129. APIError::BAD_REQUEST => WPFunctions::get()->__('No email address specified.', 'mailpoet'),
  130. ]);
  131. }
  132. $address = trim($address);
  133. try {
  134. $this->authorizedEmailsController->setFromEmailAddress($address);
  135. } catch (\InvalidArgumentException $e) {
  136. return $this->badRequest([
  137. APIError::UNAUTHORIZED => WPFunctions::get()->__('Can’t use this email yet! Please authorize it first.', 'mailpoet'),
  138. ]);
  139. }
  140. if (!$this->servicesChecker->isMailPoetAPIKeyPendingApproval()) {
  141. MailerLog::resumeSending();
  142. }
  143. return $this->successResponse();
  144. }
  145. private function onSettingsChange($oldSettings, $newSettings) {
  146. // Recalculate inactive subscribers
  147. $oldInactivationInterval = $oldSettings['deactivate_subscriber_after_inactive_days'];
  148. $newInactivationInterval = $newSettings['deactivate_subscriber_after_inactive_days'];
  149. if ($oldInactivationInterval !== $newInactivationInterval) {
  150. $this->onInactiveSubscribersIntervalChange();
  151. }
  152. $oldSendingMethod = $oldSettings['mta_group'];
  153. $newSendingMethod = $newSettings['mta_group'];
  154. if (($oldSendingMethod !== $newSendingMethod) && ($newSendingMethod === 'mailpoet')) {
  155. $this->onMSSActivate($newSettings);
  156. }
  157. // Sync WooCommerce Customers list
  158. $oldSubscribeOldWoocommerceCustomers = isset($oldSettings['mailpoet_subscribe_old_woocommerce_customers']['enabled'])
  159. ? $oldSettings['mailpoet_subscribe_old_woocommerce_customers']['enabled']
  160. : '0';
  161. $newSubscribeOldWoocommerceCustomers = isset($newSettings['mailpoet_subscribe_old_woocommerce_customers']['enabled'])
  162. ? $newSettings['mailpoet_subscribe_old_woocommerce_customers']['enabled']
  163. : '0';
  164. if ($oldSubscribeOldWoocommerceCustomers !== $newSubscribeOldWoocommerceCustomers) {
  165. $this->onSubscribeOldWoocommerceCustomersChange();
  166. }
  167. if (!empty($newSettings['woocommerce']['use_mailpoet_editor'])) {
  168. $this->wcTransactionalEmails->init();
  169. }
  170. }
  171. private function onMSSActivate($newSettings) {
  172. // see mailpoet/assets/js/src/wizard/create_sender_settings.jsx:freeAddress
  173. $domain = str_replace('www.', '', $_SERVER['HTTP_HOST']);
  174. if (
  175. isset($newSettings['sender']['address'])
  176. && !empty($newSettings['reply_to']['address'])
  177. && ($newSettings['sender']['address'] === ('wordpress@' . $domain))
  178. ) {
  179. $sender = [
  180. 'name' => $newSettings['reply_to']['name'] ?? '',
  181. 'address' => $newSettings['reply_to']['address'],
  182. ];
  183. $this->settings->set('sender', $sender);
  184. $this->settings->set('reply_to', null);
  185. }
  186. }
  187. public function onSubscribeOldWoocommerceCustomersChange(): void {
  188. $task = $this->scheduledTasksRepository->findOneBy([
  189. 'type' => WooCommerceSync::TASK_TYPE,
  190. 'status' => ScheduledTaskEntity::STATUS_SCHEDULED,
  191. ]);
  192. if (!($task instanceof ScheduledTaskEntity)) {
  193. $task = $this->createScheduledTask(WooCommerceSync::TASK_TYPE);
  194. }
  195. $datetime = Carbon::createFromTimestamp((int)WPFunctions::get()->currentTime('timestamp'));
  196. $task->setScheduledAt($datetime->subMinute());
  197. $this->scheduledTasksRepository->persist($task);
  198. $this->scheduledTasksRepository->flush();
  199. }
  200. public function onInactiveSubscribersIntervalChange(): void {
  201. $task = $this->scheduledTasksRepository->findOneBy([
  202. 'type' => InactiveSubscribers::TASK_TYPE,
  203. 'status' => ScheduledTaskEntity::STATUS_SCHEDULED,
  204. ]);
  205. if (!($task instanceof ScheduledTaskEntity)) {
  206. $task = $this->createScheduledTask(InactiveSubscribers::TASK_TYPE);
  207. }
  208. $datetime = Carbon::createFromTimestamp((int)WPFunctions::get()->currentTime('timestamp'));
  209. $task->setScheduledAt($datetime->subMinute());
  210. $this->scheduledTasksRepository->persist($task);
  211. $this->scheduledTasksRepository->flush();
  212. }
  213. private function createScheduledTask(string $type): ScheduledTaskEntity {
  214. $task = new ScheduledTaskEntity();
  215. $task->setType($type);
  216. $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
  217. return $task;
  218. }
  219. public function recalculateSubscribersCountsCache() {
  220. $segments = $this->segmentsRepository->findAll();
  221. foreach ($segments as $segment) {
  222. $this->subscribersCountsController->recalculateSegmentStatisticsCache($segment);
  223. if ($segment->isStatic()) {
  224. $this->subscribersCountsController->recalculateSegmentGlobalStatusStatisticsCache($segment);
  225. }
  226. }
  227. $this->subscribersCountsController->recalculateSubscribersWithoutSegmentStatisticsCache();
  228. // remove redundancies from cache
  229. $this->subscribersCountsController->removeRedundancyFromStatisticsCache();
  230. return $this->successResponse();
  231. }
  232. }