Use Doctrine in Newsletters::get() API
[MAILPOET-2216]
This commit is contained in:
93
lib/API/JSON/ResponseBuilders/NewslettersResponseBuilder.php
Normal file
93
lib/API/JSON/ResponseBuilders/NewslettersResponseBuilder.php
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\API\JSON\ResponseBuilders;
|
||||||
|
|
||||||
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
|
use MailPoet\Entities\SegmentEntity;
|
||||||
|
use MailPoet\Entities\SendingQueueEntity;
|
||||||
|
|
||||||
|
class NewslettersResponseBuilder {
|
||||||
|
const DATE_FORMAT = 'Y-m-d H:i:s';
|
||||||
|
|
||||||
|
function build(NewsletterEntity $newsletter) {
|
||||||
|
return [
|
||||||
|
'id' => (string)$newsletter->getId(), // (string) for BC
|
||||||
|
'hash' => $newsletter->getHash(),
|
||||||
|
'subject' => $newsletter->getSubject(),
|
||||||
|
'type' => $newsletter->getType(),
|
||||||
|
'sender_address' => $newsletter->getSenderAddress(),
|
||||||
|
'sender_name' => $newsletter->getSenderName(),
|
||||||
|
'status' => $newsletter->getStatus(),
|
||||||
|
'reply_to_address' => $newsletter->getReplyToAddress(),
|
||||||
|
'reply_to_name' => $newsletter->getReplyToName(),
|
||||||
|
'preheader' => $newsletter->getPreheader(),
|
||||||
|
'body' => $newsletter->getBody(),
|
||||||
|
'sent_at' => ($sent_at = $newsletter->getSentAt()) ? $sent_at->format(self::DATE_FORMAT) : null,
|
||||||
|
'created_at' => $newsletter->getCreatedAt()->format(self::DATE_FORMAT),
|
||||||
|
'updated_at' => $newsletter->getUpdatedAt()->format(self::DATE_FORMAT),
|
||||||
|
'deleted_at' => ($deleted_at = $newsletter->getDeletedAt()) ? $deleted_at->format(self::DATE_FORMAT) : null,
|
||||||
|
'parent_id' => ($parent = $newsletter->getParent()) ? $parent->getId() : null,
|
||||||
|
'segments' => $this->buildSegments($newsletter),
|
||||||
|
'options' => $this->buildOptions($newsletter),
|
||||||
|
'queue' => ($queue = $newsletter->getQueue()) ? $this->buildQueue($queue) : false, // false for BC
|
||||||
|
'unsubscribe_token' => $newsletter->getUnsubscribeToken(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildSegments(NewsletterEntity $newsletter) {
|
||||||
|
$output = [];
|
||||||
|
foreach ($newsletter->getNewsletterSegments() as $newsletter_segment) {
|
||||||
|
$segment = $newsletter_segment->getSegment();
|
||||||
|
if ($segment->getDeletedAt()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$output[] = $this->buildSegment($segment);
|
||||||
|
}
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildOptions(NewsletterEntity $newsletter) {
|
||||||
|
$output = [];
|
||||||
|
foreach ($newsletter->getOptions() as $option) {
|
||||||
|
$output[$option->getOptionField()->getName()] = $option->getValue();
|
||||||
|
}
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildSegment(SegmentEntity $segment) {
|
||||||
|
return [
|
||||||
|
'id' => (string)$segment->getId(), // (string) for BC
|
||||||
|
'name' => $segment->getName(),
|
||||||
|
'type' => $segment->getType(),
|
||||||
|
'description' => $segment->getDescription(),
|
||||||
|
'created_at' => $segment->getCreatedAt()->format(self::DATE_FORMAT),
|
||||||
|
'updated_at' => $segment->getUpdatedAt()->format(self::DATE_FORMAT),
|
||||||
|
'deleted_at' => ($deleted_at = $segment->getDeletedAt()) ? $deleted_at->format(self::DATE_FORMAT) : null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildQueue(SendingQueueEntity $queue) {
|
||||||
|
$task = $queue->getTask();
|
||||||
|
|
||||||
|
// the following crazy mix of '$queue' and '$task' comes from 'array_merge($task, $queue)'
|
||||||
|
// (MailPoet\Tasks\Sending) which means all equal-named fields will be taken from '$queue'
|
||||||
|
return [
|
||||||
|
'id' => (string)$queue->getId(), // (string) for BC
|
||||||
|
'type' => $task->getType(),
|
||||||
|
'status' => $task->getStatus(),
|
||||||
|
'priority' => (string)$task->getPriority(), // (string) for BC
|
||||||
|
'scheduled_at' => ($scheduled_at = $task->getScheduledAt()) ? $scheduled_at->format(self::DATE_FORMAT) : null,
|
||||||
|
'processed_at' => ($processed_at = $task->getProcessedAt()) ? $processed_at->format(self::DATE_FORMAT) : null,
|
||||||
|
'created_at' => $queue->getCreatedAt()->format(self::DATE_FORMAT),
|
||||||
|
'updated_at' => $queue->getUpdatedAt()->format(self::DATE_FORMAT),
|
||||||
|
'deleted_at' => ($deleted_at = $queue->getDeletedAt()) ? $deleted_at->format(self::DATE_FORMAT) : null,
|
||||||
|
'meta' => $queue->getMeta(),
|
||||||
|
'task_id' => (string)$queue->getTask()->getId(), // (string) for BC
|
||||||
|
'newsletter_id' => (string)$queue->getNewsletter()->getId(), // (string) for BC
|
||||||
|
'newsletter_rendered_subject' => $queue->getNewsletterRenderedSubject(),
|
||||||
|
'count_total' => (string)$queue->getCountTotal(), // (string) for BC
|
||||||
|
'count_processed' => (string)$queue->getCountProcessed(), // (string) for BC
|
||||||
|
'count_to_process' => (string)$queue->getCountToProcess(), // (string) for BC
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@ namespace MailPoet\API\JSON\v1;
|
|||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use MailPoet\API\JSON\Endpoint as APIEndpoint;
|
use MailPoet\API\JSON\Endpoint as APIEndpoint;
|
||||||
use MailPoet\API\JSON\Error as APIError;
|
use MailPoet\API\JSON\Error as APIError;
|
||||||
|
use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
|
||||||
use MailPoet\Config\AccessControl;
|
use MailPoet\Config\AccessControl;
|
||||||
use MailPoet\Cron\CronHelper;
|
use MailPoet\Cron\CronHelper;
|
||||||
use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterQueueTask;
|
use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterQueueTask;
|
||||||
@ -17,6 +18,7 @@ use MailPoet\Models\NewsletterTemplate;
|
|||||||
use MailPoet\Models\SendingQueue;
|
use MailPoet\Models\SendingQueue;
|
||||||
use MailPoet\Models\Setting;
|
use MailPoet\Models\Setting;
|
||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
|
use MailPoet\Newsletter\NewslettersRepository;
|
||||||
use MailPoet\Newsletter\Renderer\Renderer;
|
use MailPoet\Newsletter\Renderer\Renderer;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
use MailPoet\Newsletter\Url as NewsletterUrl;
|
use MailPoet\Newsletter\Url as NewsletterUrl;
|
||||||
@ -51,13 +53,21 @@ class Newsletters extends APIEndpoint {
|
|||||||
'global' => AccessControl::PERMISSION_MANAGE_EMAILS,
|
'global' => AccessControl::PERMISSION_MANAGE_EMAILS,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/** @var NewslettersRepository */
|
||||||
|
private $newsletters_repository;
|
||||||
|
|
||||||
|
/** @var NewslettersResponseBuilder */
|
||||||
|
private $newsletters_response_builder;
|
||||||
|
|
||||||
function __construct(
|
function __construct(
|
||||||
Listing\BulkActionController $bulk_action,
|
Listing\BulkActionController $bulk_action,
|
||||||
Listing\Handler $listing_handler,
|
Listing\Handler $listing_handler,
|
||||||
WPFunctions $wp,
|
WPFunctions $wp,
|
||||||
WCHelper $woocommerce_helper,
|
WCHelper $woocommerce_helper,
|
||||||
SettingsController $settings,
|
SettingsController $settings,
|
||||||
AuthorizedEmailsController $authorized_emails_controller
|
AuthorizedEmailsController $authorized_emails_controller,
|
||||||
|
NewslettersRepository $newsletters_repository,
|
||||||
|
NewslettersResponseBuilder $newsletters_response_builder
|
||||||
) {
|
) {
|
||||||
$this->bulk_action = $bulk_action;
|
$this->bulk_action = $bulk_action;
|
||||||
$this->listing_handler = $listing_handler;
|
$this->listing_handler = $listing_handler;
|
||||||
@ -65,25 +75,28 @@ class Newsletters extends APIEndpoint {
|
|||||||
$this->woocommerce_helper = $woocommerce_helper;
|
$this->woocommerce_helper = $woocommerce_helper;
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
$this->authorized_emails_controller = $authorized_emails_controller;
|
$this->authorized_emails_controller = $authorized_emails_controller;
|
||||||
|
$this->newsletters_repository = $newsletters_repository;
|
||||||
|
$this->newsletters_response_builder = $newsletters_response_builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
function get($data = []) {
|
function get($data = []) {
|
||||||
$id = (isset($data['id']) ? (int)$data['id'] : false);
|
$newsletter = isset($data['id'])
|
||||||
$newsletter = Newsletter::findOne($id);
|
? $this->newsletters_repository->findOneById((int)$data['id'])
|
||||||
if ($newsletter instanceof Newsletter) {
|
: null;
|
||||||
$newsletter = $newsletter
|
|
||||||
->withSegments()
|
|
||||||
->withOptions()
|
|
||||||
->withSendingQueue();
|
|
||||||
|
|
||||||
|
if ($newsletter) {
|
||||||
|
$response = $this->newsletters_response_builder->build($newsletter);
|
||||||
$preview_url = NewsletterUrl::getViewInBrowserUrl(
|
$preview_url = NewsletterUrl::getViewInBrowserUrl(
|
||||||
NewsletterUrl::TYPE_LISTING_EDITOR,
|
NewsletterUrl::TYPE_LISTING_EDITOR,
|
||||||
$newsletter,
|
(object)[
|
||||||
|
'id' => $newsletter->getId(),
|
||||||
|
'hash' => $newsletter->getHash(),
|
||||||
|
],
|
||||||
Subscriber::getCurrentWPUser()
|
Subscriber::getCurrentWPUser()
|
||||||
);
|
);
|
||||||
|
|
||||||
$newsletter = $this->wp->applyFilters('mailpoet_api_newsletters_get_after', $newsletter->asArray());
|
$response = $this->wp->applyFilters('mailpoet_api_newsletters_get_after', $response);
|
||||||
return $this->successResponse($newsletter, ['preview_url' => $preview_url]);
|
return $this->successResponse($response, ['preview_url' => $preview_url]);
|
||||||
} else {
|
} else {
|
||||||
return $this->errorResponse([
|
return $this->errorResponse([
|
||||||
APIError::NOT_FOUND => WPFunctions::get()->__('This email does not exist.', 'mailpoet'),
|
APIError::NOT_FOUND => WPFunctions::get()->__('This email does not exist.', 'mailpoet'),
|
||||||
|
@ -75,6 +75,8 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
$container->autowire(\MailPoet\API\JSON\v1\SendingTaskSubscribers::class)->setPublic(true);
|
$container->autowire(\MailPoet\API\JSON\v1\SendingTaskSubscribers::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\API\JSON\v1\Setup::class)->setPublic(true);
|
$container->autowire(\MailPoet\API\JSON\v1\Setup::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\API\JSON\v1\Subscribers::class)->setPublic(true);
|
$container->autowire(\MailPoet\API\JSON\v1\Subscribers::class)->setPublic(true);
|
||||||
|
// API response builders
|
||||||
|
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder::class);
|
||||||
// Config
|
// Config
|
||||||
$container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true);
|
$container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Config\Activator::class)->setPublic(true);
|
$container->autowire(\MailPoet\Config\Activator::class)->setPublic(true);
|
||||||
@ -174,6 +176,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
$container->autowire(\MailPoet\Subscription\Registration::class)->setPublic(true);
|
$container->autowire(\MailPoet\Subscription\Registration::class)->setPublic(true);
|
||||||
// Newsletter
|
// Newsletter
|
||||||
$container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true);
|
$container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true);
|
||||||
|
$container->autowire(\MailPoet\Newsletter\NewslettersRepository::class);
|
||||||
// Util
|
// Util
|
||||||
$container->autowire(\MailPoet\Util\Cookies::class);
|
$container->autowire(\MailPoet\Util\Cookies::class);
|
||||||
$container->autowire(\MailPoet\Util\Url::class)->setPublic(true);
|
$container->autowire(\MailPoet\Util\Url::class)->setPublic(true);
|
||||||
|
19
lib/Newsletter/NewslettersRepository.php
Normal file
19
lib/Newsletter/NewslettersRepository.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Newsletter;
|
||||||
|
|
||||||
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
|
use MailPoet\Doctrine\Repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method NewsletterEntity[] findBy(array $criteria, array $order_by = null, int $limit = null, int $offset = null)
|
||||||
|
* @method NewsletterEntity|null findOneBy(array $criteria, array $order_by = null)
|
||||||
|
* @method NewsletterEntity|null findOneById(mixed $id)
|
||||||
|
* @method void persist(NewsletterEntity $entity)
|
||||||
|
* @method void remove(NewsletterEntity $entity)
|
||||||
|
*/
|
||||||
|
class NewslettersRepository extends Repository {
|
||||||
|
protected function getEntityClassName() {
|
||||||
|
return NewsletterEntity::class;
|
||||||
|
}
|
||||||
|
}
|
@ -8,6 +8,7 @@ use Codeception\Util\Fixtures;
|
|||||||
use Codeception\Util\Stub;
|
use Codeception\Util\Stub;
|
||||||
use Helper\WordPressHooks as WPHooksHelper;
|
use Helper\WordPressHooks as WPHooksHelper;
|
||||||
use MailPoet\API\JSON\Response as APIResponse;
|
use MailPoet\API\JSON\Response as APIResponse;
|
||||||
|
use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
|
||||||
use MailPoet\Listing\BulkActionController;
|
use MailPoet\Listing\BulkActionController;
|
||||||
use MailPoet\Listing\Handler;
|
use MailPoet\Listing\Handler;
|
||||||
use MailPoet\API\JSON\v1\Newsletters;
|
use MailPoet\API\JSON\v1\Newsletters;
|
||||||
@ -20,6 +21,7 @@ use MailPoet\Models\ScheduledTask;
|
|||||||
use MailPoet\Models\Segment;
|
use MailPoet\Models\Segment;
|
||||||
use MailPoet\Models\SubscriberSegment;
|
use MailPoet\Models\SubscriberSegment;
|
||||||
use MailPoet\Models\SendingQueue;
|
use MailPoet\Models\SendingQueue;
|
||||||
|
use MailPoet\Newsletter\NewslettersRepository;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
use MailPoet\Newsletter\Url;
|
use MailPoet\Newsletter\Url;
|
||||||
use MailPoet\Router\Router;
|
use MailPoet\Router\Router;
|
||||||
@ -126,7 +128,9 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
$wp,
|
$wp,
|
||||||
$this->makeEmpty(WCHelper::class),
|
$this->makeEmpty(WCHelper::class),
|
||||||
new SettingsController(),
|
new SettingsController(),
|
||||||
$this->make(AuthorizedEmailsController::class, ['onNewsletterUpdate' => Expected::never()])
|
$this->make(AuthorizedEmailsController::class, ['onNewsletterUpdate' => Expected::never()]),
|
||||||
|
ContainerWrapper::getInstance()->get(NewslettersRepository::class),
|
||||||
|
ContainerWrapper::getInstance()->get(NewslettersResponseBuilder::class)
|
||||||
);
|
);
|
||||||
$response = $this->endpoint->get(['id' => $this->newsletter->id]);
|
$response = $this->endpoint->get(['id' => $this->newsletter->id]);
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
expect($response->status)->equals(APIResponse::STATUS_OK);
|
||||||
@ -166,7 +170,9 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
$wp,
|
$wp,
|
||||||
$this->makeEmpty(WCHelper::class),
|
$this->makeEmpty(WCHelper::class),
|
||||||
new SettingsController(),
|
new SettingsController(),
|
||||||
$this->make(AuthorizedEmailsController::class, ['onNewsletterUpdate' => Expected::once()])
|
$this->make(AuthorizedEmailsController::class, ['onNewsletterUpdate' => Expected::once()]),
|
||||||
|
ContainerWrapper::getInstance()->get(NewslettersRepository::class),
|
||||||
|
ContainerWrapper::getInstance()->get(NewslettersResponseBuilder::class)
|
||||||
);
|
);
|
||||||
|
|
||||||
$response = $this->endpoint->save($valid_data);
|
$response = $this->endpoint->save($valid_data);
|
||||||
@ -534,7 +540,9 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
$wp,
|
$wp,
|
||||||
$this->makeEmpty(WCHelper::class),
|
$this->makeEmpty(WCHelper::class),
|
||||||
new SettingsController(),
|
new SettingsController(),
|
||||||
$this->make(AuthorizedEmailsController::class, ['onNewsletterUpdate' => Expected::never()])
|
$this->make(AuthorizedEmailsController::class, ['onNewsletterUpdate' => Expected::never()]),
|
||||||
|
ContainerWrapper::getInstance()->get(NewslettersRepository::class),
|
||||||
|
ContainerWrapper::getInstance()->get(NewslettersResponseBuilder::class)
|
||||||
);
|
);
|
||||||
|
|
||||||
$response = $this->endpoint->duplicate(['id' => $this->newsletter->id]);
|
$response = $this->endpoint->duplicate(['id' => $this->newsletter->id]);
|
||||||
|
Reference in New Issue
Block a user