Add check for orphaned subscriptions

[MAILPOET-1587]
This commit is contained in:
Rostislav Wolny
2024-08-01 13:45:33 +02:00
committed by Aschepikov
parent 0d7898b3a5
commit fe66e31b5f
4 changed files with 65 additions and 0 deletions

View File

@@ -6,7 +6,10 @@ use MailPoet\Cron\Workers\SendingQueue\SendingQueue;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\SubscriberSegmentEntity;
use MailPoetVendor\Doctrine\ORM\EntityManager;
use MailPoetVendor\Doctrine\ORM\Query;
use MailPoetVendor\Doctrine\ORM\QueryBuilder;
@@ -48,6 +51,19 @@ class DataInconsistencyRepository {
return intval($count);
}
public function getOrphanedSubscriptionsCount(): int {
$subscriberTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
$segmentTable = $this->entityManager->getClassMetadata(SegmentEntity::class)->getTableName();
$subscriberSegmentTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
$count = $this->entityManager->getConnection()->executeQuery("
SELECT count(distinct ss.`id`) FROM $subscriberSegmentTable ss
LEFT JOIN $segmentTable seg ON seg.`id` = ss.`segment_id`
LEFT JOIN $subscriberTable sub ON sub.`id` = ss.`subscriber_id`
WHERE seg.`id` IS NULL OR sub.`id` IS NULL
")->fetchOne();
return intval($count);
}
public function cleanupOrphanedSendingTasks(): int {
$ids = $this->buildOrphanedSendingTasksQuery(
$this->entityManager->createQueryBuilder()
@@ -100,6 +116,18 @@ class DataInconsistencyRepository {
return $deletedQueuesCount;
}
public function cleanupOrphanedSubscriptions(): int {
$subscriberTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
$segmentTable = $this->entityManager->getClassMetadata(SegmentEntity::class)->getTableName();
$subscriberSegmentTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
return (int)$this->entityManager->getConnection()->executeStatement("
DELETE ss FROM $subscriberSegmentTable ss
LEFT JOIN $segmentTable seg ON seg.`id` = ss.`segment_id`
LEFT JOIN $subscriberTable sub ON sub.`id` = ss.`subscriber_id`
WHERE seg.`id` IS NULL OR sub.`id` IS NULL
");
}
private function buildOrphanedSendingTasksQuery(QueryBuilder $queryBuilder): Query {
return $queryBuilder
->from(ScheduledTaskEntity::class, 'st')