/**
  * 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);
 }
 /**
  * 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);
 }