You are here

protected static function EntityCondition::validate in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/jsonapi/src/Query/EntityCondition.php \Drupal\jsonapi\Query\EntityCondition::validate()

Validates the filter has the required fields.

1 call to EntityCondition::validate()
EntityCondition::createFromQueryParameter in core/modules/jsonapi/src/Query/EntityCondition.php
Creates an EntityCondition object from a query parameter.

File

core/modules/jsonapi/src/Query/EntityCondition.php, line 138

Class

EntityCondition
A condition object for the EntityQuery.

Namespace

Drupal\jsonapi\Query

Code

protected static function validate($parameter) {
  $valid_key_combinations = [
    [
      static::PATH_KEY,
      static::VALUE_KEY,
    ],
    [
      static::PATH_KEY,
      static::OPERATOR_KEY,
    ],
    [
      static::PATH_KEY,
      static::VALUE_KEY,
      static::OPERATOR_KEY,
    ],
  ];
  $given_keys = array_keys($parameter);
  $valid_key_set = array_reduce($valid_key_combinations, function ($valid, $set) use ($given_keys) {
    return $valid ? $valid : count(array_diff($set, $given_keys)) === 0;
  }, FALSE);
  $has_operator_key = isset($parameter[static::OPERATOR_KEY]);
  $has_path_key = isset($parameter[static::PATH_KEY]);
  $has_value_key = isset($parameter[static::VALUE_KEY]);
  $cacheability = (new CacheableMetadata())
    ->addCacheContexts([
    'url.query_args:filter',
  ]);
  if (!$valid_key_set) {

    // Try to provide a more specific exception is a key is missing.
    if (!$has_operator_key) {
      if (!$has_path_key) {
        throw new CacheableBadRequestHttpException($cacheability, "Filter parameter is missing a '" . static::PATH_KEY . "' key.");
      }
      if (!$has_value_key) {
        throw new CacheableBadRequestHttpException($cacheability, "Filter parameter is missing a '" . static::VALUE_KEY . "' key.");
      }
    }

    // Catchall exception.
    $reason = "You must provide a valid filter condition. Check that you have set the required keys for your filter.";
    throw new CacheableBadRequestHttpException($cacheability, $reason);
  }
  if ($has_operator_key) {
    $operator = $parameter[static::OPERATOR_KEY];
    if (!in_array($operator, static::$allowedOperators)) {
      $reason = "The '" . $operator . "' operator is not allowed in a filter parameter.";
      throw new CacheableBadRequestHttpException($cacheability, $reason);
    }
    if (in_array($operator, [
      'IS NULL',
      'IS NOT NULL',
    ]) && $has_value_key) {
      $reason = "Filters using the '" . $operator . "' operator should not provide a value.";
      throw new CacheableBadRequestHttpException($cacheability, $reason);
    }
  }
}