diff --git a/Config/config.php b/Config/config.php index 72e62cb..3dadf1a 100644 --- a/Config/config.php +++ b/Config/config.php @@ -3,7 +3,7 @@ return [ 'name' => 'Housekeeping by Leuchtfeuer', 'description' => 'Database Cleanup Command to delete lead_event_log table entries, campaign_lead_event_log table entries, email_stats table entries where the referenced email entry is currently not published and email_stats_devices table entries.', - 'version' => '3.0.0', + 'version' => '3.1.0', 'author' => 'Leuchtfeuer Digital Marketing GmbH', 'services' => [ 'integrations' => [ @@ -16,7 +16,7 @@ ], 'housekeepingleuchtfeuer.integration.configuration' => [ 'class' => \MauticPlugin\LeuchtfeuerHousekeepingBundle\Integration\Support\ConfigSupport::class, - 'tags' => [ + 'tags' => [ 'mautic.config_integration', ], ], @@ -30,15 +30,17 @@ ], ], ], - 'models' => [], - 'forms' => [], - 'helpers' => [], - 'other' => [ + 'models' => [], + 'forms' => [], + 'helpers' => [], + 'other' => [ 'mautic.leuchtfeuer.service.event_log_cleanup' => [ 'class' => \MauticPlugin\LeuchtfeuerHousekeepingBundle\Service\EventLogCleanup::class, - 'arguments' => ['database_connection', - '%mautic.db_table_prefix%', - 'mautic.housekeepingleuchtfeuer.config'], + 'arguments' => [ + 'database_connection', + '%mautic.db_table_prefix%', + 'mautic.housekeepingleuchtfeuer.config', + ], ], 'mautic.housekeepingleuchtfeuer.config' => [ 'class' => \MauticPlugin\LeuchtfeuerHousekeepingBundle\Integration\Config::class, diff --git a/Service/EventLogCleanup.php b/Service/EventLogCleanup.php index daea9b8..ff781ba 100644 --- a/Service/EventLogCleanup.php +++ b/Service/EventLogCleanup.php @@ -5,13 +5,18 @@ namespace MauticPlugin\LeuchtfeuerHousekeepingBundle\Service; use Doctrine\DBAL\Connection; -use Symfony\Component\Console\Output\OutputInterface; use MauticPlugin\LeuchtfeuerHousekeepingBundle\Integration\Config; +use Symfony\Component\Console\Output\OutputInterface; class EventLogCleanup { private const PREFIX = '%PREFIX%'; + /** + * Constant used to indicate where the query can place "SET a = :a" when query is an update. + */ + private const SET = '%SET%'; + private Config $config; private Connection $connection; private string $dbPrefix; @@ -26,15 +31,17 @@ class EventLogCleanup /** * @var array */ - private array $queries = [ + private array $queriesTemplate = [ self::CAMPAIGN_LEAD_EVENTS => self::PREFIX.'campaign_lead_event_log WHERE ('.self::PREFIX.'campaign_lead_event_log.id NOT IN (SELECT maxId FROM (SELECT MAX(clel2.id) as maxId FROM '.self::PREFIX.'campaign_lead_event_log clel2 GROUP BY lead_id, campaign_id) as maxIds) AND '.self::PREFIX.'campaign_lead_event_log.date_triggered < DATE_SUB(NOW(),INTERVAL :daysOld DAY))', self::LEAD_EVENTS => self::PREFIX.'lead_event_log WHERE date_added < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - self::EMAIL_STATS => self::PREFIX.'email_stats LEFT JOIN '.self::PREFIX.'emails ON '.self::PREFIX.'email_stats.email_id = '.self::PREFIX.'emails.id WHERE is_published = 0 OR '.self::PREFIX.'email_stats.email_id IS NULL AND date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - self::EMAIL_STATS_TOKENS => self::PREFIX.'email_stats SET tokens = NULL WHERE date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY) AND tokens IS NOT NULL', + self::EMAIL_STATS => self::PREFIX.'email_stats LEFT JOIN '.self::PREFIX.'emails ON '.self::PREFIX.'email_stats.email_id = '.self::PREFIX.'emails.id WHERE ('.self::PREFIX.'emails.is_published = 0 OR '.self::PREFIX.'emails.publish_down < DATE_SUB(NOW(),INTERVAL :daysOld DAY) OR '.self::PREFIX.'email_stats.email_id IS NULL) AND '.self::PREFIX.'email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', + self::EMAIL_STATS_TOKENS => self::PREFIX.'email_stats '.self::SET.' WHERE date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY) AND tokens IS NOT NULL', self::EMAIL_STATS_DEVICES => self::PREFIX.'email_stats_devices LEFT JOIN '.self::PREFIX.'email_stats ON '.self::PREFIX.'email_stats.id = '.self::PREFIX.'email_stats_devices.stat_id WHERE '.self::PREFIX.'email_stats.id IS NULL OR '.self::PREFIX.'email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', ]; - private string $queriesTokensDryRun = self::PREFIX.'email_stats WHERE date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY) AND tokens IS NOT NULL'; + private array $update = [ + self::EMAIL_STATS_TOKENS => 'SET tokens = NULL', + ]; private array $params = [ self::CAMPAIGN_LEAD_EVENTS => [ @@ -72,11 +79,11 @@ class EventLogCleanup ], ]; - private string $dryRunMessage = ' rows would have been deleted. This is a dry run.'; - private string $runMessage = ' rows have been deleted.'; - - private string $dryRunMessageTokens = ' will be set to NULL. This is a dry run.'; - private string $runMessageTokens = ' have been set to NULL.'; + private string $dryRunMessage = ' This is a dry run.'; + private string $dryRunDeleteMessage = ' rows would have been deleted.'; + private string $runDeleteMessage = ' rows have been deleted.'; + private string $dryRunUpdateMessage = ' will be set to NULL.'; + private string $runUpdateMessage = ' have been set to NULL.'; public function __construct(Connection $connection, ?string $dbPrefix, Config $config) { @@ -103,7 +110,7 @@ public function deleteEventLogEntries(int $daysOld, ?int $campaignId, bool $dryR if (null !== $campaignId && $operations[self::CAMPAIGN_LEAD_EVENTS]) { $this->params[self::CAMPAIGN_LEAD_EVENTS][':cmpId'] = $campaignId; $this->types[self::CAMPAIGN_LEAD_EVENTS][':cmpId'] = \PDO::PARAM_INT; - $this->queries[self::CAMPAIGN_LEAD_EVENTS] .= ' AND campaign_id = :cmpId'; + $this->queriesTemplate[self::CAMPAIGN_LEAD_EVENTS] .= ' AND campaign_id = :cmpId'; } if (array_key_exists(self::EMAIL_STATS, $operations) && true === $operations[self::EMAIL_STATS]) { @@ -128,15 +135,12 @@ public function deleteEventLogEntries(int $daysOld, ?int $campaignId, bool $dryR continue; } - if (true === $operations[self::EMAIL_STATS_TOKENS]) { - $sql = 'SELECT * FROM '.str_replace(self::PREFIX, $this->dbPrefix, $this->queriesTokensDryRun); - $statement = $this->connection->executeQuery($sql, $this->params[$operation], $this->types[$operation]); - $result[$operation] = $statement->rowCount(); - } else { - $sql = 'SELECT * FROM '.str_replace(self::PREFIX, $this->dbPrefix, $this->queries[$operation]); - $statement = $this->connection->executeQuery($sql, $this->params[$operation], $this->types[$operation]); - $result[$operation] = $statement->rowCount(); - } + $queryTemplate = $this->queriesTemplate[$operation]; + $queryTemplate = str_replace(self::SET, '', $queryTemplate); + + $sql = 'SELECT * FROM '.str_replace(self::PREFIX, $this->dbPrefix, $queryTemplate); + $statement = $this->connection->executeQuery($sql, $this->params[$operation], $this->types[$operation]); + $result[$operation] = $statement->rowCount(); if ($output->isVerbose()) { $output->writeln($sql); @@ -148,14 +152,16 @@ public function deleteEventLogEntries(int $daysOld, ?int $campaignId, bool $dryR continue; } - if (true === $operations[self::EMAIL_STATS_TOKENS]) { - $sql = 'UPDATE '.str_replace(self::PREFIX, $this->dbPrefix, $this->queries[$operation]); + $queryTemplate = $this->queriesTemplate[$operation]; + if (array_key_exists($operation, $this->update)) { + $queryTemplate = str_replace(self::SET, $this->update[$operation], $queryTemplate); + $sql = 'UPDATE '.str_replace(self::PREFIX, $this->dbPrefix, $queryTemplate); } else { - $sql = 'DELETE '.$this->dbPrefix.$operation.' FROM '.str_replace(self::PREFIX, $this->dbPrefix, $this->queries[$operation]); + $sql = 'DELETE '.$this->dbPrefix.$operation.' FROM '.str_replace(self::PREFIX, $this->dbPrefix, $queryTemplate); } - $statement = $this->connection->executeQuery($sql, $this->params[$operation], $this->types[$operation]); - $result[$operation] = $statement->rowCount(); + $statement = $this->connection->executeQuery($sql, $this->params[$operation], $this->types[$operation]); + $result[$operation] = $statement->rowCount(); if ($output->isVerbose()) { $output->writeln($sql); @@ -170,13 +176,42 @@ public function deleteEventLogEntries(int $daysOld, ?int $campaignId, bool $dryR throw $throwable; } - $message = ''; - $lastOperation = array_key_last($operations); + $operationsResult = [ + 'delete' => [], + 'update' => [], + ]; foreach ($operations as $operation => $enabled) { if (false === $enabled) { continue; } + if (array_key_exists($operation, $this->update)) { + $operationsResult['update'][$operation] = $result[$operation]; + } else { + $operationsResult['delete'][$operation] = $result[$operation]; + } + } + + $message = $this->generateMessage($operationsResult['delete'], $dryRun ? $this->dryRunDeleteMessage : $this->runDeleteMessage); + if ('' !== $updateMessage = $this->generateMessage($operationsResult['update'], $dryRun ? $this->dryRunUpdateMessage : $this->runUpdateMessage)) { + $message .= ' '.$updateMessage; + } + + if ($dryRun) { + $message .= $this->dryRunMessage; + } + + return $message; + } + + /** + * @param non-empty-array $result + */ + private function generateMessage(array $result, string $postfix): string + { + $message = ''; + $lastOperation = array_key_last($result); + foreach ($result as $operation => $resultCount) { if ('' !== $message) { if ($lastOperation === $operation) { $message .= ' and '; @@ -185,14 +220,13 @@ public function deleteEventLogEntries(int $daysOld, ?int $campaignId, bool $dryR } } - $message .= $result[$operation].' '.$operation; + $message .= $resultCount.' '.$operation; } - if (true === $operations[self::EMAIL_STATS_TOKENS]) { - $message .= $dryRun ? $this->dryRunMessageTokens : $this->runMessageTokens; - } else { - $message .= $dryRun ? $this->dryRunMessage : $this->runMessage; + + if ('' === $message) { + return ''; } - return $message; + return $message.$postfix; } } diff --git a/Tests/Service/EventLogCleanupTest.php b/Tests/Service/EventLogCleanupTest.php index d8af7f1..6f2186d 100644 --- a/Tests/Service/EventLogCleanupTest.php +++ b/Tests/Service/EventLogCleanupTest.php @@ -7,6 +7,7 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Driver\Result; use Generator; +use MauticPlugin\LeuchtfeuerHousekeepingBundle\Integration\Config; use MauticPlugin\LeuchtfeuerHousekeepingBundle\Service\EventLogCleanup; use PHPUnit\Framework\TestCase; use Symfony\Component\Console\Output\OutputInterface; @@ -47,7 +48,11 @@ public function testDeleteEventLogEntries(array $operations, array $queries, arr ->method('writeln') ->withConsecutive(...$loggedQueries); - $eventLogCleanup = new EventLogCleanup($connection, 'prefix_table_'); + $config = $this->createMock(Config::class); + $config->method('isPublished') + ->willReturn(true); + + $eventLogCleanup = new EventLogCleanup($connection, 'prefix_table_', $config); self::assertSame($message, $eventLogCleanup->deleteEventLogEntries(4, $campaignId, $dryRun, $operations, $output)); } @@ -55,44 +60,47 @@ public function runProvider(): Generator { $daysOld = 4; - // dry run all tables - yield 0 => [ + yield 'dry run all tables' => [ [ EventLogCleanup::LEAD_EVENTS => true, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => true, EventLogCleanup::EMAIL_STATS => true, - EventLogCleanup::EMAIL_STATS_TOKENS => false, + EventLogCleanup::EMAIL_STATS_TOKENS => true, ], [ [ 'SELECT * FROM prefix_table_lead_event_log WHERE date_added < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ 'SELECT * FROM prefix_table_campaign_lead_event_log WHERE (prefix_table_campaign_lead_event_log.id NOT IN (SELECT maxId FROM (SELECT MAX(clel2.id) as maxId FROM prefix_table_campaign_lead_event_log clel2 GROUP BY lead_id, campaign_id) as maxIds) AND prefix_table_campaign_lead_event_log.date_triggered < DATE_SUB(NOW(),INTERVAL :daysOld DAY))', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], + ], + [ + 'SELECT * FROM prefix_table_email_stats WHERE date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY) AND tokens IS NOT NULL', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ 'SELECT * FROM prefix_table_email_stats_devices LEFT JOIN prefix_table_email_stats ON prefix_table_email_stats.id = prefix_table_email_stats_devices.stat_id WHERE prefix_table_email_stats.id IS NULL OR prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ - 'SELECT * FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE is_published = 0 OR prefix_table_email_stats.email_id IS NULL AND date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + 'SELECT * FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE (prefix_table_emails.is_published = 0 OR prefix_table_emails.publish_down < DATE_SUB(NOW(),INTERVAL :daysOld DAY) OR prefix_table_email_stats.email_id IS NULL) AND prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], - [3, 14, 55, 57], - '3 lead_event_log, 14 campaign_lead_event_log, 55 email_stats_devices and 57 email_stats rows would have been deleted. This is a dry run.', + [3, 14, 23, 55, 57], + '3 lead_event_log, 14 campaign_lead_event_log, 55 email_stats_devices and 57 email_stats rows would have been deleted. 23 email_stats_tokens will be set to NULL. This is a dry run.', true, null, ]; - // dry run email_stats and see email_stats_devices is also cleared - yield 1 => [ + yield 'dry run email_stats and see email_stats_devices is also cleared' => [ [ EventLogCleanup::LEAD_EVENTS => true, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => false, @@ -102,8 +110,8 @@ public function runProvider(): Generator [ [ 'SELECT * FROM prefix_table_lead_event_log WHERE date_added < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], [31], @@ -112,8 +120,7 @@ public function runProvider(): Generator null, ]; - // dry run single table - yield 2 => [ + yield 'dry run single table' => [ [ EventLogCleanup::LEAD_EVENTS => false, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => false, @@ -123,13 +130,13 @@ public function runProvider(): Generator [ [ 'SELECT * FROM prefix_table_email_stats_devices LEFT JOIN prefix_table_email_stats ON prefix_table_email_stats.id = prefix_table_email_stats_devices.stat_id WHERE prefix_table_email_stats.id IS NULL OR prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ - 'SELECT * FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE is_published = 0 OR prefix_table_email_stats.email_id IS NULL AND date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + 'SELECT * FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE (prefix_table_emails.is_published = 0 OR prefix_table_emails.publish_down < DATE_SUB(NOW(),INTERVAL :daysOld DAY) OR prefix_table_email_stats.email_id IS NULL) AND prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], [42, 67], @@ -138,44 +145,47 @@ public function runProvider(): Generator null, ]; - // dry run all tables with campaignId - yield 3 => [ + yield 'dry run all tables with campaignId' => [ [ EventLogCleanup::EMAIL_STATS => true, EventLogCleanup::LEAD_EVENTS => true, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => true, - EventLogCleanup::EMAIL_STATS_TOKENS => false, + EventLogCleanup::EMAIL_STATS_TOKENS => true, ], [ [ 'SELECT * FROM prefix_table_lead_event_log WHERE date_added < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ 'SELECT * FROM prefix_table_campaign_lead_event_log WHERE (prefix_table_campaign_lead_event_log.id NOT IN (SELECT maxId FROM (SELECT MAX(clel2.id) as maxId FROM prefix_table_campaign_lead_event_log clel2 GROUP BY lead_id, campaign_id) as maxIds) AND prefix_table_campaign_lead_event_log.date_triggered < DATE_SUB(NOW(),INTERVAL :daysOld DAY)) AND campaign_id = :cmpId', - [':daysOld' => $daysOld, ':cmpId' => 12235], - [':daysOld' => \PDO::PARAM_INT, ':cmpId' => \PDO::PARAM_INT], + ['daysOld' => $daysOld, ':cmpId' => 12235], + ['daysOld' => \PDO::PARAM_INT, ':cmpId' => \PDO::PARAM_INT], + ], + [ + 'SELECT * FROM prefix_table_email_stats WHERE date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY) AND tokens IS NOT NULL', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ 'SELECT * FROM prefix_table_email_stats_devices LEFT JOIN prefix_table_email_stats ON prefix_table_email_stats.id = prefix_table_email_stats_devices.stat_id WHERE prefix_table_email_stats.id IS NULL OR prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ - 'SELECT * FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE is_published = 0 OR prefix_table_email_stats.email_id IS NULL AND date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + 'SELECT * FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE (prefix_table_emails.is_published = 0 OR prefix_table_emails.publish_down < DATE_SUB(NOW(),INTERVAL :daysOld DAY) OR prefix_table_email_stats.email_id IS NULL) AND prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], - [34, 41, 3, 87], - '34 lead_event_log, 41 campaign_lead_event_log, 3 email_stats_devices and 87 email_stats rows would have been deleted. This is a dry run.', + [34, 41, 11, 3, 87], + '34 lead_event_log, 41 campaign_lead_event_log, 3 email_stats_devices and 87 email_stats rows would have been deleted. 11 email_stats_tokens will be set to NULL. This is a dry run.', true, 12235, ]; - // dry run two tables with campaignId - yield 4 => [ + yield 'dry run two tables with campaignId' => [ [ EventLogCleanup::EMAIL_STATS => false, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => true, @@ -185,59 +195,62 @@ public function runProvider(): Generator [ [ 'SELECT * FROM prefix_table_campaign_lead_event_log WHERE (prefix_table_campaign_lead_event_log.id NOT IN (SELECT maxId FROM (SELECT MAX(clel2.id) as maxId FROM prefix_table_campaign_lead_event_log clel2 GROUP BY lead_id, campaign_id) as maxIds) AND prefix_table_campaign_lead_event_log.date_triggered < DATE_SUB(NOW(),INTERVAL :daysOld DAY)) AND campaign_id = :cmpId', - [':daysOld' => $daysOld, ':cmpId' => 65487], - [':daysOld' => \PDO::PARAM_INT, ':cmpId' => \PDO::PARAM_INT], + ['daysOld' => $daysOld, ':cmpId' => 65487], + ['daysOld' => \PDO::PARAM_INT, ':cmpId' => \PDO::PARAM_INT], ], [ 'SELECT * FROM prefix_table_lead_event_log WHERE date_added < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], [61, 22], - '61 campaign_lead_event_log, 22 lead_event_log rows would have been deleted. This is a dry run.', + '61 campaign_lead_event_log and 22 lead_event_log rows would have been deleted. This is a dry run.', true, 65487, ]; - // real run all tables - yield 5 => [ + yield 'real run all tables' => [ [ EventLogCleanup::LEAD_EVENTS => true, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => true, EventLogCleanup::EMAIL_STATS => true, - EventLogCleanup::EMAIL_STATS_TOKENS => false, + EventLogCleanup::EMAIL_STATS_TOKENS => true, ], [ [ 'DELETE prefix_table_lead_event_log FROM prefix_table_lead_event_log WHERE date_added < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ 'DELETE prefix_table_campaign_lead_event_log FROM prefix_table_campaign_lead_event_log WHERE (prefix_table_campaign_lead_event_log.id NOT IN (SELECT maxId FROM (SELECT MAX(clel2.id) as maxId FROM prefix_table_campaign_lead_event_log clel2 GROUP BY lead_id, campaign_id) as maxIds) AND prefix_table_campaign_lead_event_log.date_triggered < DATE_SUB(NOW(),INTERVAL :daysOld DAY))', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], + ], + [ + 'UPDATE prefix_table_email_stats SET tokens = NULL WHERE date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY) AND tokens IS NOT NULL', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ 'DELETE prefix_table_email_stats_devices FROM prefix_table_email_stats_devices LEFT JOIN prefix_table_email_stats ON prefix_table_email_stats.id = prefix_table_email_stats_devices.stat_id WHERE prefix_table_email_stats.id IS NULL OR prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ - 'DELETE prefix_table_email_stats FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE is_published = 0 OR prefix_table_email_stats.email_id IS NULL AND date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + 'DELETE prefix_table_email_stats FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE (prefix_table_emails.is_published = 0 OR prefix_table_emails.publish_down < DATE_SUB(NOW(),INTERVAL :daysOld DAY) OR prefix_table_email_stats.email_id IS NULL) AND prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], - [3, 14, 55, 41], - '3 lead_event_log, 14 campaign_lead_event_log, 55 email_stats_devices and 41 email_stats rows have been deleted.', + [3, 14, 32, 55, 41], + '3 lead_event_log, 14 campaign_lead_event_log, 55 email_stats_devices and 41 email_stats rows have been deleted. 32 email_stats_tokens have been set to NULL.', false, null, ]; - // real run single table - yield 6 => [ + yield 'real run single table' => [ [ EventLogCleanup::LEAD_EVENTS => true, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => false, @@ -247,8 +260,8 @@ public function runProvider(): Generator [ [ 'DELETE prefix_table_lead_event_log FROM prefix_table_lead_event_log WHERE date_added < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], [42], @@ -257,8 +270,7 @@ public function runProvider(): Generator null, ]; - // real run email_stats table to see if email_stats_devices is also cleared - yield 7 => [ + yield 'real run email_stats table to see if email_stats_devices is also cleared' => [ [ EventLogCleanup::LEAD_EVENTS => false, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => false, @@ -268,13 +280,13 @@ public function runProvider(): Generator [ [ 'DELETE prefix_table_email_stats_devices FROM prefix_table_email_stats_devices LEFT JOIN prefix_table_email_stats ON prefix_table_email_stats.id = prefix_table_email_stats_devices.stat_id WHERE prefix_table_email_stats.id IS NULL OR prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ - 'DELETE prefix_table_email_stats FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE is_published = 0 OR prefix_table_email_stats.email_id IS NULL AND date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + 'DELETE prefix_table_email_stats FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE (prefix_table_emails.is_published = 0 OR prefix_table_emails.publish_down < DATE_SUB(NOW(),INTERVAL :daysOld DAY) OR prefix_table_email_stats.email_id IS NULL) AND prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], [42, 12], @@ -283,44 +295,47 @@ public function runProvider(): Generator null, ]; - // real run all tables with campaignId - yield 8 => [ + yield 'real run all tables with campaignId' => [ [ EventLogCleanup::EMAIL_STATS => true, EventLogCleanup::LEAD_EVENTS => true, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => true, - EventLogCleanup::EMAIL_STATS_TOKENS => false, + EventLogCleanup::EMAIL_STATS_TOKENS => true, ], [ [ 'DELETE prefix_table_lead_event_log FROM prefix_table_lead_event_log WHERE date_added < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ 'DELETE prefix_table_campaign_lead_event_log FROM prefix_table_campaign_lead_event_log WHERE (prefix_table_campaign_lead_event_log.id NOT IN (SELECT maxId FROM (SELECT MAX(clel2.id) as maxId FROM prefix_table_campaign_lead_event_log clel2 GROUP BY lead_id, campaign_id) as maxIds) AND prefix_table_campaign_lead_event_log.date_triggered < DATE_SUB(NOW(),INTERVAL :daysOld DAY)) AND campaign_id = :cmpId', - [':daysOld' => $daysOld, ':cmpId' => 12235], - [':daysOld' => \PDO::PARAM_INT, ':cmpId' => \PDO::PARAM_INT], + ['daysOld' => $daysOld, ':cmpId' => 12235], + ['daysOld' => \PDO::PARAM_INT, ':cmpId' => \PDO::PARAM_INT], + ], + [ + 'UPDATE prefix_table_email_stats SET tokens = NULL WHERE date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY) AND tokens IS NOT NULL', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ 'DELETE prefix_table_email_stats_devices FROM prefix_table_email_stats_devices LEFT JOIN prefix_table_email_stats ON prefix_table_email_stats.id = prefix_table_email_stats_devices.stat_id WHERE prefix_table_email_stats.id IS NULL OR prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], [ - 'DELETE prefix_table_email_stats FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE is_published = 0 OR prefix_table_email_stats.email_id IS NULL AND date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + 'DELETE prefix_table_email_stats FROM prefix_table_email_stats LEFT JOIN prefix_table_emails ON prefix_table_email_stats.email_id = prefix_table_emails.id WHERE (prefix_table_emails.is_published = 0 OR prefix_table_emails.publish_down < DATE_SUB(NOW(),INTERVAL :daysOld DAY) OR prefix_table_email_stats.email_id IS NULL) AND prefix_table_email_stats.date_sent < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], - [34, 41, 3, 6], - '34 lead_event_log, 41 campaign_lead_event_log, 3 email_stats_devices and 6 email_stats rows have been deleted.', + [34, 41, 19, 3, 6], + '34 lead_event_log, 41 campaign_lead_event_log, 3 email_stats_devices and 6 email_stats rows have been deleted. 19 email_stats_tokens have been set to NULL.', false, 12235, ]; - // real run two tables with campaignId - yield 9 => [ + yield 'real run two tables with campaignId' => [ [ EventLogCleanup::EMAIL_STATS => false, EventLogCleanup::CAMPAIGN_LEAD_EVENTS => true, @@ -330,17 +345,17 @@ public function runProvider(): Generator [ [ 'DELETE prefix_table_campaign_lead_event_log FROM prefix_table_campaign_lead_event_log WHERE (prefix_table_campaign_lead_event_log.id NOT IN (SELECT maxId FROM (SELECT MAX(clel2.id) as maxId FROM prefix_table_campaign_lead_event_log clel2 GROUP BY lead_id, campaign_id) as maxIds) AND prefix_table_campaign_lead_event_log.date_triggered < DATE_SUB(NOW(),INTERVAL :daysOld DAY)) AND campaign_id = :cmpId', - [':daysOld' => $daysOld, ':cmpId' => 65487], - [':daysOld' => \PDO::PARAM_INT, ':cmpId' => \PDO::PARAM_INT], + ['daysOld' => $daysOld, ':cmpId' => 65487], + ['daysOld' => \PDO::PARAM_INT, ':cmpId' => \PDO::PARAM_INT], ], [ 'DELETE prefix_table_lead_event_log FROM prefix_table_lead_event_log WHERE date_added < DATE_SUB(NOW(),INTERVAL :daysOld DAY)', - [':daysOld' => $daysOld], - [':daysOld' => \PDO::PARAM_INT], + ['daysOld' => $daysOld], + ['daysOld' => \PDO::PARAM_INT], ], ], [61, 22], - '61 campaign_lead_event_log, 22 lead_event_log rows have been deleted.', + '61 campaign_lead_event_log and 22 lead_event_log rows have been deleted.', false, 65487, ]; diff --git a/composer.json b/composer.json index a8b4220..ea76c4c 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "php": "^8.0.2", + "php": "^7.4|^8.0.2", "ext-pdo": "*", "mautic/core-lib": "^4.0|^5.0" }, @@ -24,12 +24,12 @@ }, "autoload": { "psr-4": { - "MauticPlugin\\MauticHousekeepingBundle\\": "" + "MauticPlugin\\LeuchtfeuerHousekeepingBundle\\": "" } }, "autoload-dev": { "psr-4": { - "MauticPlugin\\MauticHousekeepingBundle\\Tests\\": "Tests" + "MauticPlugin\\LeuchtfeuerHousekeepingBundle\\Tests\\": "Tests" } }, "repositories": [ @@ -47,7 +47,8 @@ }, "config": { "allow-plugins": { - "symfony/flex": true + "symfony/flex": true, + "php-http/discovery": false } } }