Refactor newsletter bulkDelete transaction
[MAILPOET-2898]
This commit is contained in:
committed by
Veljko V
parent
ccf5210dbd
commit
2db677f9de
@ -24,6 +24,7 @@ use MailPoet\Entities\StatisticsWooCommercePurchaseEntity;
|
|||||||
use MailPoet\Entities\StatsNotificationEntity;
|
use MailPoet\Entities\StatsNotificationEntity;
|
||||||
use MailPoetVendor\Carbon\Carbon;
|
use MailPoetVendor\Carbon\Carbon;
|
||||||
use MailPoetVendor\Doctrine\DBAL\Connection;
|
use MailPoetVendor\Doctrine\DBAL\Connection;
|
||||||
|
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||||
use MailPoetVendor\Doctrine\ORM\Query\Expr\Join;
|
use MailPoetVendor\Doctrine\ORM\Query\Expr\Join;
|
||||||
|
|
||||||
use function MailPoetVendor\array_column;
|
use function MailPoetVendor\array_column;
|
||||||
@ -210,107 +211,103 @@ class NewslettersRepository extends Repository {
|
|||||||
if (empty($ids)) {
|
if (empty($ids)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
$this->entityManager->getConnection()->beginTransaction();
|
// Fetch children ids for deleting
|
||||||
try {
|
$childrenIds = $this->fetchChildrenIds($ids);
|
||||||
// Fetch children ids for deleting
|
$ids = array_merge($ids, $childrenIds);
|
||||||
$childrenIds = $this->fetchChildrenIds($ids);
|
|
||||||
$ids = array_merge($ids, $childrenIds);
|
$this->entityManager->transactional(function (EntityManager $entityManager) use ($ids) {
|
||||||
// Delete statistics data
|
// Delete statistics data
|
||||||
$newsletterStatisticsTable = $this->entityManager->getClassMetadata(StatisticsNewsletterEntity::class)->getTableName();
|
$newsletterStatisticsTable = $entityManager->getClassMetadata(StatisticsNewsletterEntity::class)->getTableName();
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE s FROM $newsletterStatisticsTable s
|
DELETE s FROM $newsletterStatisticsTable s
|
||||||
WHERE s.`newsletter_id` IN (:ids)
|
WHERE s.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
$statisticsOpensTable = $this->entityManager->getClassMetadata(StatisticsOpenEntity::class)->getTableName();
|
$statisticsOpensTable = $entityManager->getClassMetadata(StatisticsOpenEntity::class)->getTableName();
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE s FROM $statisticsOpensTable s
|
DELETE s FROM $statisticsOpensTable s
|
||||||
WHERE s.`newsletter_id` IN (:ids)
|
WHERE s.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
$statisticsClicksTable = $this->entityManager->getClassMetadata(StatisticsClickEntity::class)->getTableName();
|
$statisticsClicksTable = $entityManager->getClassMetadata(StatisticsClickEntity::class)->getTableName();
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE s FROM $statisticsClicksTable s
|
DELETE s FROM $statisticsClicksTable s
|
||||||
WHERE s.`newsletter_id` IN (:ids)
|
WHERE s.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
$statisticsPurchasesTable = $this->entityManager->getClassMetadata(StatisticsWooCommercePurchaseEntity::class)->getTableName();
|
$statisticsPurchasesTable = $entityManager->getClassMetadata(StatisticsWooCommercePurchaseEntity::class)->getTableName();
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE s FROM $statisticsPurchasesTable s
|
DELETE s FROM $statisticsPurchasesTable s
|
||||||
WHERE s.`newsletter_id` IN (:ids)
|
WHERE s.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
// Delete newsletter posts
|
// Delete newsletter posts
|
||||||
$postsTable = $this->entityManager->getClassMetadata(NewsletterPostEntity::class)->getTableName();
|
$postsTable = $entityManager->getClassMetadata(NewsletterPostEntity::class)->getTableName();
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE np FROM $postsTable np
|
DELETE np FROM $postsTable np
|
||||||
WHERE np.`newsletter_id` IN (:ids)
|
WHERE np.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
// Delete newsletter options
|
// Delete newsletter options
|
||||||
$optionsTable = $this->entityManager->getClassMetadata(NewsletterOptionEntity::class)->getTableName();
|
$optionsTable = $entityManager->getClassMetadata(NewsletterOptionEntity::class)->getTableName();
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE no FROM $optionsTable no
|
DELETE no FROM $optionsTable no
|
||||||
WHERE no.`newsletter_id` IN (:ids)
|
WHERE no.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
// Delete newsletter links
|
// Delete newsletter links
|
||||||
$linksTable = $this->entityManager->getClassMetadata(NewsletterLinkEntity::class)->getTableName();
|
$linksTable = $entityManager->getClassMetadata(NewsletterLinkEntity::class)->getTableName();
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE nl FROM $linksTable nl
|
DELETE nl FROM $linksTable nl
|
||||||
WHERE nl.`newsletter_id` IN (:ids)
|
WHERE nl.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
// Delete stats notifications
|
// Delete stats notifications
|
||||||
$statsNotificationsTable = $this->entityManager->getClassMetadata(StatsNotificationEntity::class)->getTableName();
|
$statsNotificationsTable = $entityManager->getClassMetadata(StatsNotificationEntity::class)->getTableName();
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE sn FROM $statsNotificationsTable sn
|
DELETE sn FROM $statsNotificationsTable sn
|
||||||
WHERE sn.`newsletter_id` IN (:ids)
|
WHERE sn.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
// Delete scheduled tasks and scheduled task subscribers
|
// Delete scheduled tasks and scheduled task subscribers
|
||||||
$scheduledTasksTable = $this->entityManager->getClassMetadata(ScheduledTaskEntity::class)->getTableName();
|
$scheduledTasksTable = $entityManager->getClassMetadata(ScheduledTaskEntity::class)->getTableName();
|
||||||
$sendingQueueTable = $this->entityManager->getClassMetadata(SendingQueueEntity::class)->getTableName();
|
$sendingQueueTable = $entityManager->getClassMetadata(SendingQueueEntity::class)->getTableName();
|
||||||
$scheduledTaskSubscribersTable = $this->entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName();
|
$scheduledTaskSubscribersTable = $entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName();
|
||||||
|
|
||||||
// Delete scheduled tasks subscribers
|
// Delete scheduled tasks subscribers
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE ts FROM $scheduledTaskSubscribersTable ts
|
DELETE ts FROM $scheduledTaskSubscribersTable ts
|
||||||
JOIN $scheduledTasksTable t ON t.`id` = ts.`task_id`
|
JOIN $scheduledTasksTable t ON t.`id` = ts.`task_id`
|
||||||
JOIN $sendingQueueTable q ON q.`task_id` = t.`id`
|
JOIN $sendingQueueTable q ON q.`task_id` = t.`id`
|
||||||
WHERE q.`newsletter_id` IN (:ids)
|
WHERE q.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE t FROM $scheduledTasksTable t
|
DELETE t FROM $scheduledTasksTable t
|
||||||
JOIN $sendingQueueTable q ON t.`id` = q.`task_id`
|
JOIN $sendingQueueTable q ON t.`id` = q.`task_id`
|
||||||
WHERE q.`newsletter_id` IN (:ids)
|
WHERE q.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
// Delete sending queues
|
// Delete sending queues
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE q FROM $sendingQueueTable q
|
DELETE q FROM $sendingQueueTable q
|
||||||
WHERE q.`newsletter_id` IN (:ids)
|
WHERE q.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
// Delete newsletter segments
|
// Delete newsletter segments
|
||||||
$newsletterSegmentsTable = $this->entityManager->getClassMetadata(NewsletterSegmentEntity::class)->getTableName();
|
$newsletterSegmentsTable = $entityManager->getClassMetadata(NewsletterSegmentEntity::class)->getTableName();
|
||||||
$this->entityManager->getConnection()->executeUpdate("
|
$entityManager->getConnection()->executeUpdate("
|
||||||
DELETE ns FROM $newsletterSegmentsTable ns
|
DELETE ns FROM $newsletterSegmentsTable ns
|
||||||
WHERE ns.`newsletter_id` IN (:ids)
|
WHERE ns.`newsletter_id` IN (:ids)
|
||||||
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]);
|
||||||
|
|
||||||
$queryBuilder = $this->entityManager->createQueryBuilder();
|
$queryBuilder = $entityManager->createQueryBuilder();
|
||||||
$queryBuilder->delete(NewsletterEntity::class, 'n')
|
$queryBuilder->delete(NewsletterEntity::class, 'n')
|
||||||
->where('n.id IN (:ids)')
|
->where('n.id IN (:ids)')
|
||||||
->setParameter('ids', $ids)
|
->setParameter('ids', $ids)
|
||||||
->getQuery()->execute();
|
->getQuery()->execute();
|
||||||
$this->entityManager->getConnection()->commit();
|
});
|
||||||
return count($ids);
|
return count($ids);
|
||||||
} catch (\Exception $e) {
|
|
||||||
$this->entityManager->getConnection()->rollBack();
|
|
||||||
throw $e;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function fetchChildrenIds(array $parentIds) {
|
private function fetchChildrenIds(array $parentIds) {
|
||||||
|
Reference in New Issue
Block a user