1
0
mirror of https://github.com/flarum/core.git synced 2025-10-14 00:15:51 +02:00

Search Filter Split, Use Same Controller (#2454)

This commit is contained in:
Alexander Skvortsov
2021-02-24 11:17:40 -05:00
committed by GitHub
parent 1c578a83e4
commit 023871ef86
42 changed files with 1663 additions and 535 deletions

View File

@@ -11,10 +11,10 @@ namespace Flarum\Api\Controller;
use Flarum\Api\Serializer\DiscussionSerializer;
use Flarum\Discussion\Discussion;
use Flarum\Discussion\Filter\DiscussionFilterer;
use Flarum\Discussion\Search\DiscussionSearcher;
use Flarum\Http\UrlGenerator;
use Flarum\Search\SearchCriteria;
use Illuminate\Support\Arr;
use Psr\Http\Message\ServerRequestInterface;
use Tobscure\JsonApi\Document;
@@ -43,11 +43,21 @@ class ListDiscussionsController extends AbstractListController
'lastPost'
];
/**
* {@inheritDoc}
*/
public $sort = ['lastPostedAt' => 'desc'];
/**
* {@inheritdoc}
*/
public $sortFields = ['lastPostedAt', 'commentCount', 'createdAt'];
/**
* @var DiscussionFilterer
*/
protected $filterer;
/**
* @var DiscussionSearcher
*/
@@ -59,11 +69,13 @@ class ListDiscussionsController extends AbstractListController
protected $url;
/**
* @param DiscussionFilterer $filterer
* @param DiscussionSearcher $searcher
* @param UrlGenerator $url
*/
public function __construct(DiscussionSearcher $searcher, UrlGenerator $url)
public function __construct(DiscussionFilterer $filterer, DiscussionSearcher $searcher, UrlGenerator $url)
{
$this->filterer = $filterer;
$this->searcher = $searcher;
$this->url = $url;
}
@@ -74,16 +86,19 @@ class ListDiscussionsController extends AbstractListController
protected function data(ServerRequestInterface $request, Document $document)
{
$actor = $request->getAttribute('actor');
$query = Arr::get($this->extractFilter($request), 'q');
$filters = $this->extractFilter($request);
$sort = $this->extractSort($request);
$criteria = new SearchCriteria($actor, $query, $sort);
$limit = $this->extractLimit($request);
$offset = $this->extractOffset($request);
$load = array_merge($this->extractInclude($request), ['state']);
$include = array_merge($this->extractInclude($request), ['state']);
$results = $this->searcher->search($criteria, $limit, $offset);
$criteria = new SearchCriteria($actor, $filters, $sort);
if (array_key_exists('q', $filters)) {
$results = $this->searcher->search($criteria, $limit, $offset);
} else {
$results = $this->filterer->filter($criteria, $limit, $offset);
}
$document->addPaginationLinks(
$this->url->to('api')->route('discussions.index'),
@@ -95,9 +110,9 @@ class ListDiscussionsController extends AbstractListController
Discussion::setStateUser($actor);
$results = $results->getResults()->load($load);
$results = $results->getResults()->load($include);
if ($relations = array_intersect($load, ['firstPost', 'lastPost'])) {
if ($relations = array_intersect($include, ['firstPost', 'lastPost'])) {
foreach ($results as $discussion) {
foreach ($relations as $relation) {
if ($discussion->$relation) {

View File

@@ -12,8 +12,8 @@ namespace Flarum\Api\Controller;
use Flarum\Api\Serializer\UserSerializer;
use Flarum\Http\UrlGenerator;
use Flarum\Search\SearchCriteria;
use Flarum\User\Filter\UserFilterer;
use Flarum\User\Search\UserSearcher;
use Illuminate\Support\Arr;
use Psr\Http\Message\ServerRequestInterface;
use Tobscure\JsonApi\Document;
@@ -40,6 +40,11 @@ class ListUsersController extends AbstractListController
'joinedAt'
];
/**
* @var UserFilterer
*/
protected $filterer;
/**
* @var UserSearcher
*/
@@ -51,11 +56,13 @@ class ListUsersController extends AbstractListController
protected $url;
/**
* @param UserFilterer $filterer
* @param UserSearcher $searcher
* @param UrlGenerator $url
*/
public function __construct(UserSearcher $searcher, UrlGenerator $url)
public function __construct(UserFilterer $filterer, UserSearcher $searcher, UrlGenerator $url)
{
$this->filterer = $filterer;
$this->searcher = $searcher;
$this->url = $url;
}
@@ -69,16 +76,19 @@ class ListUsersController extends AbstractListController
$actor->assertCan('viewUserList');
$query = Arr::get($this->extractFilter($request), 'q');
$filters = $this->extractFilter($request);
$sort = $this->extractSort($request);
$criteria = new SearchCriteria($actor, $query, $sort);
$limit = $this->extractLimit($request);
$offset = $this->extractOffset($request);
$load = $this->extractInclude($request);
$include = $this->extractInclude($request);
$results = $this->searcher->search($criteria, $limit, $offset, $load);
$criteria = new SearchCriteria($actor, $filters, $sort);
if (array_key_exists('q', $filters)) {
$results = $this->searcher->search($criteria, $limit, $offset);
} else {
$results = $this->filterer->filter($criteria, $limit, $offset);
}
$document->addPaginationLinks(
$this->url->to('api')->route('users.index'),
@@ -88,6 +98,6 @@ class ListUsersController extends AbstractListController
$results->areMoreResults() ? null : 0
);
return $results->getResults();
return $results->getResults()->load($include);
}
}