From 441cb86a7644186f9f30cfa00ee17321228c1bed Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Mon, 28 Dec 2020 11:17:47 +0100 Subject: [PATCH] Refactor subscription segments selection from old model to api [MAILPOET-3297] --- lib/API/JSON/v1/Subscribers.php | 23 ++++++++++++++++++++--- lib/Entities/FormEntity.php | 4 ++++ lib/Models/Form.php | 17 ----------------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/lib/API/JSON/v1/Subscribers.php b/lib/API/JSON/v1/Subscribers.php index e81af530a2..8541f6b64c 100644 --- a/lib/API/JSON/v1/Subscribers.php +++ b/lib/API/JSON/v1/Subscribers.php @@ -7,9 +7,11 @@ use MailPoet\API\JSON\Error as APIError; use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\ResponseBuilders\SubscribersResponseBuilder; use MailPoet\Config\AccessControl; +use MailPoet\Entities\FormEntity; use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Entities\SubscriberEntity; +use MailPoet\Form\FormsRepository; use MailPoet\Form\Util\FieldNameObfuscator; use MailPoet\Listing; use MailPoet\Models\Form; @@ -90,6 +92,9 @@ class Subscribers extends APIEndpoint { /** @var WelcomeScheduler */ private $welcomeScheduler; + /** @var FormsRepository */ + private $formsRepository; + public function __construct( SubscriberActions $subscriberActions, RequiredCustomFieldValidator $requiredCustomFieldValidator, @@ -106,7 +111,8 @@ class Subscribers extends APIEndpoint { SubscriberListingRepository $subscriberListingRepository, SegmentsRepository $segmentsRepository, FieldNameObfuscator $fieldNameObfuscator, - WelcomeScheduler $welcomeScheduler + WelcomeScheduler $welcomeScheduler, + FormsRepository $formsRepository ) { $this->subscriberActions = $subscriberActions; $this->requiredCustomFieldValidator = $requiredCustomFieldValidator; @@ -124,6 +130,7 @@ class Subscribers extends APIEndpoint { $this->subscriberListingRepository = $subscriberListingRepository; $this->segmentsRepository = $segmentsRepository; $this->welcomeScheduler = $welcomeScheduler; + $this->formsRepository = $formsRepository; } public function get($data = []) { @@ -176,9 +183,10 @@ class Subscribers extends APIEndpoint { public function subscribe($data = []) { $formId = (isset($data['form_id']) ? (int)$data['form_id'] : false); $form = Form::findOne($formId); + $formEntity = $this->formsRepository->findOneById($formId); unset($data['form_id']); - if (!$form instanceof Form) { + if (!$form instanceof Form || !$formEntity instanceof FormEntity) { return $this->badRequest([ APIError::BAD_REQUEST => WPFunctions::get()->__('Please specify a valid form ID.', 'mailpoet'), ]); @@ -218,7 +226,7 @@ class Subscribers extends APIEndpoint { ? (array)$data['segments'] : [] ); - $segmentIds = $form->filterSegments($segmentIds); + $segmentIds = $this->getSegmentsForSubscription($formEntity, $segmentIds); unset($data['segments']); if (empty($segmentIds)) { @@ -548,4 +556,13 @@ class Subscribers extends APIEndpoint { ? $this->segmentsRepository->findOneById((int)$data['segment_id']) : null; } + + private function getSegmentsForSubscription(FormEntity $formEntity, array $submittedSegmentIds = []): array { + // If form contains segment selection blocks allow only segments ids configured in those blocks + $segmentBlocksSegmentIds = $formEntity->getSegmentBlocksSegmentIds(); + if (!empty($segmentBlocksSegmentIds)) { + return array_intersect($submittedSegmentIds, $segmentBlocksSegmentIds); + } + return $formEntity->getSettingsSegmentIds(); + } } diff --git a/lib/Entities/FormEntity.php b/lib/Entities/FormEntity.php index 35dc8450ad..2a6309b6ed 100644 --- a/lib/Entities/FormEntity.php +++ b/lib/Entities/FormEntity.php @@ -190,4 +190,8 @@ class FormEntity { } return $listSelection; } + + public function getSettingsSegmentIds(): array { + return $this->settings['segments'] ?? []; + } } diff --git a/lib/Models/Form.php b/lib/Models/Form.php index a99fc590ac..e90b8e1e49 100644 --- a/lib/Models/Form.php +++ b/lib/Models/Form.php @@ -89,23 +89,6 @@ class Form extends Model { return $fields ?: false; } - public function filterSegments(array $segmentIds = []) { - $settings = $this->getSettings(); - if (empty($settings['segments'])) { - return []; - } - - if (!empty($settings['segments_selected_by']) - && $settings['segments_selected_by'] == 'user' - ) { - $segmentIds = array_intersect($segmentIds, $settings['segments']); - } else { - $segmentIds = $settings['segments']; - } - - return $segmentIds; - } - public static function search($orm, $search = '') { return $orm->whereLike('name', '%' . $search . '%'); }