diff --git a/backerymails.install b/backerymails.install index 801bd12..9be10db 100644 --- a/backerymails.install +++ b/backerymails.install @@ -5,7 +5,9 @@ * Contains backerymails.install. */ +use Symfony\Component\Yaml\Yaml; use Drupal\Core\Url; +use Drupal\Core\Database\Database; /** * Implements hook_install(). @@ -20,3 +22,32 @@ function backerymails_install() { $messenger = \Drupal::messenger(); $messenger->addMessage(t('Backery Mails settings are available under Administer > Site configuration > Backery Mails', ['@administer-page' => $url->toString()])); } + +/** + * Implementions of hook_update_N(). + */ + +/** + * Update Backerymails entity base table in order to fix typo in table name. + */ +function backerymails_update_8001() { + $database = Database::getConnection(); + + // Delete all old backerymails entity definition. + $database->delete('key_value') + ->condition('name', 'backerymails_entity.%', 'LIKE') + ->execute(); + + // Re-install the new entity that will generate a new table. + $type_manager = \Drupal::entityTypeManager(); + $type_manager->clearCachedDefinitions(); + $entity_type = $type_manager->getDefinition('backerymails_entity'); + \Drupal::entityDefinitionUpdateManager()->installEntityType($entity_type); + + // Update the existing backerymails views with the new base-table. + $config_path = drupal_get_path('module', 'backerymails') . '/config/install/views.view.backerymails.yml'; + $data = Yaml::parse(file_get_contents($config_path)); + \Drupal::configFactory()->getEditable('views.view.backerymails')->setData($data)->save(TRUE); + + return t('Backerymails base-table entity has been updated.'); +} diff --git a/backerymails.post_update.php b/backerymails.post_update.php new file mode 100644 index 0000000..a3335b1 --- /dev/null +++ b/backerymails.post_update.php @@ -0,0 +1,41 @@ +schema()->tableExists('backerymails_sended_mail') && $database->schema()->tableExists('backerymails_sent_mails')) { + $query = $database->select('backerymails_sended_mail', 'sent_mails') + ->fields('sent_mails'); + + $backerymails_storage = \Drupal::service('entity_type.manager')->getStorage('backerymails_entity'); + $tuples = $query->execute()->fetchAll(); + foreach ($tuples as $tulpe) { + $backerymails_storage->create([ + 'module' => $tulpe->module, + 'module_key' => $tulpe->module_key, + 'mail_from' => $tulpe->mail_from, + 'mail_to' => $tulpe->mail_to, + 'mail_reply_to' => $tulpe->mail_reply_to, + 'langcode' => $tulpe->langcode, + 'subject' => $tulpe->subject, + 'body__value' => $tulpe->body__value, + 'body__format' => $tulpe->body__format, + 'created' => $tulpe->created, + ])->save(); + } + + $database->schema()->dropTable('backerymails_sended_mail'); + } +} diff --git a/config/install/views.view.backerymails.yml b/config/install/views.view.backerymails.yml index e36056d..02923b8 100644 --- a/config/install/views.view.backerymails.yml +++ b/config/install/views.view.backerymails.yml @@ -10,9 +10,8 @@ label: Backerymails module: views description: Backerymails tag: backerymails -base_table: backerymails_sended_mail +base_table: backerymails_sent_mails base_field: id -core: 8.x display: default: display_plugin: default @@ -158,7 +157,7 @@ display: fields: id: id: id - table: backerymails_sended_mail + table: backerymails_sent_mails field: id relationship: none group_type: group @@ -224,7 +223,7 @@ display: plugin_id: field created: id: created - table: backerymails_sended_mail + table: backerymails_sent_mails field: created relationship: none group_type: group @@ -291,7 +290,7 @@ display: plugin_id: field module: id: module - table: backerymails_sended_mail + table: backerymails_sent_mails field: module relationship: none group_type: group @@ -356,7 +355,7 @@ display: plugin_id: field module_key: id: module_key - table: backerymails_sended_mail + table: backerymails_sent_mails field: module_key relationship: none group_type: group @@ -421,7 +420,7 @@ display: plugin_id: field mail_from: id: mail_from - table: backerymails_sended_mail + table: backerymails_sent_mails field: mail_from relationship: none group_type: group @@ -486,14 +485,14 @@ display: plugin_id: field mail_to: id: mail_to - table: backerymails_sended_mail + table: backerymails_sent_mails field: mail_to entity_type: backerymails_entity entity_field: mail_to plugin_id: field mail_reply_to: id: mail_reply_to - table: backerymails_sended_mail + table: backerymails_sent_mails field: mail_reply_to relationship: none group_type: group @@ -558,7 +557,7 @@ display: plugin_id: field langcode: id: langcode - table: backerymails_sended_mail + table: backerymails_sent_mails field: langcode relationship: none group_type: group @@ -623,7 +622,7 @@ display: plugin_id: field subject: id: subject - table: backerymails_sended_mail + table: backerymails_sent_mails field: subject relationship: none group_type: group diff --git a/src/Entity/BackerymailsEntity.php b/src/Entity/BackerymailsEntity.php index de64a40..ad8f9ae 100644 --- a/src/Entity/BackerymailsEntity.php +++ b/src/Entity/BackerymailsEntity.php @@ -24,10 +24,12 @@ * }, * "access" = "Drupal\backerymails\BackerymailsEntityAccessControlHandler", * }, - * base_table = "backerymails_sended_mail", + * base_table = "backerymails_sent_mails", * admin_permission = "administer backerymails", * entity_keys = { * "id" = "id", + * "label" = "subject", + * "langcode" = "langcode", * }, * links = { * "canonical" = "/admin/config/backerymails/mails/{backerymails_entity}", @@ -134,12 +136,6 @@ public function getBody() { public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { $fields = parent::baseFieldDefinitions($entity_type); - $fields['id'] = BaseFieldDefinition::create('integer') - ->setLabel(t('Entity ID')) - ->setDescription(t('The entity ID for this menu link content entity.')) - ->setReadOnly(TRUE) - ->setSetting('unsigned', TRUE); - $fields['module'] = BaseFieldDefinition::create('string') ->setLabel(t('Module')) ->setDescription(t('The module that send the mail.')); @@ -160,11 +156,6 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { ->setLabel(t('Reply-to')) ->setDescription(t('The reply-to(s) of the mail.')); - $fields['langcode'] = BaseFieldDefinition::create('string') - ->setLabel(t('Langcode')) - ->setSetting('max_length', 12) - ->setDescription(t('The langcode of the mail.')); - $fields['subject'] = BaseFieldDefinition::create('string') ->setLabel(t('Subject')) ->setDescription(t('The subject of the mail.')); diff --git a/tests/fixtures/update/drupal-8.backerymails-entity-installed.php b/tests/fixtures/update/drupal-8.backerymails-entity-installed.php new file mode 100644 index 0000000..5690c79 Binary files /dev/null and b/tests/fixtures/update/drupal-8.backerymails-entity-installed.php differ diff --git a/tests/fixtures/update/drupal-8.backerymails-entity-typos-8001.php b/tests/fixtures/update/drupal-8.backerymails-entity-typos-8001.php new file mode 100644 index 0000000..3836d32 Binary files /dev/null and b/tests/fixtures/update/drupal-8.backerymails-entity-typos-8001.php differ diff --git a/tests/fixtures/update/drupal-8.backerymails-installed.php b/tests/fixtures/update/drupal-8.backerymails-installed.php new file mode 100644 index 0000000..7e6aa61 --- /dev/null +++ b/tests/fixtures/update/drupal-8.backerymails-installed.php @@ -0,0 +1,44 @@ +merge('key_value') + ->fields([ + 'value' => 'i:8000;', + 'name' => 'backerymails', + 'collection' => 'system.schema', + ]) + ->condition('collection', 'system.schema') + ->condition('name', 'backerymails') + ->execute(); + +// Update core.extension. +$extensions = $connection->select('config') + ->fields('config', ['data']) + ->condition('collection', '') + ->condition('name', 'core.extension') + ->execute() + ->fetchField(); +$extensions = unserialize($extensions); +$extensions['module']['backerymails'] = 8000; +$connection->update('config') + ->fields([ + 'data' => serialize($extensions), + 'collection' => '', + 'name' => 'core.extension', + ]) + ->condition('collection', '') + ->condition('name', 'core.extension') + ->execute(); + diff --git a/tests/src/Functional/Update/RenameAndMigrateEntityTableUpdate8001Test.php b/tests/src/Functional/Update/RenameAndMigrateEntityTableUpdate8001Test.php new file mode 100644 index 0000000..b1d1f27 --- /dev/null +++ b/tests/src/Functional/Update/RenameAndMigrateEntityTableUpdate8001Test.php @@ -0,0 +1,109 @@ +databaseDumpFiles = [ + DRUPAL_ROOT . '/core/modules/system/tests/fixtures/update/drupal-8.8.0.bare.standard.php.gz', + __DIR__ . '/../../../fixtures/update/drupal-8.backerymails-installed.php', + __DIR__ . '/../../../fixtures/update/drupal-8.backerymails-entity-typos-8001.php', + ]; + } + else { + $this->databaseDumpFiles = [ + // @todo: Remove this fixture after 8.7 is no longer supported. + DRUPAL_ROOT . '/core/modules/system/tests/fixtures/update/drupal-8.bare.standard.php.gz', + __DIR__ . '/../../../fixtures/update/drupal-8.backerymails-installed.php', + __DIR__ . '/../../../fixtures/update/drupal-8.backerymails-entity-typos-8001.php', + ]; + } + } + + /** + * {@inheritdoc} + */ + protected function doSelectionTest() { + parent::doSelectionTest(); + $this->assertSession()->responseContains('Update Backerymails entity base table in order to fix typo in table name.'); + } + + /** + * Tests backerymails_update_8001(). + * + * Ensure every existing entries in the old table are migrated. + * + * @see backerymails_update_8001() + */ + public function testUpdate8001() { + $database = Database::getConnection(); + + $this->assertFalse($database->schema()->tableExists('backerymails_sent_mails')); + $this->assertTrue($database->schema()->tableExists('backerymails_sended_mail')); + $this->assertEquals(0, $database->query('SELECT count(*) FROM {backerymails_sended_mail}')->fetchField()); + + $database->insert('backerymails_sended_mail') + ->fields([ + 'module', + 'module_key', + 'mail_from', + 'mail_to', + 'mail_reply_to', + 'langcode', + 'subject', + 'body__value', + 'body__format', + ]) + ->values([ + 'backerymails.module', + 'backerymails.module_key', + 'backerymails.mail_from', + 'backerymails.mail_to', + 'backerymails.mail_reply_to', + 'en', + 'backerymails.subject', + 'backerymails.body', + null, + ]) + ->execute(); + $this->assertEquals(1, $database->query('SELECT count(*) FROM {backerymails_sended_mail}')->fetchField()); + + $this->runUpdates(); + + $this->assertTrue($database->schema()->tableExists('backerymails_sent_mails')); + $this->assertFalse($database->schema()->tableExists('backerymails_sended_mail')); + + $this->assertEquals(1, $database->query('SELECT count(*) FROM {backerymails_sent_mails}')->fetchField()); + $backerymails = BackerymailsEntity::loadMultiple(); + $this->assertCount(1, $backerymails); + } + +}