acquia_dam-1.0.0-rc1/acquia_dam.install

acquia_dam.install
<?php

/**
 * @file
 * Install, update and uninstall functions for the Acquia DAM module.
 */

declare(strict_types=1);

use Drupal\acquia_dam\Entity\ImageAltTextField;
use Drupal\acquia_dam\Entity\MediaExpiryDateField;
use Drupal\acquia_dam\Entity\MediaSourceField;
use Drupal\acquia_dam\FormatAllowedHtmlModifier;
use Drupal\Core\Config\FileStorage;
use Drupal\Core\Database\Database;
use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
use Drupal\Core\Entity\Sql\SqlContentEntityStorageException;
use Drupal\Core\Url;
use Drupal\filter\Entity\FilterFormat;

/**
 * Implements hook_schema().
 */
function acquia_dam_schema() {
  $schema = [];
  $schema['acquia_dam_integration_link_tracking'] = [
    'description' => 'Table for tracking DAM integration link IDs.',
    'fields' => [
      'entity_uuid' => [
        'type' => 'char',
        'description' => 'Parent entity UUID.',
        'length' => 36,
        'not null' => TRUE,
        'default' => '',
      ],
      'entity_type' => [
        'type' => 'varchar',
        'description' => 'Parent entity type.',
        'default' => '',
        'not null' => FALSE,
        'length' => 36,
      ],
      'asset_uuid' => [
        'type' => 'char',
        'description' => 'Asset UUID.',
        'length' => 36,
        'not null' => TRUE,
        'default' => '',
      ],
      'integration_link_id' => [
        'type' => 'varchar',
        'description' => 'Integration link UUID generated by DAM.',
        'default' => '',
        'not null' => TRUE,
        'length' => 36,
      ],
      'path' => [
        'type' => 'varchar',
        'description' => 'The path for the integration link.',
        'default' => '',
        'not null' => TRUE,
        'length' => 255,
      ],
      'created' => [
        'type' => 'varchar',
        'description' => "The integration created.",
        'default' => '',
        'not null' => TRUE,
        'length' => 36,
      ],
    ],
    'indexes' => [
      'entity' => ['entity_uuid', 'integration_link_id'],
    ],
    'unique keys' => [
      'integration_link_id' => ['integration_link_id'],
      'entity_uuid_entity_type_asset_uuid' => [
        'entity_uuid',
        'entity_type',
        'asset_uuid',
      ],
    ],
  ];

  $schema['acquia_dam_integration_link_aggregate'] = [
    'fields' => [
      'asset_uuid' => [
        'type' => 'char',
        'description' => 'Asset UUID.',
        'length' => 36,
        'not null' => TRUE,
        'default' => '',
      ],
      'usage_count' => [
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0,
      ],
    ],
    'primary key' => ['asset_uuid'],
  ];

  return $schema;
}

/**
 * Implements hook_install().
 */
