You are here

scheduler_api_test.module in Scheduler 2.x

Same filename and directory in other branches
  1. 8 tests/modules/scheduler_api_test/scheduler_api_test.module

Hook implementations of the Scheduler API Test module.

Scheduler provides eight hook functions. Each has a non-specific version with no _{type}_ in the name, which is invoked for all entity types, and a version with _{type}_ in the name, which is invoked only when that entity types is being processed. Hence for complete test coverage this module has eight plain implementations, eight implementations for Nodes and eight for Media.

File

tests/modules/scheduler_api_test/scheduler_api_test.module
View source
<?php

/**
 * @file
 * Hook implementations of the Scheduler API Test module.
 *
 * Scheduler provides eight hook functions. Each has a non-specific version with
 * no _{type}_ in the name, which is invoked for all entity types, and a version
 * with _{type}_ in the name, which is invoked only when that entity types is
 * being processed. Hence for complete test coverage this module has eight plain
 * implementations, eight implementations for Nodes and eight for Media.
 */
use Drupal\commerce_product\Entity\Product;
use Drupal\commerce_product\Entity\ProductInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\media\Entity\Media;
use Drupal\media\MediaInterface;
use Drupal\node\Entity\Node;
use Drupal\node\NodeInterface;

/**
 * Helper function to return all entities of a given type.
 */
function _scheduler_api_test_get_entities($entityTypeId) {
  switch ($entityTypeId) {
    case 'node':
      $results = Node::loadMultiple(\Drupal::entityQuery('node')
        ->accessCheck(FALSE)
        ->execute());
      break;
    case 'media':
      $results = Media::loadMultiple(\Drupal::entityQuery('media')
        ->accessCheck(FALSE)
        ->execute());
      break;
    case 'commerce_product':
      $results = Product::loadMultiple(\Drupal::entityQuery('commerce_product')
        ->accessCheck(FALSE)
        ->execute());
      break;
    default:
      throw new \Exception("Entity type id '{$entityTypeId}' is unrecognosed in _scheduler_api_test_get_entities().");
  }
  return $results;
}

/**
 * Implements hook_scheduler_list().
 */
function scheduler_api_test_scheduler_list($process, $entityTypeId) {
  $ids = [];
  $request_time = \Drupal::time()
    ->getRequestTime();
  $results = _scheduler_api_test_get_entities($entityTypeId);
  foreach ($results as $id => $entity) {

    // If publishing and this is the 'publish me' test entity, set the date and
    // add the id to the list.
    if ($process == 'publish' && !$entity
      ->isPublished() && $entity
      ->label() == "Pink {$entityTypeId} list publish me") {
      $entity
        ->set('publish_on', $request_time)
        ->save();
      $ids[] = $id;
    }

    // If unpublishing and this is the 'unpublish me' test entity, set the date
    // and add the id to the list.
    if ($process == 'unpublish' && $entity
      ->isPublished() && $entity
      ->label() == "Pink {$entityTypeId} list unpublish me") {
      $entity
        ->set('unpublish_on', $request_time)
        ->save();
      $ids[] = $id;
    }
  }
  return $ids;
}

/**
 * Implements hook_scheduler_node_list().
 */
function scheduler_api_test_scheduler_node_list($process, $entityTypeId) {
  $ids = [];
  $request_time = \Drupal::time()
    ->getRequestTime();
  $results = _scheduler_api_test_get_entities($entityTypeId);
  foreach ($results as $id => $entity) {

    // If publishing and this is the 'publish me' test entity, set the date and
    // add the id to the list.
    if ($process == 'publish' && !$entity
      ->isPublished() && $entity
      ->label() == "Purple {$entityTypeId} list publish me") {
      $entity
        ->set('publish_on', $request_time)
        ->save();
      $ids[] = $id;
    }

    // If unpublishing and this is the 'unpublish me' test entity, set the date
    // and add the id to the list.
    if ($process == 'unpublish' && $entity
      ->isPublished() && $entity
      ->label() == "Purple {$entityTypeId} list unpublish me") {
      $entity
        ->set('unpublish_on', $request_time)
        ->save();
      $ids[] = $id;
    }
  }
  return $ids;
}

/**
 * Implements hook_scheduler_media_list().
 */
