Refactor subscription segments selection from old model to api
[MAILPOET-3297]
This commit is contained in:
committed by
Veljko V
parent
af574f7e1b
commit
441cb86a76
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -190,4 +190,8 @@ class FormEntity {
|
|||||||
}
|
}
|
||||||
return $listSelection;
|
return $listSelection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSettingsSegmentIds(): array {
|
||||||
|
return $this->settings['segments'] ?? [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 . '%');
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user