mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-18 15:33:15 +00:00
Change Api SearchController to use Fractal
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
34
lib/Alchemy/Phrasea/Search/SearchResultView.php
Normal file
34
lib/Alchemy/Phrasea/Search/SearchResultView.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Phraseanet
|
||||
*
|
||||
* (c) 2005-2016 Alchemy
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Alchemy\Phrasea\Search;
|
||||
|
||||
use Alchemy\Phrasea\SearchEngine\SearchEngineResult;
|
||||
|
||||
class SearchResultView
|
||||
{
|
||||
/**
|
||||
* @var SearchEngineResult
|
||||
*/
|
||||
private $result;
|
||||
|
||||
public function __construct(SearchEngineResult $result)
|
||||
{
|
||||
$this->result = $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return SearchEngineResult
|
||||
*/
|
||||
public function getResult()
|
||||
{
|
||||
return $this->result;
|
||||
}
|
||||
}
|
54
lib/Alchemy/Phrasea/Search/V2SearchTransformer.php
Normal file
54
lib/Alchemy/Phrasea/Search/V2SearchTransformer.php
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Phraseanet
|
||||
*
|
||||
* (c) 2005-2016 Alchemy
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Alchemy\Phrasea\Search;
|
||||
|
||||
use Alchemy\Phrasea\Model\RecordInterface;
|
||||
use League\Fractal\TransformerAbstract;
|
||||
|
||||
class V2SearchTransformer extends TransformerAbstract
|
||||
{
|
||||
public function transform(SearchResultView $searchView)
|
||||
{
|
||||
return [
|
||||
'offset_start' => $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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user