function scheduler_api_test_scheduler_media_list($process, $entityTypeId) {

  // This hook does exactly the same as the node version, so re-use that.
  return scheduler_api_test_scheduler_node_list($process, $entityTypeId);
}

/**
 * Implements hook_scheduler_commerce_product_list().
 */
function scheduler_api_test_scheduler_commerce_product_list($process, $entityTypeId) {

  // This hook does exactly the same as the node version, so re-use that.
  return scheduler_api_test_scheduler_node_list($process, $entityTypeId);
}

/**
 * Implements hook_scheduler_list_alter().
 */
function scheduler_api_test_scheduler_list_alter(&$ids, $process, $entityTypeId) {
  $request_time = \Drupal::time()
    ->getRequestTime();
  $results = _scheduler_api_test_get_entities($entityTypeId);
  foreach ($results as $id => $entity) {
    if ($process == 'publish' && $entity
      ->label() == "Pink {$entityTypeId} list_alter do not publish me") {

      // Remove the id.
      $ids = array_diff($ids, [
        $id,
      ]);
    }
    if ($process == 'publish' && $entity
      ->label() == "Pink {$entityTypeId} list_alter publish me") {

      // Set a publish_on date and add the id.
      $entity
        ->set('publish_on', $request_time)
        ->save();
      $ids[] = $id;
    }
    if ($process == 'unpublish' && $entity
      ->label() == "Pink {$entityTypeId} list_alter do not unpublish me") {

      // Remove the id.
      $ids = array_diff($ids, [
        $id,
      ]);
    }
    if ($process == 'unpublish' && $entity
      ->label() == "Pink {$entityTypeId} list_alter unpublish me") {

      // Set an unpublish_on date and add the id.
      $entity
        ->set('unpublish_on', $request_time)
        ->save();
      $ids[] = $id;
    }
  }
}

/**
 * Implements hook_scheduler_node_list_alter().
 */
function scheduler_api_test_scheduler_node_list_alter(&$ids, $process, $entityTypeId) {
  $request_time = \Drupal::time()
    ->getRequestTime();
  $results = _scheduler_api_test_get_entities($entityTypeId);
  foreach ($results as $id => $entity) {
    if ($process == 'publish' && $entity
      ->label() == "Purple {$entityTypeId} list_alter do not publish me") {

      // Remove the id.
      $ids = array_diff($ids, [
        $id,
      ]);
    }
    if ($process == 'publish' && $entity
      ->label() == "Purple {$entityTypeId} list_alter publish me") {

      // Set a publish_on date and add the id.
      $entity
        ->set('publish_on', $request_time)
        ->save();
      $ids[] = $id;
    }
    if ($process == 'unpublish' && $entity
      ->label() == "Purple {$entityTypeId} list_alter do not unpublish me") {

      // Remove the id.
      $ids = array_diff($ids, [
        $id,
      ]);
    }
    if ($process == 'unpublish' && $entity
      ->label() == "Purple {$entityTypeId} list_alter unpublish me") {

      // Set an unpublish_on date and add the id.
      $entity
        ->set('unpublish_on', $request_time)
        ->save();
      $ids[] = $id;
    }
  }
}

/**
 * Implements hook_scheduler_media_list_alter().
 */
function scheduler_api_test_scheduler_media_list_alter(&$ids, $process, $entityTypeId) {

  // This hook does exactly the same as the node version, so re-use that.
  scheduler_api_test_scheduler_node_list_alter($ids, $process, $entityTypeId);
}

/**
 * Implements hook_scheduler_commerce_product_list_alter().
 */
function scheduler_api_test_scheduler_commerce_product_list_alter(&$ids, $process, $entityTypeId) {

  // This hook does exactly the same as the node version, so re-use that.
  scheduler_api_test_scheduler_node_list_alter($ids, $process, $entityTypeId);
}

/**
 * Implements hook_scheduler_publishing_allowed().
 */
function scheduler_api_test_scheduler_publishing_allowed(EntityInterface $entity) {

  // @todo Fill in this function and add test coverage.
}

/**
 * Generic function to check if the entity is allowed to be published.
 */
