Refactor JSON API to use container for creating endpoints

[MAILPOET-1637]
This commit is contained in:
Rostislav Wolny
2018-11-14 21:23:32 +01:00
parent a42787d10d
commit d49b2a72a9
7 changed files with 57 additions and 21 deletions

View File

@ -2,7 +2,6 @@
namespace MailPoet\API; namespace MailPoet\API;
use MailPoet\Config\AccessControl;
use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Container; use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Container;
use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
@ -17,8 +16,9 @@ class API {
self::$container = $container; self::$container = $container;
} }
static function JSON(AccessControl $access_control) { static function JSON() {
return new \MailPoet\API\JSON\API($access_control); self::checkContainer();
return self::$container->get(JSON\API::class);
} }
static function MP($version) { static function MP($version) {

View File

@ -2,6 +2,7 @@
namespace MailPoet\API\JSON; namespace MailPoet\API\JSON;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Container;
use MailPoet\Models\Setting; use MailPoet\Models\Setting;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
use MailPoet\Util\Security; use MailPoet\Util\Security;
@ -20,10 +21,16 @@ class API {
private $_available_api_versions = array( private $_available_api_versions = array(
'v1' 'v1'
); );
/** @var Container */
private $container;
/** @var AccessControl */
private $access_control; private $access_control;
const CURRENT_VERSION = 'v1'; const CURRENT_VERSION = 'v1';
function __construct(AccessControl $access_control) { function __construct(Container $container, AccessControl $access_control) {
$this->container = $container;
$this->access_control = $access_control; $this->access_control = $access_control;
foreach($this->_available_api_versions as $available_api_version) { foreach($this->_available_api_versions as $available_api_version) {
$this->addEndpointNamespace( $this->addEndpointNamespace(
@ -135,7 +142,7 @@ class API {
throw new \Exception(__('Invalid API endpoint.', 'mailpoet')); throw new \Exception(__('Invalid API endpoint.', 'mailpoet'));
} }
$endpoint = new $this->_request_endpoint_class(); $endpoint = $this->container->get($this->_request_endpoint_class);
if(!method_exists($endpoint, $this->_request_method)) { if(!method_exists($endpoint, $this->_request_method)) {
throw new \Exception(__('Invalid API endpoint method.', 'mailpoet')); throw new \Exception(__('Invalid API endpoint method.', 'mailpoet'));

View File

@ -261,7 +261,7 @@ class Initializer {
} }
function setupJSONAPI() { function setupJSONAPI() {
$json_api = API\API::JSON($this->access_control); $json_api = API\API::JSON();
$json_api->init(); $json_api->init();
} }

View File

@ -4,6 +4,7 @@ namespace MailPoet\DI;
use MailPoet\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; use MailPoet\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder;
use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Dumper\PhpDumper; use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Dumper\PhpDumper;
use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Reference;
class ContainerFactory { class ContainerFactory {
@ -57,6 +58,25 @@ class ContainerFactory {
$container->autowire(\MailPoet\Subscribers\NewSubscriberNotificationMailer::class)->setPublic(true); $container->autowire(\MailPoet\Subscribers\NewSubscriberNotificationMailer::class)->setPublic(true);
$container->autowire(\MailPoet\Subscribers\ConfirmationEmailMailer::class)->setPublic(true); $container->autowire(\MailPoet\Subscribers\ConfirmationEmailMailer::class)->setPublic(true);
$container->autowire(\MailPoet\Subscribers\RequiredCustomFieldValidator::class)->setPublic(true); $container->autowire(\MailPoet\Subscribers\RequiredCustomFieldValidator::class)->setPublic(true);
// JSON API
$container->register(\MailPoet\API\JSON\API::class)
->addArgument(new Reference('service_container'))
->setAutowired(true)
->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\AutomatedLatestContent::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\CustomFields::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Forms::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\ImportExport::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Mailer::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\MP2Migrator::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Newsletters::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\NewsletterTemplates::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Segments::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\SendingQueue::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Services::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Settings::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Setup::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Subscribers::class)->setPublic(true);
return $container; return $container;
} }

View File

@ -4,13 +4,12 @@ namespace MailPoet\Subscription;
use MailPoet\API\API as API; use MailPoet\API\API as API;
use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\Config\AccessControl;
use MailPoet\Util\Url as UrlHelper; use MailPoet\Util\Url as UrlHelper;
class Form { class Form {
static function onSubmit($request_data = false) { static function onSubmit($request_data = false) {
$request_data = ($request_data) ? $request_data : $_REQUEST; $request_data = ($request_data) ? $request_data : $_REQUEST;
$api = API::JSON(new AccessControl()); $api = API::JSON();
$api->setRequestData($request_data); $api->setRequestData($request_data);
$form_id = (!empty($request_data['data']['form_id'])) ? (int)$request_data['data']['form_id'] : false; $form_id = (!empty($request_data['data']['form_id'])) ? (int)$request_data['data']['form_id'] : false;
$response = $api->processRoute(); $response = $api->processRoute();

View File

@ -6,7 +6,7 @@ use MailPoet\Config\AccessControl;
class APITest extends \MailPoetTest { class APITest extends \MailPoetTest {
function testItCallsJSONAPI() { function testItCallsJSONAPI() {
expect(API::JSON(new AccessControl()))->isInstanceOf('MailPoet\API\JSON\API'); expect(API::JSON())->isInstanceOf('MailPoet\API\JSON\API');
} }
function testItCallsMPAPI() { function testItCallsMPAPI() {

View File

@ -5,12 +5,15 @@ namespace MailPoet\Test\API\JSON;
use Codeception\Stub; use Codeception\Stub;
use Codeception\Stub\Expected; use Codeception\Stub\Expected;
use Helper\WordPressHooks as WPHooksHelper; use Helper\WordPressHooks as WPHooksHelper;
use MailPoet\API\API;
use MailPoet\API\JSON\API as JSONAPI; use MailPoet\API\JSON\API as JSONAPI;
use MailPoet\API\JSON\Response; use MailPoet\API\JSON\Response;
use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\API\JSON\SuccessResponse; use MailPoet\API\JSON\SuccessResponse;
use MailPoet\API\JSON\v1\APITestNamespacedEndpointStubV1;
use MailPoet\API\JSON\v2\APITestNamespacedEndpointStubV2;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Container;
use MailPoet\DI\ContainerFactory;
use MailPoet\WP\Hooks; use MailPoet\WP\Hooks;
// required to be able to use wp_delete_user() // required to be able to use wp_delete_user()
@ -19,6 +22,9 @@ require_once('APITestNamespacedEndpointStubV1.php');
require_once('APITestNamespacedEndpointStubV2.php'); require_once('APITestNamespacedEndpointStubV2.php');
class APITest extends \MailPoetTest { class APITest extends \MailPoetTest {
/** @var Container */
private $container;
function _before() { function _before() {
// create WP user // create WP user
$this->wp_user_id = null; $this->wp_user_id = null;
@ -29,7 +35,12 @@ class APITest extends \MailPoetTest {
} else { } else {
$this->wp_user_id = $wp_user_id; $this->wp_user_id = $wp_user_id;
} }
$this->api = API::JSON(new AccessControl()); $container_factory = new ContainerFactory();
$this->container = $container_factory->createContainer();
$this->container->autowire(APITestNamespacedEndpointStubV1::class)->setPublic(true);
$this->container->autowire(APITestNamespacedEndpointStubV2::class)->setPublic(true);
$this->container->compile();
$this->api = $this->container->get(\MailPoet\API\JSON\API::class);
} }
function testItCallsAPISetupAction() { function testItCallsAPISetupAction() {
@ -143,10 +154,10 @@ class APITest extends \MailPoetTest {
'api_version' => 'v1', 'api_version' => 'v1',
'data' => array('test' => 'data') 'data' => array('test' => 'data')
); );
$access_control = new AccessControl();
$api = Stub::make( $api = Stub::make(
new \MailPoet\API\JSON\API($access_control), JSONAPI::class,
array( array(
'container' => $this->container,
'validatePermissions' => function($method, $permissions) use ($data) { 'validatePermissions' => function($method, $permissions) use ($data) {
expect($method)->equals($data['method']); expect($method)->equals($data['method']);
expect($permissions)->equals( expect($permissions)->equals(
@ -183,7 +194,7 @@ class APITest extends \MailPoetTest {
new AccessControl(), new AccessControl(),
array('validatePermission' => false) array('validatePermission' => false)
); );
$api = new \MailPoet\API\JSON\API($access_control); $api = new JSONAPI($this->container, $access_control);
$api->addEndpointNamespace($namespace['name'], $namespace['version']); $api->addEndpointNamespace($namespace['name'], $namespace['version']);
$api->setRequestData($data); $api->setRequestData($data);
$response = $api->processRoute(); $response = $api->processRoute();
@ -204,7 +215,7 @@ class APITest extends \MailPoetTest {
}) })
) )
); );
$api = new JSONAPI($access_control); $api = new JSONAPI($this->container, $access_control);
expect($api->validatePermissions(null, $permissions))->false(); expect($api->validatePermissions(null, $permissions))->false();
$access_control = Stub::make( $access_control = Stub::make(
@ -216,7 +227,7 @@ class APITest extends \MailPoetTest {
}) })
) )
); );
$api = new JSONAPI($access_control); $api = new JSONAPI($this->container, $access_control);
expect($api->validatePermissions(null, $permissions))->true(); expect($api->validatePermissions(null, $permissions))->true();
} }
@ -237,7 +248,7 @@ class APITest extends \MailPoetTest {
}) })
) )
); );
$api = new JSONAPI($access_control); $api = new JSONAPI($this->container, $access_control);
expect($api->validatePermissions('test', $permissions))->false(); expect($api->validatePermissions('test', $permissions))->false();
$access_control = Stub::make( $access_control = Stub::make(
@ -249,12 +260,11 @@ class APITest extends \MailPoetTest {
}) })
) )
); );
$api = new JSONAPI($access_control); $api = new JSONAPI($this->container, $access_control);
expect($api->validatePermissions('test', $permissions))->true(); expect($api->validatePermissions('test', $permissions))->true();
} }
function testItThrowsExceptionWhenInvalidEndpointMethodIsCalled() { function testItThrowsExceptionWhenInvalidEndpointMethodIsCalled() {
$this->api = API::JSON(new AccessControl());
$namespace = array( $namespace = array(
'name' => 'MailPoet\API\JSON\v2', 'name' => 'MailPoet\API\JSON\v2',
'version' => 'v2' 'version' => 'v2'