mautic / app /migrations /Version20201026101117.php
chrisbryan17's picture
Upload folder using huggingface_hub
d2897cd verified
<?php
declare(strict_types=1);
namespace Mautic\Migrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\Exception\SkipMigration;
use Doctrine\ORM\EntityManagerInterface;
use Mautic\CoreBundle\Doctrine\AbstractMauticMigration;
use Mautic\CoreBundle\Helper\EmojiHelper;
use Mautic\DynamicContentBundle\Entity\DynamicContent;
use Mautic\EmailBundle\Entity\Copy;
use Mautic\EmailBundle\Entity\Email;
final class Version20201026101117 extends AbstractMauticMigration
{
/**
* @throws SkipMigration
*/
public function preUp(Schema $schema): void
{
$table = $schema->getTable($this->prefix.'emails');
if ('utf8mb4' === $table->getColumn('subject')->getPlatformOption('charset')) {
throw new SkipMigration('Schema includes this migration');
}
}
public function up(Schema $schema): void
{
// Note: all these columns are type of LONGTEXT.
$tables = [
'emails' => ['subject', 'custom_html', 'plain_text', 'name'],
'email_copies' => ['subject', 'body', 'body_text'],
];
foreach ($tables as $table => $columns) {
foreach ($columns as $column) {
$this->addSql("ALTER TABLE {$this->prefix}{$table} CHANGE {$column} {$column} LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
}
}
}
public function postUp(Schema $schema): void
{
$this->convertEmailsEmojies();
$this->convertEmailCopiesEmojies();
$this->convertDynamicContentEmojies();
}
private function convertEmailsEmojies(): void
{
$this->iterateOverAllEntities(
Email::class,
function (Email $email) {
$email->setName(EmojiHelper::toEmoji($email->getName(), 'short'));
$email->setSubject(EmojiHelper::toEmoji($email->getSubject(), 'short'));
$email->setCustomHtml(EmojiHelper::toEmoji($email->getCustomHtml(), 'short'));
$email->setPlainText(EmojiHelper::toEmoji($email->getPlainText(), 'short'));
}
);
}
private function convertEmailCopiesEmojies(): void
{
$this->iterateOverAllEntities(
Copy::class,
function (Copy $emailCopy) {
$emailCopy->setSubject(EmojiHelper::toEmoji($emailCopy->getSubject(), 'short'));
$emailCopy->setBody(EmojiHelper::toEmoji($emailCopy->getBody(), 'short'));
$emailCopy->setBodyText(EmojiHelper::toEmoji($emailCopy->getBodyText(), 'short'));
}
);
}
private function convertDynamicContentEmojies(): void
{
$this->iterateOverAllEntities(
DynamicContent::class,
function (DynamicContent $dynamicContent) {
$dynamicContent->setDescription(EmojiHelper::toEmoji($dynamicContent->getDescription(), 'short'));
}
);
}
private function iterateOverAllEntities(string $entityClass, callable $entityModifier): void
{
$entityManager = $this->container->get('doctrine.orm.entity_manager');
\assert($entityManager instanceof EntityManagerInterface);
$batchSize = 50;
$i = 1;
$q = $entityManager->createQuery("SELECT t from {$entityClass} t");
$iterableResult = $q->toIterable();
foreach ($iterableResult as $row) {
$entityModifier($row[0]);
$entityManager->persist($row[0]);
if (0 === ($i % $batchSize)) {
$entityManager->flush();
$entityManager->clear();
}
++$i;
}
$entityManager->flush();
}
}