function acquia_dam_install($is_syncing) {
  $state = \Drupal::state();
  $state->set('acquia_dam.last_update_check', \Drupal::time()->getCurrentTime());

  if (!$is_syncing) {
    \Drupal::messenger()->addStatus(t('The Acquia DAM module has been installed. You need to <a href=":link">configure the module</a> for others to make use of it.', [':link' => Url::fromRoute('acquia_dam.config')->toString()]));

    foreach (FilterFormat::loadMultiple() as $filter_format) {
      \Drupal::classResolver()
        ->getInstanceFromDefinition(FormatAllowedHtmlModifier::class)
        ->process($filter_format);
      $filter_format->save();
    }
  }

  $module_handler = \Drupal::service('module_handler');
  $config_factory = \Drupal::configFactory();
  if (!$module_handler->moduleExists('media_acquiadam')) {
    return;
  }
  // Zeroing in on the schema data check of the domain key as it contain
  // only in the 2.x version.
  $media_acquidam_config = \Drupal::service('config.typed')->getDefinition('media_acquiadam.settings');
  if (array_key_exists('domain', $media_acquidam_config['mapping'])) {
    $media_acquiadam_settings = $config_factory->get('media_acquiadam.settings');
    $acquia_dam_settings = $config_factory->getEditable('acquia_dam.settings');
    // Setting the domain.
    $domain_url = $media_acquiadam_settings->get('domain');
    $acquia_dam_settings->set('domain', $domain_url);
    $acquia_dam_settings->save();
    // Pushing token into the state.
    $token = $media_acquiadam_settings->get('token');
    $state->set('acquia_dam_token', $token);

    // Handling the user data.
    $user_data = \Drupal::service('user.data');
    $auth_service = \Drupal::service('acquia_dam.authentication_service');
    $user_ids = \Drupal::entityQuery('user')->accessCheck(FALSE)->execute();
    foreach ($user_ids as $user_id) {
      $account = $user_data->get('media_acquiadam', $user_id, 'account');
      if (isset($account['acquiadam_username']) && isset($account['acquiadam_token'])) {
        $auth_service->setUserData(
          (int) $user_id,
          [
            'acquia_dam_username' => $account['acquiadam_username'],
            'acquia_dam_token' => $account['acquiadam_token'],
          ]
        );
      }
    }
  }
}

/**
 * Implements hook_uninstall().
 */
function acquia_dam_uninstall() {
  $keys_to_delete = [
    'acquia_dam_token',
    'acquia_dam_username',
    'acquia_dam.last_update_check',
    'acquia_dam_refresh_token',
  ];

  $state = \Drupal::state();

  foreach ($keys_to_delete as $key) {
    if ($state->get($key)) {
      $state->delete($key);
    }
  }
}

/**
 * Imports configuration changes since RC1.
 */
function acquia_dam_update_9001() {

  $configuration_map = [
    'media_type' => [
      'media.type.acquia_dam_image_asset',
      'media.type.acquia_dam_spinset_asset',
      'media.type.acquia_dam_documents_asset',
    ],
    'entity_view_display' => [
      'core.entity_view_display.media.acquia_dam_image_asset.default',
      'core.entity_view_display.media.acquia_dam_image_asset.media_library',
      'core.entity_view_display.media.acquia_dam_spinset_asset.default',
      'core.entity_view_display.media.acquia_dam_spinset_asset.media_library',
      'core.entity_view_display.media.acquia_dam_documents_asset.default',
      'core.entity_view_display.media.acquia_dam_documents_asset.media_library',
    ],
  ];
  $source = new FileStorage(__DIR__ . '/config/install');
  foreach ($configuration_map as $config_type => $configs) {
    $entity_storage = \Drupal::entityTypeManager()->getStorage($config_type);
    foreach ($configs as $config) {
      $entity = $entity_storage->createFromStorageRecord($source->read($config));
      $entity->save();
    }
  }
}

/**
 * Update config schema for settings and set last update check in state storage.
 */
function acquia_dam_update_9002() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('acquia_dam.settings');
  $config->set('allowed_image_styles', []);
  $config->save(TRUE);

  $state = \Drupal::state();
  $state->set('acquia_dam.last_update_check', \Drupal::time()->getCurrentTime());

}

/**
 * Update database schema and configuration.
 */
function acquia_dam_update_9003() {
  _acquia_dam_add_dam_content_views();

  $config = [
    'fields' => [
      'asset_uuid' => [
        'type' => 'char',
        'description' => 'Asset UUID.',
        'length' => 36,
        'not null' => TRUE,
        'default' => '',
      ],
      'usage_count' => [
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0,
      ],
    ],
    'primary key' => ['asset_uuid'],
  ];

  $schema = Database::getConnection()->schema();
  $schema->createTable('acquia_dam_integration_link_aggregate', $config);

  _acquia_dam_populate_integration_link_aggregate_table();
}

/**
 * Imports configuration changes.
 *
 * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
 * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
 */
