/**
  * Get Cache Key
  *
  * @param Request $request Request
  *
  * @return string Cache Key
  */
 private function getCacheKey(Request $request, $cache_duration)
 {
     $keys = array_merge($request->getQueryParams(), $request->getAttributes());
     $cache_key = $request->getUri();
     $cache_key .= $request->getMethod();
     $cache_key .= $cache_duration;
     $cache_key .= serialize($keys);
     return md5($cache_key);
 }
 /**
  * With Criteria
  *
  * @param Request $request Request
  *
  * @return RestRequest RestRequest
  */
 private function withCriteria(Request $request)
 {
     $element_type = $request->getAttribute('elementType');
     $element_id = $request->getAttribute('elementId');
     $attributes = array_merge($request->getQueryParams(), $request->getAttributes());
     $criteria = \Craft\craft()->elements->getCriteria($element_type, $attributes);
     $pagination_parameter = \Craft\craft()->config->get('paginationParameter', 'restfulApi');
     if (isset($criteria->{$pagination_parameter})) {
         $criteria->offset = ($criteria->{$pagination_parameter} - 1) * $criteria->limit;
         unset($criteria->{$pagination_parameter});
     }
     if ($element_id) {
         $criteria->archived = null;
         $criteria->fixedOrder = null;
         $criteria->limit = 1;
         $criteria->localeEnabled = false;
         $criteria->offset = 0;
         $criteria->order = null;
         $criteria->status = null;
         $criteria->editable = null;
         if (is_numeric($element_id)) {
             $criteria->id = $element_id;
         } else {
             $criteria->slug = $element_id;
         }
     }
     return $request->withCriteria($criteria);
 }
 /**
  * Invoke
  *
  * @return void
  */
 public function __invoke(Request $request, Response $response, callable $next)
 {
     $config = $request->getRoute()->getMiddlewareConfig('validation');
     $input = $request->getMethod() === 'GET' ? $request->getQueryParams() : $request->getParams();
     try {
         $validator = $this->getValidator($config);
         $validator->assert($input);
     } catch (NestedValidationException $validation_exception) {
         $exception = new HttpMessagesException('Validation error.');
         $exception->setErrors($validation_exception->getMessages());
         $exception->setInput($input);
         throw $exception;
     }
     $response = $next($request, $response);
     return $response;
 }