function _api_publishing_allowed(EntityInterface $entity) {

  // If there is no 'Approved for Publishing' field or we are not dealing with
  // an entity designed for this test then allow publishing.
  if (!isset($entity->field_approved_publishing) || !stristr($entity
    ->label(), "blue {$entity->getEntityTypeId()}")) {
    $allowed = TRUE;
  }
  else {

    // Only publish entities that have 'Approved for Publishing' set.
    $allowed = $entity->field_approved_publishing->value;

    // If publishing is denied then inform the user why.
    if (!$allowed) {

      // Show a message when the entity is saved.
      \Drupal::messenger()
        ->addMessage(t('%title is scheduled for publishing @publish_time, but will not be published until approved.', [
        '%title' => $entity
          ->label(),
        '@publish_time' => \Drupal::service('date.formatter')
          ->format($entity->publish_on->value, 'long'),
      ]), 'status', FALSE);

      // If the time is in the past it means that the action has been prevented.
      // Write a dblog message to show this. Give a link to view the entity but
      // cater for no id as the entity may be new and not yet saved.
      if ($entity->publish_on->value <= \Drupal::time()
        ->getRequestTime()) {
        \Drupal::logger('scheduler_api_test')
          ->warning('Publishing of "%title" is prevented until approved.', [
          '%title' => $entity
            ->label(),
          'link' => !empty($entity
            ->id()) ? $entity
            ->toLink(t('View'))
            ->toString() : '',
        ]);
      }
    }
  }
  return $allowed;
}

/**
 * Implements hook_scheduler_node_publishing_allowed().
 */
function scheduler_api_test_scheduler_node_publishing_allowed(NodeInterface $node) {

  // Use the generic publishing_allowed helper function.
  return _api_publishing_allowed($node);
}

/**
 * Implements hook_scheduler_media_publishing_allowed().
 */
function scheduler_api_test_scheduler_media_publishing_allowed(MediaInterface $media) {

  // Use the generic publishing_allowed helper function.
  return _api_publishing_allowed($media);
}

/**
 * Implements hook_scheduler_commerce_product_publishing_allowed().
 */
function scheduler_api_test_scheduler_commerce_product_publishing_allowed(ProductInterface $product) {

  // Use the generic publishing_allowed helper function.
  return _api_publishing_allowed($product);
}

/**
 * Implements hook_scheduler_unpublishing_allowed().
 */
function scheduler_api_test_scheduler_unpublishing_allowed(EntityInterface $entity) {

  // @todo Fill in this function and add test coverage.
}

/**
 * Generic function to check if the entity is allowed to be unpublished.
 */
function _api_unpublishing_allowed(EntityInterface $entity) {

  // If there is no 'Approved for Unpublishing' field or we are not dealing with
  // an entity designed for this test then allow unpublishing.
  if (!isset($entity->field_approved_unpublishing) || !stristr($entity
    ->label(), "red {$entity->getEntityTypeId()}")) {
    $allowed = TRUE;
  }
  else {

    // Only unpublish entities that have 'Approved for Unpublishing' set.
    $allowed = $entity->field_approved_unpublishing->value;

    // If unpublishing is denied then inform the user why.
    if (!$allowed) {

      // Show a message when the entity is saved.
      \Drupal::messenger()
        ->addMessage(t('%title is scheduled for unpublishing @unpublish_time, but will not be unpublished until approved.', [
        '%title' => $entity
          ->label(),
        '@unpublish_time' => \Drupal::service('date.formatter')
          ->format($entity->unpublish_on->value, 'long'),
      ]), 'status', FALSE);

      // If the time is in the past it means that the action has been prevented.
      // Write a dblog message to show this. Give a link to view the entity but
      // cater for no id as the entity may be new and not yet saved.
      if ($entity->unpublish_on->value <= \Drupal::time()
        ->getRequestTime()) {
        \Drupal::logger('scheduler_api_test')
          ->warning('Unpublishing of "%title" is prevented until approved.', [
          '%title' => $entity
            ->label(),
          'link' => !empty($entity
            ->id()) ? $entity
            ->toLink(t('View'))
            ->toString() : '',
        ]);
      }
    }
  }
  return $allowed;
}

/**
 * Implements hook_scheduler_node_unpublishing_allowed().
 */
function scheduler_api_test_scheduler_node_unpublishing_allowed(NodeInterface $node) {

  // Use the generic unpublishing_allowed helper function.
  return _api_unpublishing_allowed($node);
}

/**
 * Implements hook_scheduler_media_unpublishing_allowed().
 */
function scheduler_api_test_scheduler_media_unpublishing_allowed(MediaInterface $media) {

  // Use the generic unpublishing_allowed helper function.
  return _api_unpublishing_allowed($media);
}

/**
 * Implements hook_scheduler_commerce_product_unpublishing_allowed().
 */
function scheduler_api_test_scheduler_commerce_product_unpublishing_allowed(ProductInterface $product) {

  // Use the generic unpublishing_allowed helper function.
  return _api_unpublishing_allowed($product);
}

/**
 * Implements hook_scheduler_hide_publish_date().
 */
function scheduler_api_test_scheduler_hide_publish_date($form, $form_state, $entity) {

  // Hide the publish_on field if the title contains 'orange {type}'.
  if (stristr($entity
    ->label(), "orange {$entity->getEntityTypeId()}")) {
    \Drupal::messenger()
      ->addMessage(t('Scheduler_Api_Test: The publish_on field is hidden for orange.'), 'status', FALSE);
    return TRUE;
  }
  else {
    return FALSE;
  }
}

/**
 * Generic function to hide the publish_on date field.
 */
function _api_hide_publish_date($form, $form_state, $entity) {

  // Hide the publish_on field if the title contains 'green {type}'.
  if (stristr($entity
    ->label(), "green {$entity->getEntityTypeId()}")) {
    \Drupal::messenger()
      ->addMessage(t('Scheduler_Api_Test: The publish_on field is hidden for green.'), 'status', FALSE);
    return TRUE;
  }
  else {
    return FALSE;
  }
}

/**
 * Implements hook_scheduler_node_hide_publish_date().
 */
function scheduler_api_test_scheduler_node_hide_publish_date($form, $form_state, $entity) {

  // Use the generic hide_publish_date helper function.
  return _api_hide_publish_date($form, $form_state, $entity);
}

/**
 * Implements hook_scheduler_media_hide_publish_date().
 */
function scheduler_api_test_scheduler_media_hide_publish_date($form, $form_state, $entity) {

  // Use the generic hide_publish_date helper function.
  return _api_hide_publish_date($form, $form_state, $entity);
}

/**
 * Implements hook_scheduler_commerce_product_hide_publish_date().
 */
function scheduler_api_test_scheduler_commerce_product_hide_publish_date($form, $form_state, $entity) {

  // Use the generic hide_publish_date helper function.
  return _api_hide_publish_date($form, $form_state, $entity);
}

/**
 * Implements hook_scheduler_hide_unpublish_date().
 */
function scheduler_api_test_scheduler_hide_unpublish_date($form, $form_state, $entity) {

  // Hide the unpublish_on field if the title contains 'yellow {type}'.
  if (stristr($entity
    ->label(), "yellow {$entity->getEntityTypeId()}")) {
    \Drupal::messenger()
      ->addMessage(t('Scheduler_Api_Test: The unpublish_on field is hidden for yellow.'), 'status', FALSE);
    return TRUE;
  }
  else {
    return FALSE;
  }
}

/**
 * Generic function to hide the unpublish_on date field.
 */
function _api_hide_unpublish_date($form, $form_state, $entity) {

  // Hide the unpublish_on field if the title contains 'green {type}'.
  if (stristr($entity
    ->label(), "green {$entity->getEntityTypeId()}")) {
    \Drupal::messenger()
      ->addMessage(t('Scheduler_Api_Test: The unpublish_on field is hidden for green.'), 'status', FALSE);
    return TRUE;
  }
  else {
    return FALSE;
  }
}

/**
 * Implements hook_scheduler_node_hide_unpublish_date().
 */
function scheduler_api_test_scheduler_node_hide_unpublish_date($form, $form_state, $entity) {

  // Use the generic hide_unpublish_date helper function.
  return _api_hide_unpublish_date($form, $form_state, $entity);
}

/**
 * Implements hook_scheduler_media_hide_unpublish_date().
 */
function scheduler_api_test_scheduler_media_hide_unpublish_date($form, $form_state, $entity) {

  // Use the generic hide_unpublish_date helper function.
  return _api_hide_unpublish_date($form, $form_state, $entity);
}

/**
 * Implements hook_scheduler_commerce_product_hide_unpublish_date().
 */
function scheduler_api_test_scheduler_commerce_product_hide_unpublish_date($form, $form_state, $entity) {

  // Use the generic hide_unpublish_date helper function.
  return _api_hide_unpublish_date($form, $form_state, $entity);
}

