You are here

protected function EntityConditionNormalizer::validate in JSON:API 8

Validates the filter has the required fields.

1 call to EntityConditionNormalizer::validate()
EntityConditionNormalizer::denormalize in src/Normalizer/EntityConditionNormalizer.php
Denormalizes data back into an object of the given class.

File

src/Normalizer/EntityConditionNormalizer.php, line 68

Class

EntityConditionNormalizer
The normalizer used for entity conditions.

Namespace

Drupal\jsonapi\Normalizer

Code

protected function validate($data) {
  $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($data);
  $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($data[static::OPERATOR_KEY]);
  $has_path_key = isset($data[static::PATH_KEY]);
  $has_value_key = isset($data[static::VALUE_KEY]);
  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 BadRequestHttpException("Filter parameter is missing a '" . static::PATH_KEY . "' key.");
      }
      if (!$has_value_key) {
        throw new BadRequestHttpException("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 BadRequestHttpException($reason);
  }
  if ($has_operator_key) {
    $operator = $data[static::OPERATOR_KEY];
    if (!in_array($operator, EntityCondition::$allowedOperators)) {
      $reason = "The '" . $operator . "' operator is not allowed in a filter parameter.";
      throw new BadRequestHttpException($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 BadRequestHttpException($reason);
    }
  }
}