Refactor newsletter API bulk actions to use repository methods
[MAILPOET-2898]
This commit is contained in:
committed by
Veljko V
parent
0a57199997
commit
2b47684490
@ -25,6 +25,7 @@ use MailPoet\Newsletter\Scheduler\Scheduler;
|
|||||||
use MailPoet\Newsletter\Url as NewsletterUrl;
|
use MailPoet\Newsletter\Url as NewsletterUrl;
|
||||||
use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository;
|
use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
|
use MailPoet\UnexpectedValueException;
|
||||||
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
||||||
use MailPoet\WP\Emoji;
|
use MailPoet\WP\Emoji;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
@ -32,9 +33,6 @@ use MailPoetVendor\Carbon\Carbon;
|
|||||||
|
|
||||||
class Newsletters extends APIEndpoint {
|
class Newsletters extends APIEndpoint {
|
||||||
|
|
||||||
/** @var Listing\BulkActionController */
|
|
||||||
private $bulkAction;
|
|
||||||
|
|
||||||
/** @var Listing\Handler */
|
/** @var Listing\Handler */
|
||||||
private $listingHandler;
|
private $listingHandler;
|
||||||
|
|
||||||
@ -76,7 +74,6 @@ class Newsletters extends APIEndpoint {
|
|||||||
private $newsletterSaveController;
|
private $newsletterSaveController;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Listing\BulkActionController $bulkAction,
|
|
||||||
Listing\Handler $listingHandler,
|
Listing\Handler $listingHandler,
|
||||||
WPFunctions $wp,
|
WPFunctions $wp,
|
||||||
SettingsController $settings,
|
SettingsController $settings,
|
||||||
@ -90,7 +87,6 @@ class Newsletters extends APIEndpoint {
|
|||||||
SendPreviewController $sendPreviewController,
|
SendPreviewController $sendPreviewController,
|
||||||
NewsletterSaveController $newsletterSaveController
|
NewsletterSaveController $newsletterSaveController
|
||||||
) {
|
) {
|
||||||
$this->bulkAction = $bulkAction;
|
|
||||||
$this->listingHandler = $listingHandler;
|
$this->listingHandler = $listingHandler;
|
||||||
$this->wp = $wp;
|
$this->wp = $wp;
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
@ -356,14 +352,23 @@ class Newsletters extends APIEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function bulkAction($data = []) {
|
public function bulkAction($data = []) {
|
||||||
try {
|
if (isset($data['listing']['selection']) && is_array($data['listing']['selection'])) {
|
||||||
$meta = $this->bulkAction->apply('\MailPoet\Models\Newsletter', $data);
|
$ids = array_map('intval', $data['listing']['selection']);
|
||||||
return $this->successResponse(null, $meta);
|
} else {
|
||||||
} catch (\Exception $e) {
|
$definition = $this->listingHandler->getListingDefinition($data);
|
||||||
return $this->errorResponse([
|
$ids = $this->newsletterListingRepository->getIds($definition);
|
||||||
$e->getCode() => $e->getMessage(),
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
if ($data['action'] === 'trash') {
|
||||||
|
$this->newslettersRepository->bulkTrash($ids);
|
||||||
|
} elseif ($data['action'] === 'restore') {
|
||||||
|
$this->newslettersRepository->bulkRestore($ids);
|
||||||
|
} elseif ($data['action'] === 'delete') {
|
||||||
|
$this->newslettersRepository->bulkDelete($ids);
|
||||||
|
} else {
|
||||||
|
throw UnexpectedValueException::create()
|
||||||
|
->withErrors([APIError::BAD_REQUEST => "Invalid bulk action '{$data['action']}' provided."]);
|
||||||
|
}
|
||||||
|
return $this->successResponse(null, ['count' => count($ids)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function create($data = []) {
|
public function create($data = []) {
|
||||||
|
@ -6,6 +6,8 @@ use MailPoet\Util\Helpers;
|
|||||||
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||||
use MailPoetVendor\Doctrine\ORM\QueryBuilder;
|
use MailPoetVendor\Doctrine\ORM\QueryBuilder;
|
||||||
|
|
||||||
|
use function MailPoetVendor\array_column;
|
||||||
|
|
||||||
abstract class ListingRepository {
|
abstract class ListingRepository {
|
||||||
/** @var QueryBuilder */
|
/** @var QueryBuilder */
|
||||||
protected $queryBuilder;
|
protected $queryBuilder;
|
||||||
@ -34,6 +36,16 @@ abstract class ListingRepository {
|
|||||||
return (int)$queryBuilder->getQuery()->getSingleScalarResult();
|
return (int)$queryBuilder->getQuery()->getSingleScalarResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getIds(ListingDefinition $definition): array {
|
||||||
|
$queryBuilder = clone $this->queryBuilder;
|
||||||
|
$this->applyFromClause($queryBuilder);
|
||||||
|
$this->applyConstraints($queryBuilder, $definition);
|
||||||
|
$alias = $queryBuilder->getRootAliases()[0];
|
||||||
|
$queryBuilder->select("$alias.id");
|
||||||
|
$ids = $queryBuilder->getQuery()->getScalarResult();
|
||||||
|
return array_column($ids, 'id');
|
||||||
|
}
|
||||||
|
|
||||||
public function getGroups(ListingDefinition $definition): array {
|
public function getGroups(ListingDefinition $definition): array {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
@ -104,4 +104,31 @@ class NewslettersRepository extends Repository {
|
|||||||
'abandoned_cart_emails_count' => $analyticsMap[NewsletterEntity::TYPE_AUTOMATIC][AbandonedCart::SLUG] ?? 0,
|
'abandoned_cart_emails_count' => $analyticsMap[NewsletterEntity::TYPE_AUTOMATIC][AbandonedCart::SLUG] ?? 0,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function bulkTrash(array $ids) {
|
||||||
|
$queryBuilder = $this->entityManager->createQueryBuilder();
|
||||||
|
$queryBuilder->update(NewsletterEntity::class, 'n')
|
||||||
|
->set('n.deletedAt', 'CURRENT_TIMESTAMP()')
|
||||||
|
->where('n.id IN (:ids)')
|
||||||
|
->setParameter('ids', $ids)
|
||||||
|
->getQuery()->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function bulkRestore(array $ids) {
|
||||||
|
$queryBuilder = $this->entityManager->createQueryBuilder();
|
||||||
|
$queryBuilder->update(NewsletterEntity::class, 'n')
|
||||||
|
->set('n.deletedAt', ':deletedAt')
|
||||||
|
->where('n.id IN (:ids)')
|
||||||
|
->setParameter('deletedAt', null)
|
||||||
|
->setParameter('ids', $ids)
|
||||||
|
->getQuery()->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function bulkDelete(array $ids) {
|
||||||
|
$queryBuilder = $this->entityManager->createQueryBuilder();
|
||||||
|
$queryBuilder->delete(NewsletterEntity::class, 'n')
|
||||||
|
->where('n.id IN (:ids)')
|
||||||
|
->setParameter('ids', $ids)
|
||||||
|
->getQuery()->execute();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@ use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
|
|||||||
use MailPoet\API\JSON\v1\Newsletters;
|
use MailPoet\API\JSON\v1\Newsletters;
|
||||||
use MailPoet\Cron\CronHelper;
|
use MailPoet\Cron\CronHelper;
|
||||||
use MailPoet\DI\ContainerWrapper;
|
use MailPoet\DI\ContainerWrapper;
|
||||||
use MailPoet\Listing\BulkActionController;
|
|
||||||
use MailPoet\Listing\Handler;
|
use MailPoet\Listing\Handler;
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\NewsletterOption;
|
use MailPoet\Models\NewsletterOption;
|
||||||
@ -694,7 +693,6 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
|
|
||||||
private function createNewslettersEndpointWithMocks(array $mocks): Newsletters {
|
private function createNewslettersEndpointWithMocks(array $mocks): Newsletters {
|
||||||
return new Newsletters(
|
return new Newsletters(
|
||||||
$this->diContainer->get(BulkActionController::class),
|
|
||||||
$this->diContainer->get(Handler::class),
|
$this->diContainer->get(Handler::class),
|
||||||
$mocks['wp'] ?? $this->diContainer->get(WPFunctions::class),
|
$mocks['wp'] ?? $this->diContainer->get(WPFunctions::class),
|
||||||
$this->diContainer->get(SettingsController::class),
|
$this->diContainer->get(SettingsController::class),
|
||||||
|
Reference in New Issue
Block a user