diff --git a/lib/Alchemy/Phrasea/Controller/Api/SearchController.php b/lib/Alchemy/Phrasea/Controller/Api/SearchController.php index e1113b3919..e9a654cf9e 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/SearchController.php +++ b/lib/Alchemy/Phrasea/Controller/Api/SearchController.php @@ -12,10 +12,15 @@ namespace Alchemy\Phrasea\Controller\Api; use Alchemy\Phrasea\Controller\Controller; use Alchemy\Phrasea\Model\Manipulator\UserManipulator; +use Alchemy\Phrasea\Search\SearchResultView; +use Alchemy\Phrasea\Search\V2SearchTransformer; use Alchemy\Phrasea\SearchEngine\SearchEngineInterface; use Alchemy\Phrasea\SearchEngine\SearchEngineLogger; use Alchemy\Phrasea\SearchEngine\SearchEngineOptions; use Alchemy\Phrasea\SearchEngine\SearchEngineResult; +use League\Fractal\Manager; +use League\Fractal\Resource\Item; +use League\Fractal\Serializer\ArraySerializer; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -28,25 +33,21 @@ class SearchController extends Controller */ public function searchAction(Request $request) { - list($ret, $search_result) = $this->searchAndFormatEngineResult($request); + $fractal = new Manager(); + $fractal->setSerializer(new ArraySerializer()); + $fractal->parseIncludes([]); - /** @var SearchEngineResult $search_result */ - $ret['search_type'] = $search_result->getOptions()->getSearchType(); - $ret['results'] = []; - - foreach ($search_result->getResults() as $record) { - $ret['results'][] = [ - 'databox_id' => $record->getDataboxId(), - 'record_id' => $record->getRecordId(), - 'collection_id' => $record->getCollectionId(), - 'version' => $record->getUpdated()->getTimestamp(), - ]; - } + $searchView = new SearchResultView($this->doSearch($request)); + $ret = $fractal->createData(new Item($searchView, new V2SearchTransformer()))->toArray(); return Result::create($request, $ret)->createResponse(); } - private function searchAndFormatEngineResult(Request $request) + /** + * @param Request $request + * @return SearchEngineResult + */ + private function doSearch(Request $request) { $options = SearchEngineOptions::fromRequest($this->app, $request); $options->setFirstResult($request->get('offset_start') ?: 0); @@ -55,9 +56,9 @@ class SearchController extends Controller $query = (string) $request->get('query'); $this->getSearchEngine()->resetCache(); - $search_result = $this->getSearchEngine()->query($query, $options); + $result = $this->getSearchEngine()->query($query, $options); - $this->getUserManipulator()->logQuery($this->getAuthenticatedUser(), $search_result->getQuery()); + $this->getUserManipulator()->logQuery($this->getAuthenticatedUser(), $result->getQuery()); foreach ($options->getDataboxes() as $databox) { $colls = array_map(function (\collection $collection) { @@ -67,25 +68,12 @@ class SearchController extends Controller })); $this->getSearchEngineLogger() - ->log($databox, $search_result->getQuery(), $search_result->getTotal(), $colls); + ->log($databox, $result->getQuery(), $result->getTotal(), $colls); } $this->getSearchEngine()->clearCache(); - $ret = [ - 'offset_start' => $options->getFirstResult(), - 'per_page' => $options->getMaxResults(), - 'available_results' => $search_result->getAvailable(), - 'total_results' => $search_result->getTotal(), - 'error' => (string)$search_result->getError(), - 'warning' => (string)$search_result->getWarning(), - 'query_time' => $search_result->getDuration(), - 'search_indexes' => $search_result->getIndexes(), - 'facets' => $search_result->getFacets(), - 'results' => [], - ]; - - return [$ret, $search_result]; + return $result; } /** diff --git a/lib/Alchemy/Phrasea/Search/SearchResultView.php b/lib/Alchemy/Phrasea/Search/SearchResultView.php new file mode 100644 index 0000000000..47c35e0ab3 --- /dev/null +++ b/lib/Alchemy/Phrasea/Search/SearchResultView.php @@ -0,0 +1,34 @@ +result = $result; + } + + /** + * @return SearchEngineResult + */ + public function getResult() + { + return $this->result; + } +} diff --git a/lib/Alchemy/Phrasea/Search/V2SearchTransformer.php b/lib/Alchemy/Phrasea/Search/V2SearchTransformer.php new file mode 100644 index 0000000000..1600302536 --- /dev/null +++ b/lib/Alchemy/Phrasea/Search/V2SearchTransformer.php @@ -0,0 +1,54 @@ + $searchView->getResult()->getOptions()->getFirstResult(), + 'per_page' => $searchView->getResult()->getOptions()->getMaxResults(), + 'available_results' => $searchView->getResult()->getAvailable(), + 'total_results' => $searchView->getResult()->getTotal(), + 'error' => (string)$searchView->getResult()->getError(), + 'warning' => (string)$searchView->getResult()->getWarning(), + 'query_time' => $searchView->getResult()->getDuration(), + 'search_indexes' => $searchView->getResult()->getIndexes(), + 'facets' => $searchView->getResult()->getFacets(), + 'search_type' => $searchView->getResult()->getOptions()->getSearchType(), + 'results' => $this->listResults($searchView->getResult()->getResults()), + ]; + } + + /** + * @param RecordInterface[] $results + * @return array + */ + public function listResults($results) + { + $data = []; + + foreach ($results as $record) { + $data[] = [ + 'databox_id' => $record->getDataboxId(), + 'record_id' => $record->getRecordId(), + 'collection_id' => $record->getCollectionId(), + 'version' => $record->getUpdated()->getTimestamp(), + ]; + } + + return $data; + } +}