media_library_extend_crowdriff-1.x-dev/media_library_extend_crowdriff.module
media_library_extend_crowdriff.module
<?php
/**
* @file
* Contains media_library_extend_crowdriff.module.
*/
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Url;
/**
* Implements hook_help().
*/
function media_library_extend_crowdriff_help($route_name, RouteMatchInterface $route_match) {
if ($route_name == 'help.page.media_library_extend_crowdriff') {
$text = file_get_contents(__DIR__ . '/README.md');
if (!Drupal::moduleHandler()->moduleExists('markdown')) {
return '<pre>' . $text . '</pre>';
}
else {
/** @var \Drupal\markdown\PluginManager\ParserManagerInterface $parser_manager */
$parser_manager = \Drupal::service('plugin.manager.markdown.parser');
$parser = $parser_manager->getDefaultParser([
'render_strategy' => ['type' => 'none'],
]);
return $parser->parse($text);
}
}
return NULL;
}
/**
* Implements hook_form_alter().
*/
function media_library_extend_crowdriff_form_alter(&$form, FormStateInterface $form_state, $form_id) {
$valid_forms = [
'media_crowdriff_image_edit_form',
'media_crowdriff_video_edit_form',
];
if (in_array($form_id, $valid_forms)) {
/** @var \Drupal\media\MediaInterface $entity */
if ($entity = $form_state->getFormObject()->getEntity()) {
// Disabled fields.
$form['field_crowdriff_asset_uuid']['#disabled'] = TRUE;
// Refresh asset button.
$button = !empty($form['actions']['submit']) ? $form['actions']['submit'] : [];
$button['#value'] = t('Save & Refresh Crowdriff Asset');
$button['#button_type'] = 'secondary';
$button['#submit'] = ['_media_library_extend_crowdriff_refresh_asset'];
$button['#weight']++;
// Add button.
$form['actions']['refresh_crowdriff_asset'] = $button;
}
}
}
/**
* Refresh Crowdriff asset data.
*
* @param array $form
* The form.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*
* @throws \Drupal\Core\Entity\EntityMalformedException
*/
function _media_library_extend_crowdriff_refresh_asset(array &$form, FormStateInterface $form_state) {
/** @var \Drupal\media\MediaInterface $entity */
if ($form_state->getFormObject() && $entity = $form_state->getFormObject()->getEntity()) {
if (!$entity->get('field_crowdriff_asset_uuid')->isEmpty()) {
if ($asset_uuid = $entity->get('field_crowdriff_asset_uuid')->value) {
/** @var \Drupal\media_library_extend_crowdriff\CrowdriffAssetService $crowdriffAssetService */
$crowdriffAssetService = \Drupal::service('media_library_extend_crowdriff.crowdriff_asset_service');
$status = $crowdriffAssetService->queueAsset($entity->id(), $asset_uuid);
$messenger = Drupal::messenger();
if ($status) {
$messenger->addMessage(t('Asset @id was added to refresh queue successfully.', ['@id' => $asset_uuid]));
}
else {
$messenger->addError(t('Failed to add asset @id to the queue for refresh.', ['@id' => $asset_uuid]));
}
}
}
}
}
/**
* Implements hook_cron().
*/
function media_library_extend_crowdriff_cron() {
/** @var \Drupal\crowdriff_api\CrowdriffService $crowdriffService */
$crowdriffService = \Drupal::service('crowdriff_api.crowdriff_service.crowdriff_service');
// Make sure sync is enabled.
$config = $crowdriffService->getConfig();
if ($config->get('sync')) {
// Get state.
$state = Drupal::state();
/** @var \Drupal\Core\Logger\LoggerChannelInterface $logger */
$logger = \Drupal::service('logger.factory')->get('media_library_extend_crowdriff');
// Get sync interval.
$interval = $config->get('sync_interval');
// 3600 seconds = 1 hour.
$interval = !empty($interval) ? $interval : 3600;
// Rate limit, so we're not syncing every minute even if cron
// is configured to.
$next_execution = $state->get('media_library_extend_crowdriff.next_sync');
$next_execution = !empty($next_execution) ? $next_execution : 0;
$request_time = Drupal::time()->getRequestTime();
// -1 interval means run on every cron.
$process_queues = ($interval == -1 || $request_time >= $next_execution);
if (!$process_queues) {
return;
}
/** @var \Drupal\media_library_extend_crowdriff\CrowdriffAssetService $crowdriffAssetService */
$crowdriffAssetService = \Drupal::service('media_library_extend_crowdriff.crowdriff_asset_service');
$crowdriffAssetService->refreshAssetQueue();
// Get total queued items.
$total_queue_items = $crowdriffAssetService->getTotalAssetQueuedItems();
$logger->info('Total items in the queue: @items.', ['@items' => $total_queue_items]);
// Set next sync.
$state->set('media_library_extend_crowdriff.next_sync', $request_time + $interval);
}
}
/**
* Implements hook_entity_operation().
*/
function media_library_extend_crowdriff_entity_operation(EntityInterface $entity) {
$operations = [];
// Add asset refresh operation.
if ($entity->getEntityTypeId() == 'media' && ($entity->bundle() == 'crowdriff_image' || $entity->bundle() == 'crowdriff_video')) {
// Make sure asset has uuid and field.
if ($entity->hasField('field_crowdriff_asset_uuid') && !$entity->get('field_crowdriff_asset_uuid')->isEmpty()) {
// Make sure account has permission.
$account = \Drupal::currentUser();
if ($account->hasPermission('sync crowdriff asset')) {
// Asset refresh operation.
$operations['asset-refresh'] = [
'title' => t('Refresh Crowdriff Asset'),
'weight' => 15,
'url' => Url::fromRoute("media_library_extend_crowdriff.refresh_asset", [
'media_id' => $entity->id(),
'asset_id' => $entity->get('field_crowdriff_asset_uuid')->value,
]),
];
}
}
}
return $operations;
}
/**
* Implements hook_entity_bundle_field_info_alter().
*/
function media_library_extend_crowdriff_entity_bundle_field_info_alter(&$fields, EntityTypeInterface $entity_type, $bundle) {
// Make sure it's a media entity.
// Bundle must be crowdriff_image or crowdriff_video.
if ($entity_type->id() == 'media' && ($bundle == 'crowdriff_image' || $bundle == 'crowdriff_video')) {
// Add constraint against asset uuid field.
if (isset($fields['field_crowdriff_asset_uuid'])) {
$fields['field_crowdriff_asset_uuid']->addConstraint('UniqueAssetId', []);
}
}
}
