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\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();
}
}

View File

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

View File

@ -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 . '%');
}