function _acquia_dam_add_dam_content_views() {
  $configuration_map = [
    'views.view.dam_content_overview',
    'views.view.acquia_dam_links',
  ];

  $source = new FileStorage(__DIR__ . '/config/install');
  $entity_storage = \Drupal::entityTypeManager()->getStorage('view');

  foreach ($configuration_map as $config) {
    $entity = $entity_storage->createFromStorageRecord($source->read($config));
    $entity->save();
  }
}

/**
 * Updates asset library configuration.
 */
function acquia_dam_update_9004() {
  $configs = [
    'acquia_dam_asset_library' => 'views.view.acquia_dam_asset_library',
    'dam_content_overview' => 'views.view.dam_content_overview',
  ];
  $source = new FileStorage(__DIR__ . '/config/install');
  $entity_storage = \Drupal::entityTypeManager()->getStorage('view');
  $view_configs = $entity_storage->loadMultiple(array_keys($configs));
  foreach ($view_configs as $view_config) {
    $entity = $entity_storage
      ->updateFromStorageRecord(
        $view_config,
        $source->read($configs[$view_config->id()])
      );
    $entity->save();
  }

  $field_storage_definition = MediaExpiryDateField::getStorageDefinition('media');
  $update_manager = \Drupal::entityDefinitionUpdateManager();
  $update_manager->installFieldStorageDefinition(
    MediaExpiryDateField::EXPIRY_DATE_FIELD_NAME,
    'media',
    'acquia_dam',
    $field_storage_definition
  );
}

/**
 * Install field storage for image alt text field.
 */
function acquia_dam_update_9005() {
  $field_storage_definition = ImageAltTextField::getStorageDefinition('media');
  $update_manager = \Drupal::entityDefinitionUpdateManager();
  $update_manager->installFieldStorageDefinition(
    ImageAltTextField::IMAGE_ALT_TEXT_FIELD_NAME,
    'media',
    'acquia_dam',
    $field_storage_definition
  );
}

/**
 * Uninstalls the acquia_dam_embeds field from the media entity.
 */
function acquia_dam_update_9006() {
  $entity_definition_update = \Drupal::entityDefinitionUpdateManager();
  if ($storage_definition = $entity_definition_update->getFieldStorageDefinition('acquia_dam_embeds', 'media')) {
    $entity_definition_update->uninstallFieldStorageDefinition($storage_definition);
  }
}

/**
 * Add the external_id column to the acquia_dam_asset media field.
 */