/**
 * Implements hook_scheduler_publish_process().
 */
function scheduler_api_test_scheduler_publish_process(EntityInterface $entity) {

  // Any entity with 'red {type}' in the title is simulated to cause a failure
  // and should then be skipped by Scheduler.
  if (stristr($entity
    ->label(), "red {$entity->getEntityTypeId()}")) {
    $label_field = $entity
      ->getEntityType()
      ->get('entity_keys')['label'];
    $entity
      ->set($label_field, $entity
      ->label() . ' - publishing failed in API test module')
      ->save();
    \Drupal::messenger()
      ->addMessage(t('Scheduler_Api_Test: Red should cause Scheduler to abandon publishing.'), 'status', FALSE);
    return -1;
  }
  return 0;
}

/**
 * Generic function to process third-party publishing.
 */
function _api_publish_process(EntityInterface $entity) {

  // Entities with 'yellow {type}' in the title are simulated to be processed
  // by this hook, and will not be published by Scheduler.
  if (stristr($entity
    ->label(), "yellow {$entity->getEntityTypeId()}")) {
    $label_field = $entity
      ->getEntityType()
      ->get('entity_keys')['label'];
    $entity
      ->set($label_field, $entity
      ->label() . ' - publishing processed by API test module');
    $entity
      ->setPublished()
      ->save();
    \Drupal::messenger()
      ->addMessage(t('Scheduler_Api_Test: Yellow should not have publishing processed by Scheduler.'), 'status', FALSE);
    return 1;
  }
  return 0;
}

/**
 * Implements hook_scheduler_node_publish_process().
 */
function scheduler_api_test_scheduler_node_publish_process(NodeInterface $node) {

  // Use the generic publish_process helper function.
  return _api_publish_process($node);
}

/**
 * Implements hook_scheduler_media_publish_process().
 */
function scheduler_api_test_scheduler_media_publish_process(MediaInterface $media) {

  // Use the generic publish_process helper function.
  return _api_publish_process($media);
}

/**
 * Implements hook_scheduler_commerce_product_publish_process().
 */
function scheduler_api_test_scheduler_commerce_product_publish_process(ProductInterface $product) {

  // Use the generic publish_process helper function.
  return _api_publish_process($product);
}

/**
 * Implements hook_scheduler_unpublish_process().
 */
function scheduler_api_test_scheduler_unpublish_process(EntityInterface $entity) {

  // Any entity with 'blue {type}' in the title is simulated to cause a failure
  // and should then be skipped by Scheduler.
  if (stristr($entity
    ->label(), "blue {$entity->getEntityTypeId()}")) {
    $label_field = $entity
      ->getEntityType()
      ->get('entity_keys')['label'];
    $entity
      ->set($label_field, $entity
      ->label() . ' - unpublishing failed in API test module')
      ->save();
    \Drupal::messenger()
      ->addMessage(t('Scheduler_Api_Test: Blue should cause Scheduler to abandon unpublishing.'), 'status', FALSE);
    return -1;
  }
  return 0;
}

/**
 * Generic function to process third-party unpublishing.
 */
function _api_unpublish_process(EntityInterface $entity) {

  // Entities with 'orange {type}' in the title are simulated to be processed by
  // this hook, and will not be unpublished by Scheduler.
  if (stristr($entity
    ->label(), "orange {$entity->getEntityTypeId()}")) {
    $label_field = $entity
      ->getEntityType()
      ->get('entity_keys')['label'];
    $entity
      ->set($label_field, $entity
      ->label() . ' - unpublishing processed by API test module')
      ->save();
    $entity
      ->setUnpublished()
      ->save();
    \Drupal::messenger()
      ->addMessage(t('Scheduler_Api_Test: Orange should not have unpublishing processed by Scheduler.'), 'status', FALSE);
    return 1;
  }
  return 0;
}

/**
 * Implements hook_scheduler_node_unpublish_process().
 */
function scheduler_api_test_scheduler_node_unpublish_process(NodeInterface $node) {

  // Use the generic unpublish_process helper function.
  return _api_unpublish_process($node);
}

/**
 * Implements hook_scheduler_media_unpublish_process().
 */
function scheduler_api_test_scheduler_media_unpublish_process(MediaInterface $media) {

  // Use the generic unpublish_process helper function.
  return _api_unpublish_process($media);
}

