diff --git a/lib/API/MP/v1/API.php b/lib/API/MP/v1/API.php index 97ff9eb4a5..648f109c7f 100644 --- a/lib/API/MP/v1/API.php +++ b/lib/API/MP/v1/API.php @@ -2,8 +2,6 @@ namespace MailPoet\API\MP\v1; -use MailPoet\CustomFields\ApiDataSanitizer; -use MailPoet\Models\CustomField; use MailPoet\Models\Segment; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; @@ -28,89 +26,38 @@ class API { /** @var RequiredCustomFieldValidator */ private $requiredCustomFieldValidator; - /** @var ApiDataSanitizer */ - private $customFieldsDataSanitizer; - /** @var WelcomeScheduler */ private $welcomeScheduler; /** @var SettingsController */ private $settings; + /** @var CustomFields */ + private $customFields; + public function __construct( NewSubscriberNotificationMailer $newSubscriberNotificationMailer, ConfirmationEmailMailer $confirmationEmailMailer, RequiredCustomFieldValidator $requiredCustomFieldValidator, - ApiDataSanitizer $customFieldsDataSanitizer, WelcomeScheduler $welcomeScheduler, + CustomFields $customFields, SettingsController $settings ) { $this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer; $this->confirmationEmailMailer = $confirmationEmailMailer; $this->requiredCustomFieldValidator = $requiredCustomFieldValidator; - $this->customFieldsDataSanitizer = $customFieldsDataSanitizer; $this->welcomeScheduler = $welcomeScheduler; $this->settings = $settings; + $this->customFields = $customFields; } public function getSubscriberFields() { - $data = [ - [ - 'id' => 'email', - 'name' => __('Email', 'mailpoet'), - 'type' => 'text', - 'params' => [ - 'required' => '1', - ], - ], - [ - 'id' => 'first_name', - 'name' => __('First name', 'mailpoet'), - 'type' => 'text', - 'params' => [ - 'required' => '', - ], - ], - [ - 'id' => 'last_name', - 'name' => __('Last name', 'mailpoet'), - 'type' => 'text', - 'params' => [ - 'required' => '', - ], - ], - ]; - - $customFields = CustomField::selectMany(['id', 'name', 'type', 'params'])->findMany(); - foreach ($customFields as $customField) { - $result = [ - 'id' => 'cf_' . $customField->id, - 'name' => $customField->name, - 'type' => $customField->type, - ]; - if (is_serialized($customField->params)) { - $result['params'] = unserialize($customField->params); - } else { - $result['params'] = $customField->params; - } - $data[] = $result; - } - - return $data; + return $this->customFields->getSubscriberFields(); } public function addSubscriberField(array $data = []) { try { - $customField = CustomField::createOrUpdate($this->customFieldsDataSanitizer->sanitize($data)); - $errors = $customField->getErrors(); - if (!empty($errors)) { - throw new APIException('Failed to save a new subscriber field ' . join(', ', $errors), APIException::FAILED_TO_SAVE_SUBSCRIBER_FIELD); - } - $customField = CustomField::findOne($customField->id); - if (!$customField instanceof CustomField) { - throw new APIException('Failed to create a new subscriber field', APIException::FAILED_TO_SAVE_SUBSCRIBER_FIELD); - } - return $customField->asArray(); + return $this->customFields->addSubscriberField($data); } catch (\InvalidArgumentException $e) { throw new APIException($e->getMessage(), $e->getCode(), $e); } @@ -288,7 +235,7 @@ class API { } // separate data into default and custom fields - list($defaultFields, $customFields) = Subscriber::extractCustomFieldsFromFromObject($subscriber); + [$defaultFields, $customFields] = Subscriber::extractCustomFieldsFromFromObject($subscriber); // filter out all incoming data that we don't want to change, like status ... $defaultFields = array_intersect_key($defaultFields, array_flip(['email', 'first_name', 'last_name', 'subscribed_ip'])); diff --git a/lib/API/MP/v1/CustomFields.php b/lib/API/MP/v1/CustomFields.php new file mode 100644 index 0000000000..1a6be44ef6 --- /dev/null +++ b/lib/API/MP/v1/CustomFields.php @@ -0,0 +1,74 @@ +customFieldsDataSanitizer = $customFieldsDataSanitizer; + } + + public function getSubscriberFields(): array { + $data = [ + [ + 'id' => 'email', + 'name' => __('Email', 'mailpoet'), + 'type' => 'text', + 'params' => [ + 'required' => '1', + ], + ], + [ + 'id' => 'first_name', + 'name' => __('First name', 'mailpoet'), + 'type' => 'text', + 'params' => [ + 'required' => '', + ], + ], + [ + 'id' => 'last_name', + 'name' => __('Last name', 'mailpoet'), + 'type' => 'text', + 'params' => [ + 'required' => '', + ], + ], + ]; + + $customFields = CustomField::selectMany(['id', 'name', 'type', 'params'])->findMany(); + foreach ($customFields as $customField) { + $result = [ + 'id' => 'cf_' . $customField->id, + 'name' => $customField->name, + 'type' => $customField->type, + ]; + if (is_serialized($customField->params)) { + $result['params'] = unserialize($customField->params); + } else { + $result['params'] = $customField->params; + } + $data[] = $result; + } + + return $data; + } + + public function addSubscriberField(array $data = []): array { + $customField = CustomField::createOrUpdate($this->customFieldsDataSanitizer->sanitize($data)); + $errors = $customField->getErrors(); + if (!empty($errors)) { + throw new APIException('Failed to save a new subscriber field ' . join(', ', $errors), APIException::FAILED_TO_SAVE_SUBSCRIBER_FIELD); + } + $customField = CustomField::findOne($customField->id); + if (!$customField instanceof CustomField) { + throw new APIException('Failed to create a new subscriber field', APIException::FAILED_TO_SAVE_SUBSCRIBER_FIELD); + } + return $customField->asArray(); + } +} diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 651f23e5da..fac0c2d3e9 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -55,6 +55,7 @@ class ContainerConfigurator implements IContainerConfigurator { ->setAutowired(true) ->setPublic(true); $container->autowire(\MailPoet\API\JSON\ErrorHandler::class)->setPublic(true); + $container->autowire(\MailPoet\API\MP\v1\CustomFields::class)->setPublic(true); $container->autowire(\MailPoet\API\MP\v1\API::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\Analytics::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\AutomatedLatestContent::class)->setPublic(true); diff --git a/tests/integration/API/MP/APITest.php b/tests/integration/API/MP/APITest.php index 1d7d6dccaa..d7357aea4f 100644 --- a/tests/integration/API/MP/APITest.php +++ b/tests/integration/API/MP/APITest.php @@ -5,6 +5,7 @@ namespace MailPoet\Test\API\MP; use Codeception\Stub; use Codeception\Stub\Expected; use Codeception\Util\Fixtures; +use MailPoet\API\MP\v1\CustomFields; use MailPoet\CustomFields\ApiDataSanitizer; use MailPoet\CustomFields\CustomFieldsRepository; use MailPoet\Entities\CustomFieldEntity; @@ -38,8 +39,8 @@ class APITest extends \MailPoetTest { Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']), Stub::makeEmpty(ConfirmationEmailMailer::class, ['sendConfirmationEmail']), $this->diContainer->get(RequiredCustomFieldValidator::class), - Stub::makeEmpty(ApiDataSanitizer::class), Stub::makeEmpty(WelcomeScheduler::class), + $this->diContainer->get(CustomFields::class), SettingsController::getInstance() ); } @@ -288,8 +289,8 @@ class APITest extends \MailPoetTest { $notificationMailer, $this->makeEmpty(ConfirmationEmailMailer::class), $this->makeEmpty(RequiredCustomFieldValidator::class), - $this->makeEmpty(ApiDataSanitizer::class), Stub::makeEmpty(WelcomeScheduler::class), + $this->diContainer->get(CustomFields::class), SettingsController::getInstance() ); $API->subscribeToLists($subscriber->email, $segments, ['send_confirmation_email' => false, 'skip_subscriber_notification' => true]); @@ -301,8 +302,8 @@ class APITest extends \MailPoetTest { $notificationMailer, $this->makeEmpty(ConfirmationEmailMailer::class), $this->makeEmpty(RequiredCustomFieldValidator::class), - $this->makeEmpty(ApiDataSanitizer::class), Stub::makeEmpty(WelcomeScheduler::class), + $this->diContainer->get(CustomFields::class), SettingsController::getInstance() ); $API->subscribeToLists($subscriber->email, $segments, ['send_confirmation_email' => false, 'skip_subscriber_notification' => false]); @@ -560,8 +561,8 @@ class APITest extends \MailPoetTest { Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']), Stub::makeEmpty(ConfirmationEmailMailer::class, ['sendConfirmationEmailOnce']), $this->diContainer->get(RequiredCustomFieldValidator::class), - Stub::makeEmpty(ApiDataSanitizer::class), $welcomeScheduler, + $this->diContainer->get(CustomFields::class), Stub::makeEmpty(SettingsController::class) ); $subscriber = [