function acquia_dam_update_9007() {
  $processed_fields = [];
  $columns_to_add = ['external_id'];
  $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
  $asset_field_definition = $field_type_manager->getDefinition('acquia_dam_asset');

  /** @var \Drupal\acquia_dam\Plugin\Field\FieldType\AssetItem $asset_item_class */
  $asset_item_class = $asset_field_definition['class'];

  $schema = \Drupal::database()->schema();
  $entity_type_manager = \Drupal::entityTypeManager();
  $entity_field_manager = \Drupal::service('entity_field.manager');

  // We can't use $entity_field_manager->getFieldMapByFieldType()
  // since it won't display the fields that are added via the
  // hook_entity_field_storage_info().
  $entity_field_map = [
    'media' => [
      MediaSourceField::SOURCE_FIELD_NAME => [
        'type' => "acquia_dam_asset",
        'bundles' => [
          'acquia_dam_documents_asset' => 'acquia_dam_documents_asset',
          'acquia_dam_image_asset' => 'acquia_dam_image_asset',
          'acquia_dam_pdf_asset' => 'acquia_dam_pdf_asset',
          'acquia_dam_spinset_asset' => 'acquia_dam_spinset_asset',
          'acquia_dam_video_asset' => 'acquia_dam_video_asset',
        ],
      ],
    ],
  ];
  // The key-value collection for tracking installed storage schema.
  $entity_storage_schema_sql = \Drupal::keyValue('entity.storage_schema.sql');
  $entity_definitions_installed = \Drupal::keyValue('entity.definitions.installed');

  foreach ($entity_field_map as $entity_type_id => $field_map) {
    $entity_storage = $entity_type_manager->getStorage($entity_type_id);
    // Only SQL storage based entities are supported / throw known exception.
    if (!($entity_storage instanceof SqlContentEntityStorage)) {
      continue;
    }

    $entity_type = $entity_type_manager->getDefinition($entity_type_id);
    $field_storage_definitions = $entity_field_manager->getFieldStorageDefinitions($entity_type_id);
    /** @var Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
    $table_mapping = $entity_storage->getTableMapping($field_storage_definitions);
    // Only need field storage definitions of asset fields.
    /** @var \Drupal\Core\Field\FieldStorageDefinitionInterface $field_storage_definition */
    foreach (array_intersect_key($field_storage_definitions, $field_map) as $field_storage_definition) {
      $field_name = $field_storage_definition->getName();
      try {
        $table = $table_mapping->getFieldTableName($field_name);
      }
      catch (SqlContentEntityStorageException $e) {
        // If there is no table or column, there's little we can do.
        continue;
      }

      // Get the revision table.
      if ($table_mapping->requiresDedicatedTableStorage($field_storage_definition)) {
        $revision_table = $table_mapping->getDedicatedRevisionTableName($field_storage_definition);
      }
      elseif ($table_mapping->allowsSharedTableStorage($field_storage_definition)) {
        $revision_table = $entity_type->getRevisionDataTable() ?: $entity_type->getRevisionTable();
      }

      // Load the installed field schema so that it can be updated.
      $schema_key = "$entity_type_id.field_schema_data.$field_name";
      $field_schema_data = $entity_storage_schema_sql->get($schema_key);

      $processed_fields[] = [$entity_type_id, $field_name];
      // Loop over each new column and add it as a schema column change.
      foreach ($columns_to_add as $column_id) {
        $column = $table_mapping->getFieldColumnName($field_storage_definition, $column_id);
        // Add `initial_from_field` to the new spec, as this will copy over
        // the entire data.
        $field_schema = $asset_item_class::schema($field_storage_definition);
        $spec = $field_schema['columns'][$column_id];
        // Add the new column.
        $schema->addField($table, $column, $spec);
        if ($revision_table) {
          $schema->addField($revision_table, $column, $spec);
        }

        // Add the new column to the installed field schema.
        if ($field_schema_data) {
          $field_schema_data[$table]['fields'][$column] = $field_schema['columns'][$column_id];
          $field_schema_data[$table]['fields'][$column]['not null'] = FALSE;
          if ($revision_table) {
            $field_schema_data[$revision_table]['fields'][$column] = $field_schema['columns'][$column_id];
            $field_schema_data[$revision_table]['fields'][$column]['not null'] = FALSE;
          }
        }
      }

      // Save changes to the installed field schema.
      if ($field_schema_data) {
        $entity_storage_schema_sql->set($schema_key, $field_schema_data);
      }

      $key = "$entity_type_id.field_storage_definitions";
      if ($definitions = $entity_definitions_installed->get($key)) {
        $definitions[$field_name] = $field_storage_definition;
        $entity_definitions_installed->set($key, $definitions);
      }
    }
  }
}

/**
 * Checks if tracking table is not empty then populate aggregate table.
 *
 * @throws \Exception
 */
function _acquia_dam_populate_integration_link_aggregate_table() {
  $database = \Drupal::database();

  $count_query = $database
    ->select('acquia_dam_integration_link_tracking')
    ->countQuery();

  // If tracking table is empty, do nothing.
  if (!$count_query->execute()->fetchField()) {
    return;
  }

  $select = \Drupal::database()->select('acquia_dam_integration_link_tracking', 't');
  $select->addExpression('COUNT(t.asset_uuid)');
  $select = $select
    ->fields('t', ['asset_uuid'])
    ->groupBy('t.asset_uuid');

  $insert = $database
    ->insert('acquia_dam_integration_link_aggregate')
    ->fields(['asset_uuid', 'usage_count']);

  foreach ($select->execute()->fetchAll() as $result) {
    $insert->values([
      'asset_uuid' => $result->asset_uuid,
      'usage_count' => $result->expression,
    ]);
  }

  $insert->execute();
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc