You are here

public function DeveloperAppNameConverter::convert in Apigee Edge 8

Converts path variables to their corresponding objects.

Parameters

mixed $value: The raw value.

mixed $definition: The parameter definition provided in the route options.

string $name: The name of the parameter.

array $defaults: The route defaults array.

Return value

mixed|null The converted parameter value.

Overrides ParamConverterInterface::convert

File

src/ParamConverter/DeveloperAppNameConverter.php, line 68

Class

DeveloperAppNameConverter
Resolves "developer_app_by_name" type parameters in routes.

Namespace

Drupal\apigee_edge\ParamConverter

Code

public function convert($value, $definition, $name, array $defaults) {
  if (empty($defaults['user'])) {
    return NULL;
  }
  $entity = NULL;

  /** @var \Drupal\user\UserInterface $user */

  // If {user} parameter is before the {app} in the route then
  // entity parameter converter should have already up-casted it to
  // a user object if not then let's try to up-cast it here.
  $user = is_object($defaults['user']) ? $defaults['user'] : $this->entityTypeManager
    ->getStorage('user')
    ->load($defaults['user']);
  if ($user) {
    $developer_id = $user
      ->get('apigee_edge_developer_id')->value;
    if ($developer_id) {
      $app_storage = $this->entityTypeManager
        ->getStorage('developer_app');
      $app_ids = $app_storage
        ->getQuery()
        ->condition('developerId', $developer_id)
        ->condition('name', $value)
        ->execute();
      if (!empty($app_ids)) {
        $app_id = reset($app_ids);

        // Load the entity directly from Apigee Edge if needed.
        // @see \Drupal\apigee_edge\ParamConverter\ApigeeEdgeLoadUnchangedEntity
        if (!empty($defaults['_route_object']
          ->getOption('apigee_edge_load_unchanged_entity'))) {
          if ($app_storage instanceof AppStorage) {
            $entity = $app_storage
              ->loadUnchangedByUuid($app_id);
          }
          else {
            $entity = $app_storage
              ->loadUnchanged($app_id);
          }
        }
        else {
          $entity = $app_storage
            ->load($app_id);
        }
      }
      if ($entity === NULL) {

        // App may have been deleted on Apigee Edge, that is a smaller
        // problem.
        $this->logger
          ->error('%class: Unable to load developer app with %name name owned by %email.', [
          '%class' => get_called_class(),
          '%name' => $value,
          '%email' => $user
            ->getEmail(),
        ]);
      }
    }
    else {

      // Developer does not exists (anymore) on Apigee Edge however it seems
      // it has existed before because someone knows the URL of the view
      // app page of one of its app.
      $this->logger
        ->critical('%class: Unable to find developer id for %user user.', [
        '%class' => get_called_class(),
        '%user' => $user
          ->getDisplayName(),
      ]);
      throw new DeveloperDoesNotExistException($user
        ->getEmail());
    }
  }
  return $entity;
}