| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- <?php
- namespace MailPoet\API\JSON\v1;
- if (!defined('ABSPATH')) exit;
- use MailPoet\API\JSON\Endpoint as APIEndpoint;
- use MailPoet\API\JSON\Error as APIError;
- use MailPoet\Config\AccessControl;
- use MailPoet\Config\ServicesChecker;
- use MailPoet\Cron\Workers\InactiveSubscribers;
- use MailPoet\Cron\Workers\SubscribersEngagementScore;
- use MailPoet\Cron\Workers\WooCommerceSync;
- use MailPoet\Entities\ScheduledTaskEntity;
- use MailPoet\Form\FormMessageController;
- use MailPoet\Mailer\MailerLog;
- use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
- use MailPoet\Segments\SegmentsRepository;
- use MailPoet\Services\AuthorizedEmailsController;
- use MailPoet\Services\Bridge;
- use MailPoet\Settings\SettingsController;
- use MailPoet\Statistics\StatisticsOpensRepository;
- use MailPoet\Subscribers\SubscribersCountsController;
- use MailPoet\WooCommerce\TransactionalEmails;
- use MailPoet\WP\Functions as WPFunctions;
- use MailPoetVendor\Carbon\Carbon;
- use MailPoetVendor\Doctrine\ORM\EntityManager;
- class Settings extends APIEndpoint {
- /** @var SettingsController */
- private $settings;
- /** @var Bridge */
- private $bridge;
- /** @var AuthorizedEmailsController */
- private $authorizedEmailsController;
- /** @var TransactionalEmails */
- private $wcTransactionalEmails;
- /** @var ServicesChecker */
- private $servicesChecker;
- /** @var WPFunctions */
- private $wp;
- /** @var EntityManager */
- private $entityManager;
- /** @var StatisticsOpensRepository */
- private $statisticsOpensRepository;
- /** @var ScheduledTasksRepository */
- private $scheduledTasksRepository;
- /** @var FormMessageController */
- private $messageController;
- /** @var SegmentsRepository */
- private $segmentsRepository;
- /** @var SubscribersCountsController */
- private $subscribersCountsController;
- public $permissions = [
- 'global' => AccessControl::PERMISSION_MANAGE_SETTINGS,
- ];
- public function __construct(
- SettingsController $settings,
- Bridge $bridge,
- AuthorizedEmailsController $authorizedEmailsController,
- TransactionalEmails $wcTransactionalEmails,
- WPFunctions $wp,
- EntityManager $entityManager,
- StatisticsOpensRepository $statisticsOpensRepository,
- ScheduledTasksRepository $scheduledTasksRepository,
- FormMessageController $messageController,
- ServicesChecker $servicesChecker,
- SegmentsRepository $segmentsRepository,
- SubscribersCountsController $subscribersCountsController
- ) {
- $this->settings = $settings;
- $this->bridge = $bridge;
- $this->authorizedEmailsController = $authorizedEmailsController;
- $this->wcTransactionalEmails = $wcTransactionalEmails;
- $this->servicesChecker = $servicesChecker;
- $this->wp = $wp;
- $this->entityManager = $entityManager;
- $this->statisticsOpensRepository = $statisticsOpensRepository;
- $this->scheduledTasksRepository = $scheduledTasksRepository;
- $this->messageController = $messageController;
- $this->segmentsRepository = $segmentsRepository;
- $this->subscribersCountsController = $subscribersCountsController;
- }
- public function get() {
- return $this->successResponse($this->settings->getAll());
- }
- public function set($settings = []) {
- if (empty($settings)) {
- return $this->badRequest(
- [
- APIError::BAD_REQUEST =>
- WPFunctions::get()->__('You have not specified any settings to be saved.', 'mailpoet'),
- ]);
- } else {
- $oldSettings = $this->settings->getAll();
- $signupConfirmation = $this->settings->get('signup_confirmation.enabled');
- foreach ($settings as $name => $value) {
- $this->settings->set($name, $value);
- }
- $this->onSettingsChange($oldSettings, $this->settings->getAll());
- // when pending approval, leave this to cron / Key Activation tab logic
- if (!$this->servicesChecker->isMailPoetAPIKeyPendingApproval()) {
- $this->bridge->onSettingsSave($settings);
- }
- $this->authorizedEmailsController->onSettingsSave($settings);
- if ($signupConfirmation !== $this->settings->get('signup_confirmation.enabled')) {
- $this->messageController->updateSuccessMessages();
- }
- return $this->successResponse($this->settings->getAll());
- }
- }
- public function recalculateSubscribersScore() {
- $this->statisticsOpensRepository->resetSubscribersScoreCalculation();
- $this->statisticsOpensRepository->resetSegmentsScoreCalculation();
- $task = $this->scheduledTasksRepository->findOneBy([
- 'type' => SubscribersEngagementScore::TASK_TYPE,
- 'status' => ScheduledTaskEntity::STATUS_SCHEDULED,
- ]);
- if (!$task) {
- $task = new ScheduledTaskEntity();
- $task->setType(SubscribersEngagementScore::TASK_TYPE);
- $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
- }
- $task->setScheduledAt(Carbon::createFromTimestamp($this->wp->currentTime('timestamp')));
- $this->entityManager->persist($task);
- $this->entityManager->flush();
- return $this->successResponse();
- }
- public function setAuthorizedFromAddress($data = []) {
- $address = $data['address'] ?? null;
- if (!$address) {
- return $this->badRequest([
- APIError::BAD_REQUEST => WPFunctions::get()->__('No email address specified.', 'mailpoet'),
- ]);
- }
- $address = trim($address);
- try {
- $this->authorizedEmailsController->setFromEmailAddress($address);
- } catch (\InvalidArgumentException $e) {
- return $this->badRequest([
- APIError::UNAUTHORIZED => WPFunctions::get()->__('Can’t use this email yet! Please authorize it first.', 'mailpoet'),
- ]);
- }
- if (!$this->servicesChecker->isMailPoetAPIKeyPendingApproval()) {
- MailerLog::resumeSending();
- }
- return $this->successResponse();
- }
- private function onSettingsChange($oldSettings, $newSettings) {
- // Recalculate inactive subscribers
- $oldInactivationInterval = $oldSettings['deactivate_subscriber_after_inactive_days'];
- $newInactivationInterval = $newSettings['deactivate_subscriber_after_inactive_days'];
- if ($oldInactivationInterval !== $newInactivationInterval) {
- $this->onInactiveSubscribersIntervalChange();
- }
- $oldSendingMethod = $oldSettings['mta_group'];
- $newSendingMethod = $newSettings['mta_group'];
- if (($oldSendingMethod !== $newSendingMethod) && ($newSendingMethod === 'mailpoet')) {
- $this->onMSSActivate($newSettings);
- }
- // Sync WooCommerce Customers list
- $oldSubscribeOldWoocommerceCustomers = isset($oldSettings['mailpoet_subscribe_old_woocommerce_customers']['enabled'])
- ? $oldSettings['mailpoet_subscribe_old_woocommerce_customers']['enabled']
- : '0';
- $newSubscribeOldWoocommerceCustomers = isset($newSettings['mailpoet_subscribe_old_woocommerce_customers']['enabled'])
- ? $newSettings['mailpoet_subscribe_old_woocommerce_customers']['enabled']
- : '0';
- if ($oldSubscribeOldWoocommerceCustomers !== $newSubscribeOldWoocommerceCustomers) {
- $this->onSubscribeOldWoocommerceCustomersChange();
- }
- if (!empty($newSettings['woocommerce']['use_mailpoet_editor'])) {
- $this->wcTransactionalEmails->init();
- }
- }
- private function onMSSActivate($newSettings) {
- // see mailpoet/assets/js/src/wizard/create_sender_settings.jsx:freeAddress
- $domain = str_replace('www.', '', $_SERVER['HTTP_HOST']);
- if (
- isset($newSettings['sender']['address'])
- && !empty($newSettings['reply_to']['address'])
- && ($newSettings['sender']['address'] === ('wordpress@' . $domain))
- ) {
- $sender = [
- 'name' => $newSettings['reply_to']['name'] ?? '',
- 'address' => $newSettings['reply_to']['address'],
- ];
- $this->settings->set('sender', $sender);
- $this->settings->set('reply_to', null);
- }
- }
- public function onSubscribeOldWoocommerceCustomersChange(): void {
- $task = $this->scheduledTasksRepository->findOneBy([
- 'type' => WooCommerceSync::TASK_TYPE,
- 'status' => ScheduledTaskEntity::STATUS_SCHEDULED,
- ]);
- if (!($task instanceof ScheduledTaskEntity)) {
- $task = $this->createScheduledTask(WooCommerceSync::TASK_TYPE);
- }
- $datetime = Carbon::createFromTimestamp((int)WPFunctions::get()->currentTime('timestamp'));
- $task->setScheduledAt($datetime->subMinute());
- $this->scheduledTasksRepository->persist($task);
- $this->scheduledTasksRepository->flush();
- }
- public function onInactiveSubscribersIntervalChange(): void {
- $task = $this->scheduledTasksRepository->findOneBy([
- 'type' => InactiveSubscribers::TASK_TYPE,
- 'status' => ScheduledTaskEntity::STATUS_SCHEDULED,
- ]);
- if (!($task instanceof ScheduledTaskEntity)) {
- $task = $this->createScheduledTask(InactiveSubscribers::TASK_TYPE);
- }
- $datetime = Carbon::createFromTimestamp((int)WPFunctions::get()->currentTime('timestamp'));
- $task->setScheduledAt($datetime->subMinute());
- $this->scheduledTasksRepository->persist($task);
- $this->scheduledTasksRepository->flush();
- }
- private function createScheduledTask(string $type): ScheduledTaskEntity {
- $task = new ScheduledTaskEntity();
- $task->setType($type);
- $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
- return $task;
- }
- public function recalculateSubscribersCountsCache() {
- $segments = $this->segmentsRepository->findAll();
- foreach ($segments as $segment) {
- $this->subscribersCountsController->recalculateSegmentStatisticsCache($segment);
- if ($segment->isStatic()) {
- $this->subscribersCountsController->recalculateSegmentGlobalStatusStatisticsCache($segment);
- }
- }
- $this->subscribersCountsController->recalculateSubscribersWithoutSegmentStatisticsCache();
- // remove redundancies from cache
- $this->subscribersCountsController->removeRedundancyFromStatisticsCache();
- return $this->successResponse();
- }
- }
|