Refactor subscription segments selection from old model to api

[MAILPOET-3297]
This commit is contained in:
Rostislav Wolny
2020-12-28 11:17:47 +01:00
committed by Veljko V
parent af574f7e1b
commit 441cb86a76
3 changed files with 24 additions and 20 deletions

View File

@ -7,9 +7,11 @@ use MailPoet\API\JSON\Error as APIError;
use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\API\JSON\ResponseBuilders\SubscribersResponseBuilder; use MailPoet\API\JSON\ResponseBuilders\SubscribersResponseBuilder;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Entities\FormEntity;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Form\FormsRepository;
use MailPoet\Form\Util\FieldNameObfuscator; use MailPoet\Form\Util\FieldNameObfuscator;
use MailPoet\Listing; use MailPoet\Listing;
use MailPoet\Models\Form; use MailPoet\Models\Form;
@ -90,6 +92,9 @@ class Subscribers extends APIEndpoint {
/** @var WelcomeScheduler */ /** @var WelcomeScheduler */
private $welcomeScheduler; private $welcomeScheduler;
/** @var FormsRepository */
private $formsRepository;
public function __construct( public function __construct(
SubscriberActions $subscriberActions, SubscriberActions $subscriberActions,
RequiredCustomFieldValidator $requiredCustomFieldValidator, RequiredCustomFieldValidator $requiredCustomFieldValidator,
@ -106,7 +111,8 @@ class Subscribers extends APIEndpoint {
SubscriberListingRepository $subscriberListingRepository, SubscriberListingRepository $subscriberListingRepository,
SegmentsRepository $segmentsRepository, SegmentsRepository $segmentsRepository,
FieldNameObfuscator $fieldNameObfuscator, FieldNameObfuscator $fieldNameObfuscator,
WelcomeScheduler $welcomeScheduler WelcomeScheduler $welcomeScheduler,
FormsRepository $formsRepository
) { ) {
$this->subscriberActions = $subscriberActions; $this->subscriberActions = $subscriberActions;
$this->requiredCustomFieldValidator = $requiredCustomFieldValidator; $this->requiredCustomFieldValidator = $requiredCustomFieldValidator;
@ -124,6 +130,7 @@ class Subscribers extends APIEndpoint {
$this->subscriberListingRepository = $subscriberListingRepository; $this->subscriberListingRepository = $subscriberListingRepository;
$this->segmentsRepository = $segmentsRepository; $this->segmentsRepository = $segmentsRepository;
$this->welcomeScheduler = $welcomeScheduler; $this->welcomeScheduler = $welcomeScheduler;
$this->formsRepository = $formsRepository;
} }
public function get($data = []) { public function get($data = []) {
@ -176,9 +183,10 @@ class Subscribers extends APIEndpoint {
public function subscribe($data = []) { public function subscribe($data = []) {
$formId = (isset($data['form_id']) ? (int)$data['form_id'] : false); $formId = (isset($data['form_id']) ? (int)$data['form_id'] : false);
$form = Form::findOne($formId); $form = Form::findOne($formId);
$formEntity = $this->formsRepository->findOneById($formId);
unset($data['form_id']); unset($data['form_id']);
if (!$form instanceof Form) { if (!$form instanceof Form || !$formEntity instanceof FormEntity) {
return $this->badRequest([ return $this->badRequest([
APIError::BAD_REQUEST => WPFunctions::get()->__('Please specify a valid form ID.', 'mailpoet'), APIError::BAD_REQUEST => WPFunctions::get()->__('Please specify a valid form ID.', 'mailpoet'),
]); ]);
@ -218,7 +226,7 @@ class Subscribers extends APIEndpoint {
? (array)$data['segments'] ? (array)$data['segments']
: [] : []
); );
$segmentIds = $form->filterSegments($segmentIds); $segmentIds = $this->getSegmentsForSubscription($formEntity, $segmentIds);
unset($data['segments']); unset($data['segments']);
if (empty($segmentIds)) { if (empty($segmentIds)) {
@ -548,4 +556,13 @@ class Subscribers extends APIEndpoint {
? $this->segmentsRepository->findOneById((int)$data['segment_id']) ? $this->segmentsRepository->findOneById((int)$data['segment_id'])
: null; : 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();
}
} }

View File

@ -190,4 +190,8 @@ class FormEntity {
} }
return $listSelection; return $listSelection;
} }
public function getSettingsSegmentIds(): array {
return $this->settings['segments'] ?? [];
}
} }

View File

@ -89,23 +89,6 @@ class Form extends Model {
return $fields ?: false; 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 = '') { public static function search($orm, $search = '') {
return $orm->whereLike('name', '%' . $search . '%'); return $orm->whereLike('name', '%' . $search . '%');
} }