diff --git a/lib/API/API.php b/lib/API/API.php index 12b67fab21..be3a72afc0 100644 --- a/lib/API/API.php +++ b/lib/API/API.php @@ -2,7 +2,6 @@ namespace MailPoet\API; -use MailPoet\Config\AccessControl; use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Container; use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; @@ -17,8 +16,9 @@ class API { self::$container = $container; } - static function JSON(AccessControl $access_control) { - return new \MailPoet\API\JSON\API($access_control); + static function JSON() { + self::checkContainer(); + return self::$container->get(JSON\API::class); } static function MP($version) { diff --git a/lib/API/JSON/API.php b/lib/API/JSON/API.php index 22edf3446e..2807590bd7 100644 --- a/lib/API/JSON/API.php +++ b/lib/API/JSON/API.php @@ -2,6 +2,7 @@ namespace MailPoet\API\JSON; use MailPoet\Config\AccessControl; +use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Container; use MailPoet\Models\Setting; use MailPoet\Util\Helpers; use MailPoet\Util\Security; @@ -20,10 +21,16 @@ class API { private $_available_api_versions = array( 'v1' ); + /** @var Container */ + private $container; + + /** @var AccessControl */ private $access_control; + const CURRENT_VERSION = 'v1'; - function __construct(AccessControl $access_control) { + function __construct(Container $container, AccessControl $access_control) { + $this->container = $container; $this->access_control = $access_control; foreach($this->_available_api_versions as $available_api_version) { $this->addEndpointNamespace( @@ -135,7 +142,7 @@ class API { 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)) { throw new \Exception(__('Invalid API endpoint method.', 'mailpoet')); diff --git a/lib/Config/Initializer.php b/lib/Config/Initializer.php index 59318accbe..943aa0c072 100644 --- a/lib/Config/Initializer.php +++ b/lib/Config/Initializer.php @@ -261,7 +261,7 @@ class Initializer { } function setupJSONAPI() { - $json_api = API\API::JSON($this->access_control); + $json_api = API\API::JSON(); $json_api->init(); } diff --git a/lib/DI/ContainerFactory.php b/lib/DI/ContainerFactory.php index 85c91e852e..e4cc60b98e 100644 --- a/lib/DI/ContainerFactory.php +++ b/lib/DI/ContainerFactory.php @@ -4,6 +4,7 @@ namespace MailPoet\DI; use MailPoet\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Dumper\PhpDumper; +use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Reference; class ContainerFactory { @@ -57,6 +58,25 @@ class ContainerFactory { $container->autowire(\MailPoet\Subscribers\NewSubscriberNotificationMailer::class)->setPublic(true); $container->autowire(\MailPoet\Subscribers\ConfirmationEmailMailer::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; } diff --git a/lib/Subscription/Form.php b/lib/Subscription/Form.php index 0dea09a960..7aef1f5da0 100644 --- a/lib/Subscription/Form.php +++ b/lib/Subscription/Form.php @@ -4,13 +4,12 @@ namespace MailPoet\Subscription; use MailPoet\API\API as API; use MailPoet\API\JSON\Response as APIResponse; -use MailPoet\Config\AccessControl; use MailPoet\Util\Url as UrlHelper; class Form { static function onSubmit($request_data = false) { $request_data = ($request_data) ? $request_data : $_REQUEST; - $api = API::JSON(new AccessControl()); + $api = API::JSON(); $api->setRequestData($request_data); $form_id = (!empty($request_data['data']['form_id'])) ? (int)$request_data['data']['form_id'] : false; $response = $api->processRoute(); @@ -32,4 +31,4 @@ class Form { ); } } -} \ No newline at end of file +} diff --git a/tests/integration/API/APITest.php b/tests/integration/API/APITest.php index 69d2c76cbe..164a608bd6 100644 --- a/tests/integration/API/APITest.php +++ b/tests/integration/API/APITest.php @@ -6,7 +6,7 @@ use MailPoet\Config\AccessControl; class APITest extends \MailPoetTest { function testItCallsJSONAPI() { - expect(API::JSON(new AccessControl()))->isInstanceOf('MailPoet\API\JSON\API'); + expect(API::JSON())->isInstanceOf('MailPoet\API\JSON\API'); } function testItCallsMPAPI() { @@ -21,4 +21,4 @@ class APITest extends \MailPoetTest { expect($e->getMessage())->equals('Invalid API version.'); } } -} \ No newline at end of file +} diff --git a/tests/integration/API/JSON/APITest.php b/tests/integration/API/JSON/APITest.php index 84dc6f7131..75e24eea92 100644 --- a/tests/integration/API/JSON/APITest.php +++ b/tests/integration/API/JSON/APITest.php @@ -5,12 +5,15 @@ namespace MailPoet\Test\API\JSON; use Codeception\Stub; use Codeception\Stub\Expected; use Helper\WordPressHooks as WPHooksHelper; -use MailPoet\API\API; use MailPoet\API\JSON\API as JSONAPI; use MailPoet\API\JSON\Response; use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\SuccessResponse; +use MailPoet\API\JSON\v1\APITestNamespacedEndpointStubV1; +use MailPoet\API\JSON\v2\APITestNamespacedEndpointStubV2; use MailPoet\Config\AccessControl; +use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Container; +use MailPoet\DI\ContainerFactory; use MailPoet\WP\Hooks; // required to be able to use wp_delete_user() @@ -19,6 +22,9 @@ require_once('APITestNamespacedEndpointStubV1.php'); require_once('APITestNamespacedEndpointStubV2.php'); class APITest extends \MailPoetTest { + /** @var Container */ + private $container; + function _before() { // create WP user $this->wp_user_id = null; @@ -29,7 +35,12 @@ class APITest extends \MailPoetTest { } else { $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() { @@ -143,10 +154,10 @@ class APITest extends \MailPoetTest { 'api_version' => 'v1', 'data' => array('test' => 'data') ); - $access_control = new AccessControl(); $api = Stub::make( - new \MailPoet\API\JSON\API($access_control), + JSONAPI::class, array( + 'container' => $this->container, 'validatePermissions' => function($method, $permissions) use ($data) { expect($method)->equals($data['method']); expect($permissions)->equals( @@ -183,7 +194,7 @@ class APITest extends \MailPoetTest { new AccessControl(), 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->setRequestData($data); $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(); $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(); } @@ -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(); $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(); } function testItThrowsExceptionWhenInvalidEndpointMethodIsCalled() { - $this->api = API::JSON(new AccessControl()); $namespace = array( 'name' => 'MailPoet\API\JSON\v2', 'version' => 'v2'