/**
 * Implements hook_scheduler_commerce_product_unpublish_process().
 */
function scheduler_api_test_scheduler_commerce_product_unpublish_process(ProductInterface $product) {

  // Use the generic unpublish_process helper function.
  return _api_unpublish_process($product);
}

Functions

Namesort descending Description
scheduler_api_test_scheduler_commerce_product_hide_publish_date Implements hook_scheduler_commerce_product_hide_publish_date().
scheduler_api_test_scheduler_commerce_product_hide_unpublish_date Implements hook_scheduler_commerce_product_hide_unpublish_date().
scheduler_api_test_scheduler_commerce_product_list Implements hook_scheduler_commerce_product_list().
scheduler_api_test_scheduler_commerce_product_list_alter Implements hook_scheduler_commerce_product_list_alter().
scheduler_api_test_scheduler_commerce_product_publishing_allowed Implements hook_scheduler_commerce_product_publishing_allowed().
scheduler_api_test_scheduler_commerce_product_publish_process Implements hook_scheduler_commerce_product_publish_process().
scheduler_api_test_scheduler_commerce_product_unpublishing_allowed Implements hook_scheduler_commerce_product_unpublishing_allowed().
scheduler_api_test_scheduler_commerce_product_unpublish_process Implements hook_scheduler_commerce_product_unpublish_process().
scheduler_api_test_scheduler_hide_publish_date Implements hook_scheduler_hide_publish_date().
scheduler_api_test_scheduler_hide_unpublish_date Implements hook_scheduler_hide_unpublish_date().
scheduler_api_test_scheduler_list Implements hook_scheduler_list().
scheduler_api_test_scheduler_list_alter Implements hook_scheduler_list_alter().
scheduler_api_test_scheduler_media_hide_publish_date Implements hook_scheduler_media_hide_publish_date().
scheduler_api_test_scheduler_media_hide_unpublish_date Implements hook_scheduler_media_hide_unpublish_date().
scheduler_api_test_scheduler_media_list Implements hook_scheduler_media_list().
scheduler_api_test_scheduler_media_list_alter Implements hook_scheduler_media_list_alter().
scheduler_api_test_scheduler_media_publishing_allowed Implements hook_scheduler_media_publishing_allowed().
scheduler_api_test_scheduler_media_publish_process Implements hook_scheduler_media_publish_process().
scheduler_api_test_scheduler_media_unpublishing_allowed Implements hook_scheduler_media_unpublishing_allowed().
scheduler_api_test_scheduler_media_unpublish_process Implements hook_scheduler_media_unpublish_process().
scheduler_api_test_scheduler_node_hide_publish_date Implements hook_scheduler_node_hide_publish_date().
scheduler_api_test_scheduler_node_hide_unpublish_date Implements hook_scheduler_node_hide_unpublish_date().
scheduler_api_test_scheduler_node_list Implements hook_scheduler_node_list().
scheduler_api_test_scheduler_node_list_alter Implements hook_scheduler_node_list_alter().
scheduler_api_test_scheduler_node_publishing_allowed Implements hook_scheduler_node_publishing_allowed().
scheduler_api_test_scheduler_node_publish_process Implements hook_scheduler_node_publish_process().
scheduler_api_test_scheduler_node_unpublishing_allowed Implements hook_scheduler_node_unpublishing_allowed().
scheduler_api_test_scheduler_node_unpublish_process Implements hook_scheduler_node_unpublish_process().
scheduler_api_test_scheduler_publishing_allowed Implements hook_scheduler_publishing_allowed().
scheduler_api_test_scheduler_publish_process Implements hook_scheduler_publish_process().
scheduler_api_test_scheduler_unpublishing_allowed Implements hook_scheduler_unpublishing_allowed().
scheduler_api_test_scheduler_unpublish_process Implements hook_scheduler_unpublish_process().
_api_hide_publish_date Generic function to hide the publish_on date field.
_api_hide_unpublish_date Generic function to hide the unpublish_on date field.
_api_publishing_allowed Generic function to check if the entity is allowed to be published.
_api_publish_process Generic function to process third-party publishing.
_api_unpublishing_allowed Generic function to check if the entity is allowed to be unpublished.
_api_unpublish_process Generic function to process third-party unpublishing.
_scheduler_api_test_get_entities Helper function to return all entities of a given type.