/**
  * Gets the resources for the provided query
  * @param \ride\library\http\jsonapi\JsonApiQuery $query
  * @param integer $total Total number of entries before pagination
  * @return mixed Array with resource data or false when an error occured
  */
 protected function getResources(JsonApiQuery $query, &$total)
 {
     $cacheControls = $this->dependencyInjector->getAll('ride\\library\\cache\\control\\CacheControl');
     $nameQuery = null;
     $lockedQuery = null;
     $enabledQuery = null;
     $filters = $query->getFilters();
     foreach ($filters as $filterName => $filterValue) {
         switch ($filterName) {
             case 'name':
                 $nameQuery = $filterValue;
                 break;
             case 'isLocked':
                 $lockedQuery = $filterValue;
                 break;
             case 'isEnabled':
                 $enabledQuery = $filterValue;
                 break;
             default:
                 $this->addFilterNotFoundError($this->type, $filterName);
                 break;
         }
     }
     $sorter = $this->createSorter($this->type, array('name', 'isLocked', 'isEnabled'));
     if ($this->document->getErrors()) {
         return false;
     }
     // perform filter
     if ($nameQuery || $lockedQuery || $enabledQuery) {
         foreach ($cacheControls as $key => $cacheControl) {
             if ($nameQuery && $this->filterStringValue($nameQuery, $cacheControl->getName()) === false) {
                 unset($cacheControls[$key]);
             } elseif ($lockedQuery !== null && ($lockedQuery && !$cacheControl->isLocked() || !$lockedQuery && $cacheControl->isLocked())) {
                 unset($cacheControls[$key]);
             } elseif ($enabledQuery !== null && ($enabledQuery && !$cacheControl->isEnabled() || !$enabledQuery && $cacheControl->isEnabled())) {
                 unset($cacheControls[$key]);
             }
         }
     }
     // create resource data from the parameters
     foreach ($cacheControls as $key => $cacheControl) {
         $cacheControls[$key] = array('id' => $cacheControl->getName(), 'name' => $cacheControl->getName(), 'isLocked' => !$cacheControl->canToggle(), 'isEnabled' => $cacheControl->isEnabled(), 'control' => $cacheControl);
     }
     // perform sort
     $cacheControls = $sorter->sort($cacheControls);
     // perform pagination
     $total = count($cacheControls);
     $cacheControls = array_slice($cacheControls, $query->getOffset(), $query->getLimit(100));
     // return
     return $cacheControls;
 }
 /**
  * Applies the API query on the model query through this strategy
  * @param \ride\library\http\jsonapi\JsonApiQuery $jsonApiQuery
  * @param \ride\library\orm\query\ModelQuery $modelQuery
  * @return null
  */
 public function applyFilter(JsonApiQuery $jsonApiQuery, ModelQuery $modelQuery)
 {
     $query = $jsonApiQuery->getFilter('elastic', null);
     if (!$query) {
         return;
     }
     $model = $modelQuery->getModel();
     if ($model->getMeta()->isLocalized()) {
         $query = str_replace(array('%locale%', '%25locale%25'), $modelQuery->getLocale(), $query);
     }
     $parameters = array('query' => $query, 'limit' => $jsonApiQuery->getLimit(50), 'offset' => $jsonApiQuery->getOffset());
     $result = $this->search->searchByQueryString($model, $parameters);
     $this->search->applyResultToModelQuery($result, $modelQuery);
 }
 /**
  * Gets the resources for the provided query
  * @param \ride\library\http\jsonapi\JsonApiQuery $query
  * @param integer $total Total number of entries before pagination
  * @return mixed Array with resource data or false when an error occured
  */
 protected function getResources(JsonApiQuery $query, &$total)
 {
     $config = $this->getConfig();
     $parameters = $config->getAll();
     $parameters = $config->getConfigHelper()->flattenConfig($parameters);
     $keyQuery = null;
     $valueQuery = null;
     $filters = $query->getFilters();
     foreach ($filters as $filterName => $filterValue) {
         switch ($filterName) {
             case 'key':
                 $keyQuery = $filterValue;
                 break;
             case 'value':
                 $valueQuery = $filterValue;
                 break;
             default:
                 $this->addFilterNotFoundError($this->type, $filterName);
                 break;
         }
     }
     $sorter = $this->createSorter($this->type, array('key', 'value'));
     if ($this->document->getErrors()) {
         return false;
     }
     // perform filter
     if ($keyQuery || $valueQuery) {
         foreach ($parameters as $key => $value) {
             if ($keyQuery && $this->filterStringValue($keyQuery, $key) === false) {
                 unset($parameters[$key]);
             } elseif ($valueQuery && $this->filterStringValue($valueQuery, $value) === false) {
                 unset($parameters[$key]);
             }
         }
     }
     // create resource data from the parameters
     foreach ($parameters as $key => $value) {
         $parameters[$key] = array('id' => $key, 'key' => $key, 'value' => $value);
     }
     // perform sort
     $parameters = $sorter->sort($parameters);
     // perform pagination
     $total = count($parameters);
     $parameters = array_slice($parameters, $query->getOffset(), $query->getLimit(100));
     // return
     return $parameters;
 }
 /**
  * Gets the resources for the provided query
  * @param \ride\library\http\jsonapi\JsonApiQuery $query
  * @param integer $total Total number of entries before pagination
  * @return mixed Array with resource data or false when an error occured
  */
 protected function getResources(JsonApiQuery $query, &$total)
 {
     $locales = $this->i18n->getLocales();
     $codeQuery = null;
     $nameQuery = null;
     $filters = $query->getFilters();
     foreach ($filters as $filterName => $filterValue) {
         switch ($filterName) {
             case 'code':
                 $codeQuery = $filterValue;
                 break;
             case 'name':
                 $nameQuery = $filterValue;
                 break;
             default:
                 $this->addFilterNotFoundError($this->type, $filterName);
                 break;
         }
     }
     // perform filter
     if ($codeQuery || $nameQuery) {
         foreach ($locales as $index => $locale) {
             if ($codeQuery && $this->filterStringValue($codeQuery, $locale->getCode()) === false) {
                 unset($locales[$index]);
             } elseif ($nameQuery && $this->filterStringValue($nameQuery, $locale->getName()) === false) {
                 unset($locales[$index]);
             }
         }
     }
     $sorter = $this->createSorter($this->type, array('code', 'name'));
     if ($this->document->getErrors()) {
         return false;
     }
     // perform sort
     $locales = $sorter->sort($locales);
     // perform pagination
     $total = count($locales);
     $locales = array_slice($locales, $query->getOffset(), $query->getLimit(100));
     // return
     return $locales;
 }
 /**
  * @dataProvider providerGetOffsetThrowsExceptionWhenInvalidOffsetParameterProvided
  * @expectedException ride\library\http\jsonapi\exception\BadRequestJsonApiException
  */
 public function testGetOffsetThrowsExceptionWhenInvalidOffsetParameterProvided($offset)
 {
     $query = new JsonApiQuery(array(JsonApiQuery::PARAMETER_PAGE => array(JsonApiQuery::PARAMETER_OFFSET => $offset)));
     $query->getOffset();
 }
 /**
  * Gets the resources for the provided query
  * @param \ride\library\http\jsonapi\JsonApiQuery $query
  * @param integer $total Total number of entries before pagination
  * @return mixed Array with resource data or false when an error occured
  */
 protected function getResources(JsonApiQuery $query, &$total)
 {
     $locales = null;
     $translations = array();
     $keyQuery = null;
     $valueQuery = null;
     $filters = $query->getFilters();
     foreach ($filters as $filterName => $filterValue) {
         switch ($filterName) {
             case 'locale':
                 $locales = $filterValue;
                 if ($locales && !is_array($locales)) {
                     $locales = explode(',', $locales);
                 }
                 break;
             case 'key':
                 $keyQuery = $filterValue;
                 break;
             case 'value':
                 $valueQuery = $filterValue;
                 break;
             default:
                 $this->addFilterNotFoundError($this->type, $filterName);
                 break;
         }
     }
     $sorter = $this->createSorter($this->type, array('locale', 'key', 'value'));
     if ($this->document->getErrors()) {
         return false;
     }
     // lookup the requested locales
     if ($locales) {
         foreach ($locales as $index => $locale) {
             try {
                 $locale = $this->i18n->getLocale($locale);
                 $locales[$index] = $locale;
             } catch (LocaleNotFoundException $exception) {
                 $this->getLog()->logException($exception);
                 unset($locales[$index]);
             }
         }
     } else {
         $locales = $this->i18n->getLocales();
     }
     // lookup the translations for the locales
     foreach ($locales as $locale) {
         $translator = $this->i18n->getTranslator($locale);
         $localeTranslations = $translator->getTranslations();
         foreach ($localeTranslations as $key => $value) {
             if ($keyQuery && $this->filterStringValue($keyQuery, $key) === false) {
                 continue;
             } elseif ($valueQuery && $this->filterStringValue($valueQuery, $value) === false) {
                 continue;
             }
             $id = $locale->getCode() . '-' . $key;
             $translations[$id] = array('id' => $id, 'locale' => $locale, 'key' => $key, 'value' => $value);
         }
     }
     // perform sort
     $translations = $sorter->sort($translations);
     // perform pagination
     $total = count($translations);
     $translations = array_slice($translations, $query->getOffset(), $query->getLimit(100));
     // return
     return $translations;
 }