Implement NewsletterTempates::getAll() API using Doctrine

[MAILPOET-2647]
This commit is contained in:
Jan Jakeš
2020-03-05 16:09:42 +01:00
committed by Veljko V
parent a50a23c0e2
commit 29ebd113b5
4 changed files with 61 additions and 11 deletions

View File

@ -0,0 +1,26 @@
<?php
namespace MailPoet\API\JSON\ResponseBuilders;
use MailPoet\Entities\NewsletterTemplateEntity;
class NewsletterTemplatesResponseBuilder {
/**
* @param NewsletterTemplateEntity[] $newsletterTemplates
* @return mixed[]
*/
public function buildForListing(array $newsletterTemplates): array {
$data = [];
foreach ($newsletterTemplates as $template) {
$data[] = [
'id' => $template->getId(),
'categories' => $template->getCategories(),
'thumbnail' => $template->getThumbnail(),
'name' => $template->getName(),
'description' => $template->getDescription(),
'readonly' => $template->getReadonly(),
];
}
return $data;
}
}

View File

@ -4,8 +4,10 @@ namespace MailPoet\API\JSON\v1;
use MailPoet\API\JSON\Endpoint as APIEndpoint;
use MailPoet\API\JSON\Error as APIError;
use MailPoet\API\JSON\ResponseBuilders\NewsletterTemplatesResponseBuilder;
use MailPoet\Config\AccessControl;
use MailPoet\Models\NewsletterTemplate;
use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository;
use MailPoet\WP\Functions as WPFunctions;
class NewsletterTemplates extends APIEndpoint {
@ -17,6 +19,20 @@ class NewsletterTemplates extends APIEndpoint {
'getAll',
];
/** @var NewsletterTemplatesRepository */
private $newsletterTemplatesRepository;
/** @var NewsletterTemplatesResponseBuilder */
private $newsletterTemplatesResponseBuilder;
public function __construct(
NewsletterTemplatesRepository $newsletterTemplatesRepository,
NewsletterTemplatesResponseBuilder $newsletterTemplatesResponseBuilder
) {
$this->newsletterTemplatesRepository = $newsletterTemplatesRepository;
$this->newsletterTemplatesResponseBuilder = $newsletterTemplatesResponseBuilder;
}
public function get($data = []) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$template = NewsletterTemplate::findOne($id);
@ -32,17 +48,9 @@ class NewsletterTemplates extends APIEndpoint {
}
public function getAll() {
$collection = NewsletterTemplate
::selectExpr('id, categories, thumbnail, name, description, readonly')
->orderByAsc('readonly')
->orderByDesc('created_at')
->orderByDesc('id')
->findMany();
$templates = array_map(function($item) {
return $item->asArray();
}, $collection);
return $this->successResponse($templates);
$templates = $this->newsletterTemplatesRepository->findAllForListing();
$data = $this->newsletterTemplatesResponseBuilder->buildForListing($templates);
return $this->successResponse($data);
}
public function save($data = []) {

View File

@ -88,6 +88,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\API\JSON\v1\WoocommerceSettings::class)->setPublic(true);
// API response builders
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder::class);
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\NewsletterTemplatesResponseBuilder::class);
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\CustomFieldsResponseBuilder::class);
// Config
$container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true);
@ -264,6 +265,8 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Newsletter\Scheduler\PostNotificationScheduler::class);
$container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserController::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserRenderer::class)->setPublic(true);
// Newsletter templates
$container->autowire(\MailPoet\NewsletterTemplates\NewsletterTemplatesRepository::class)->setPublic(true);
// Util
$container->autowire(\MailPoet\Util\Cookies::class);
$container->autowire(\MailPoet\Util\Url::class)->setPublic(true);

View File

@ -16,4 +16,17 @@ class NewsletterTemplatesRepository extends Repository {
protected function getEntityClassName() {
return NewsletterTemplateEntity::class;
}
/**
* @return NewsletterTemplateEntity[]
*/
public function findAllForListing(): array {
return $this->doctrineRepository->createQueryBuilder('nt')
->select('PARTIAL nt.{id,categories,thumbnail,name,description,readonly}')
->addOrderBy('nt.readonly', 'ASC')
->addOrderBy('nt.createdAt', 'DESC')
->addOrderBy('nt.id', 'DESC')
->getQuery()
->getResult();
}
}