You are here

public static function DeveloperAppFormTrait::appExists in Apigee Edge 8

File

src/Entity/Form/DeveloperAppFormTrait.php, line 44

Class

DeveloperAppFormTrait
Helper trait that contains developer app (create/edit) form specific tweaks.

Namespace

Drupal\apigee_edge\Entity\Form

Code

public static function appExists(string $name, array $element, FormStateInterface $form_state) : bool {

  // Do not validate if app name is not set.
  if ($name === '') {
    return FALSE;
  }

  // Return TRUE if developer account has not been found for this Drupal user.
  // TODO Make sure that DeveloperAppCreateEditFormForDeveloper can be
  // used only if the Drupal user in the route has a developer account
  // in Apigee Edge.
  if ($form_state
    ->getValue('owner') === NULL) {
    return TRUE;
  }

  // We use the developer app controller factory here instead of entity
  // query to reduce the number API calls. (Entity query may load all
  // developers to return whether the given developer has an app with
  // the provided name already.)

  /** @var \Drupal\apigee_edge\Entity\Controller\DeveloperAppControllerFactoryInterface $factory */
  $factory = \Drupal::service('apigee_edge.controller.developer_app_controller_factory');
  $app = TRUE;
  try {
    $app = $factory
      ->developerAppController($form_state
      ->getValue('owner'))
      ->load($name);
  } catch (ApiException $exception) {
    if ($exception instanceof ClientErrorException && $exception
      ->getEdgeErrorCode() === 'developer.service.AppDoesNotExist') {
      $app = FALSE;
    }
    else {

      // Fail safe, return TRUE in case of an API communication error or an
      // unexpected response.
      $context = [
        '%app_name' => $name,
        '%owner' => $form_state
          ->getValue('owner'),
      ];
      $context += Error::decodeException($exception);
      \Drupal::logger('apigee_edge')
        ->error("Unable to properly validate an app name's uniqueness. App name: %app_name. Owner: %owner. @message %function (line %line of %file). <pre>@backtrace_string</pre>", $context);
    }
  }
  return (bool) $app;
}