You are here

public function KanbanController::updateEntityWorkflowState in Content Planner 8

Updates the Workflow state of a given Entity.

Parameters

\Drupal\Core\Entity\ContentEntityInterface $entity: The current entity.

string $state_id: The target state id for the current entity.

Return value

\Symfony\Component\HttpFoundation\JsonResponse Returns a JSON response with the result of the update process.

Throws

\Drupal\Core\Entity\EntityStorageException

1 string reference to 'KanbanController::updateEntityWorkflowState'
content_kanban.routing.yml in modules/content_kanban/content_kanban.routing.yml
modules/content_kanban/content_kanban.routing.yml

File

modules/content_kanban/src/Controller/KanbanController.php, line 136

Class

KanbanController
Class KanbanController.

Namespace

Drupal\content_kanban\Controller

Code

public function updateEntityWorkflowState(ContentEntityInterface $entity, $state_id) {
  $data = [
    'success' => FALSE,
    'message' => NULL,
  ];

  // Check if entity is moderated.
  if (!$this->moderationInformation
    ->isModeratedEntity($entity)) {
    $data['message'] = $this
      ->t('Entity @type with ID @id is not a moderated entity.', [
      '@id' => $entity
        ->id(),
      '@type' => $entity
        ->getEntityTypeId(),
    ]);
    return new JsonResponse($data);
  }

  // Get Workflow from entity.
  $workflow = $this->moderationInformation
    ->getWorkflowForEntity($entity);

  // If Workflow does not exist.
  if (!$workflow) {
    $data['message'] = $this
      ->t('Workflow not found for Entity @type with ID @id.', [
      '@id' => $entity
        ->id(),
      '@type' => $entity
        ->getEntityTypeId(),
    ]);
    return new JsonResponse($data);
  }

  // Get Workflow States.
  $workflow_states = KanbanWorkflowService::getWorkflowStates($workflow);

  // Check if state given by request matches any of the Workflow's states.
  if (!array_key_exists($state_id, $workflow_states)) {
    $data['message'] = $this
      ->t('Workflow State @state_id is not a valid state of Workflow @workflow_id.', [
      '@state_id' => $state_id,
      '@workflow_id' => $workflow
        ->id(),
    ]);
    return new JsonResponse($data);
  }

  // Load current workflow state of entity.
  $current_state = $entity
    ->get('moderation_state')
    ->getValue()[0]['value'];

  // Load all valid transitions.a1
  $allowed_transitions = $this->stateTransitionValidation
    ->getValidTransitions($entity, $this->currentUser);

  // Load all available transitions.
  $transitions = $workflow
    ->get('type_settings')['transitions'];
  foreach ($transitions as $key => $transition) {
    if (in_array($current_state, $transition['from']) && $transition['to'] == $state_id) {
      $transition_id = $key;
      continue;
    }
  }
  if (empty($transition_id)) {
    $data['message'] = $this
      ->t('Invalid transition');
    return new JsonResponse($data);
  }
  if (!array_key_exists($transition_id, $allowed_transitions)) {
    $data['message'] = $this
      ->t('You do not have permissions to perform the action @transition_id for this content. Please contact the site administrator.', [
      '@transition_id' => $transition_id,
    ]);
    return new JsonResponse($data);
  }

  // Set new state.
  $entity->moderation_state->value = $state_id;

  // Save.
  if ($entity
    ->save() == SAVED_UPDATED) {
    $data['success'] = TRUE;
    $data['message'] = $this
      ->t('Workflow state of Entity @type with @id has been updated to @state_id', [
      '@type' => $entity
        ->getEntityTypeId(),
      '@id' => $entity
        ->id(),
      '@state_id' => $state_id,
    ]);
  }
  return new JsonResponse($data);
}