diff --git a/lib/API/JSON/v1/AutomaticEmails.php b/lib/API/JSON/v1/AutomaticEmails.php new file mode 100644 index 0000000000..db3de47805 --- /dev/null +++ b/lib/API/JSON/v1/AutomaticEmails.php @@ -0,0 +1,80 @@ + AccessControl::PERMISSION_MANAGE_SEGMENTS, + ]; + + private $wp; + + function __construct() { + $this->wp = new WPFunctions; + } + + function getEventOptions($data) { + $query = (!empty($data['query'])) ? $data['query'] : null; + $filter = (!empty($data['filter'])) ? $data['filter'] : null; + $email_slug = (!empty($data['email_slug'])) ? $data['email_slug'] : null; + $event_slug = (!empty($data['event_slug'])) ? $data['event_slug'] : null; + + if (!$query || !$filter || !$email_slug || !$event_slug) { + return $this->errorResponse( + [ + APIError::BAD_REQUEST => WPFunctions::get()->__('Improperly formatted request.', 'mailpoet'), + ] + ); + } + + $automatic_emails = new \MailPoet\AutomaticEmails\AutomaticEmails(); + $event = $automatic_emails->getAutomaticEmailEventBySlug($email_slug, $event_slug); + $event_filter = (!empty($event['options']['remoteQueryFilter'])) ? $event['options']['remoteQueryFilter'] : null; + + return ($event_filter === $filter && WPFunctions::get()->hasFilter($event_filter)) ? + $this->successResponse($this->wp->applyFilters($event_filter, $query)) : + $this->errorResponse( + [ + APIError::BAD_REQUEST => WPFunctions::get()->__('Automatic email event filter does not exist.', 'mailpoet'), + ] + ); + } + + function getEventShortcodes($data) { + $email_slug = (!empty($data['email_slug'])) ? $data['email_slug'] : null; + $event_slug = (!empty($data['event_slug'])) ? $data['event_slug'] : null; + + if (!$email_slug || !$event_slug) { + return $this->errorResponse( + [ + APIError::BAD_REQUEST => WPFunctions::get()->__('Improperly formatted request.', 'mailpoet'), + ] + ); + } + + $automatic_emails = new \MailPoet\AutomaticEmails\AutomaticEmails(); + $automatic_email = $automatic_emails->getAutomaticEmailBySlug($email_slug); + $event = $automatic_emails->getAutomaticEmailEventBySlug($email_slug, $event_slug); + + if (!$event) { + return $this->errorResponse( + [ + APIError::BAD_REQUEST => WPFunctions::get()->__('Automatic email event does not exist.', 'mailpoet'), + ] + ); + } + + $event_shortcodes = (!empty($event['shortcodes']) && is_array($event['shortcodes'])) ? + [ + $automatic_email['title'] => $event['shortcodes'], + ] : + null; + + return $this->successResponse($event_shortcodes); + } +} diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 6c1ec4b84d..5217617db9 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -64,6 +64,7 @@ class ContainerConfigurator implements IContainerConfigurator { $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); + $container->autowire(\MailPoet\API\JSON\v1\AutomaticEmails::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\CustomFields::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\FeatureFlags::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\Forms::class)->setPublic(true); diff --git a/tests/integration/API/JSON/v1/AutomaticEmailsTest.php b/tests/integration/API/JSON/v1/AutomaticEmailsTest.php new file mode 100644 index 0000000000..4a1342b123 --- /dev/null +++ b/tests/integration/API/JSON/v1/AutomaticEmailsTest.php @@ -0,0 +1,223 @@ +wp = new WPFunctions; + } + function testItRequiresProperlyFormattedRequestWhenGettingEventOptions() { + $API = new AutomaticEmails(); + $expected_error_message = 'Improperly formatted request.'; + + // query is invalid + $data = [ + 'query' => null, + 'filter' => 'filter', + 'email_slug' => 'email_slug', + 'event_slug' => 'event_slug', + ]; + $result = $API->getEventOptions($data); + expect($result->errors[0]['message'])->equals($expected_error_message); + + // filter is invalid + $data = [ + 'query' => 'query', + 'filter' => null, + 'email_slug' => 'email_slug', + 'event_slug' => 'event_slug', + ]; + $result = $API->getEventOptions($data); + expect($result->errors[0]['message'])->equals($expected_error_message); + + // email slug is invalid + $data = [ + 'query' => 'query', + 'filter' => 'filter', + 'email_slug' => null, + 'event_slug' => 'event_slug', + ]; + $result = $API->getEventOptions($data); + expect($result->errors[0]['message'])->equals($expected_error_message); + + // event slug is invalid + $data = [ + 'query' => 'query', + 'filter' => 'filter', + 'email_slug' => 'email_slug', + 'event_slug' => null, + ]; + $result = $API->getEventOptions($data); + expect($result->errors[0]['message'])->equals($expected_error_message); + } + + function testItRequiresValidEventFilterWhenGettingEventOptions() { + $API = new AutomaticEmails(); + $expected_error_message = 'Automatic email event filter does not exist.'; + + $this->wp->addFilter('mailpoet_automatic_email_test', function() { + return [ + 'slug' => 'email', + 'title' => 'email_title', + 'description' => 'email_description', + 'events' => [ + [ + 'slug' => 'event_slug', + 'title' => 'event_title', + 'description' => 'event_description', + 'options' => [ + 'remoteQueryFilter' => 'test_filter', + ], + 'listingScheduleDisplayText' => 'sample_text', + ], + ], + ]; + }); + $this->wp->addFilter('test_filter', function($query) { + expect($query)->equals('test'); + return 'pass'; + }); + + $data = [ + 'query' => 'test', + 'filter' => 'invalid_filter', + // should be 'test_filter' + 'email_slug' => 'email', + 'event_slug' => 'event_slug', + ]; + $result = $API->getEventOptions($data); + expect($result->errors[0]['message'])->equals($expected_error_message); + + $this->wp->removeAllFilters('mailpoet_automatic_email_test'); + $this->wp->removeAllFilters('test_filter'); + } + + function testItGetsEventOptions() { + $API = new AutomaticEmails(); + + $this->wp->addFilter('mailpoet_automatic_email_test', function() { + return [ + 'slug' => 'email', + 'title' => 'email_title', + 'description' => 'email_description', + 'events' => [ + [ + 'slug' => 'event_slug', + 'title' => 'event_title', + 'description' => 'event_description', + 'options' => [ + 'remoteQueryFilter' => 'test_filter', + ], + 'listingScheduleDisplayText' => 'sample_text', + ], + ], + ]; + }); + $this->wp->addFilter('test_filter', function($query) { + expect($query)->equals('test'); + return 'pass'; + }); + + $data = [ + 'query' => 'test', + 'filter' => 'test_filter', + 'email_slug' => 'email', + 'event_slug' => 'event_slug', + ]; + $result = $API->getEventOptions($data); + expect($result->data)->equals('pass'); + + $this->wp->removeAllFilters('mailpoet_automatic_email_test'); + $this->wp->removeAllFilters('test_filter'); + } + + function testItRequiresProperlyFormattedRequestWhenGettingEventShortcodes() { + $API = new AutomaticEmails(); + $expected_error_message = 'Improperly formatted request.'; + + // email slug is invalid + $data = [ + 'email_slug' => null, + 'event_slug' => 'event_slug', + ]; + $result = $API->getEventOptions($data); + expect($result->errors[0]['message'])->equals($expected_error_message); + + // event slug is invalid + $data = [ + 'email_slug' => 'email_slug', + 'event_slug' => null, + ]; + $result = $API->getEventOptions($data); + expect($result->errors[0]['message'])->equals($expected_error_message); + } + + function testItRequiresValidEventWhenGettingEventShortcodes() { + $API = new AutomaticEmails(); + $expected_error_message = 'Automatic email event does not exist.'; + + $this->wp->addFilter('mailpoet_automatic_email_test', function() { + return [ + 'slug' => 'email', + 'title' => 'email_title', + 'description' => 'email_description', + 'events' => [ + [ + 'slug' => 'event_slug', + 'title' => 'event_title', + 'description' => 'event_description', + 'listingScheduleDisplayText' => 'sample_text', + ], + ], + ]; + }); + + $data = [ + 'email_slug' => 'email', + 'event_slug' => 'invalid_event', + // should be 'event_slug' + ]; + $result = $API->getEventShortcodes($data); + expect($result->errors[0]['message'])->equals($expected_error_message); + + $this->wp->removeAllFilters('mailpoet_automatic_email_test'); + } + + function testItGetsEventShortcodes() { + $API = new AutomaticEmails(); + $shortcodes = [ + [ + 'text' => 'shortcode_text', + 'shortcode' => '[shortcode]', + ], + ]; + $this->wp->addFilter('mailpoet_automatic_email_test', function() use ($shortcodes) { + return [ + 'slug' => 'email', + 'title' => 'email_title', + 'description' => 'email_description', + 'events' => [ + [ + 'slug' => 'event_slug', + 'title' => 'event_title', + 'description' => 'event_description', + 'listingScheduleDisplayText' => 'sample_text', + 'shortcodes' => $shortcodes, + ], + ], + ]; + }); + + $data = [ + 'email_slug' => 'email', + 'event_slug' => 'event_slug', + ]; + $result = $API->getEventShortcodes($data); + expect($result->data['email_title'])->equals($shortcodes); + + $this->wp->removeAllFilters('mailpoet_automatic_email_test'); + } +}