mirror of
https://github.com/flarum/core.git
synced 2025-08-08 09:26:34 +02:00
Add Search controllers for Discussions and Users, as copies of the ListDiscussions and ListUsers controllers
This commit is contained in:
112
src/Api/Controller/SearchDiscussionsController.php
Normal file
112
src/Api/Controller/SearchDiscussionsController.php
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Flarum.
|
||||||
|
*
|
||||||
|
* For detailed copyright and license information, please view the
|
||||||
|
* LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Flarum\Api\Controller;
|
||||||
|
|
||||||
|
use Flarum\Api\Serializer\DiscussionSerializer;
|
||||||
|
use Flarum\Discussion\Discussion;
|
||||||
|
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;
|
||||||
|
|
||||||
|
class SearchDiscussionsController extends AbstractListController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public $serializer = DiscussionSerializer::class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public $include = [
|
||||||
|
'user',
|
||||||
|
'lastPostedUser',
|
||||||
|
'mostRelevantPost',
|
||||||
|
'mostRelevantPost.user'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public $optionalInclude = [
|
||||||
|
'firstPost',
|
||||||
|
'lastPost'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public $sortFields = ['lastPostedAt', 'commentCount', 'createdAt'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var DiscussionSearcher
|
||||||
|
*/
|
||||||
|
protected $searcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var UrlGenerator
|
||||||
|
*/
|
||||||
|
protected $url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param DiscussionSearcher $searcher
|
||||||
|
* @param UrlGenerator $url
|
||||||
|
*/
|
||||||
|
public function __construct(DiscussionSearcher $searcher, UrlGenerator $url)
|
||||||
|
{
|
||||||
|
$this->searcher = $searcher;
|
||||||
|
$this->url = $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function data(ServerRequestInterface $request, Document $document)
|
||||||
|
{
|
||||||
|
$actor = $request->getAttribute('actor');
|
||||||
|
$query = Arr::get($this->extractFilter($request), 'q');
|
||||||
|
$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']);
|
||||||
|
|
||||||
|
$results = $this->searcher->search($criteria, $limit, $offset);
|
||||||
|
|
||||||
|
$document->addPaginationLinks(
|
||||||
|
$this->url->to('api')->route('discussions.index'),
|
||||||
|
$request->getQueryParams(),
|
||||||
|
$offset,
|
||||||
|
$limit,
|
||||||
|
$results->areMoreResults() ? null : 0
|
||||||
|
);
|
||||||
|
|
||||||
|
Discussion::setStateUser($actor);
|
||||||
|
|
||||||
|
$results = $results->getResults()->load($load);
|
||||||
|
|
||||||
|
if ($relations = array_intersect($load, ['firstPost', 'lastPost'])) {
|
||||||
|
foreach ($results as $discussion) {
|
||||||
|
foreach ($relations as $relation) {
|
||||||
|
if ($discussion->$relation) {
|
||||||
|
$discussion->$relation->discussion = $discussion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
}
|
93
src/Api/Controller/SearchUsersController.php
Normal file
93
src/Api/Controller/SearchUsersController.php
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Flarum.
|
||||||
|
*
|
||||||
|
* For detailed copyright and license information, please view the
|
||||||
|
* LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Flarum\Api\Controller;
|
||||||
|
|
||||||
|
use Flarum\Api\Serializer\UserSerializer;
|
||||||
|
use Flarum\Http\UrlGenerator;
|
||||||
|
use Flarum\Search\SearchCriteria;
|
||||||
|
use Flarum\User\Search\UserSearcher;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
use Tobscure\JsonApi\Document;
|
||||||
|
|
||||||
|
class SearchUsersController extends AbstractListController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public $serializer = UserSerializer::class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public $include = ['groups'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public $sortFields = [
|
||||||
|
'username',
|
||||||
|
'commentCount',
|
||||||
|
'discussionCount',
|
||||||
|
'lastSeenAt',
|
||||||
|
'joinedAt'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var UserSearcher
|
||||||
|
*/
|
||||||
|
protected $searcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var UrlGenerator
|
||||||
|
*/
|
||||||
|
protected $url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param UserSearcher $searcher
|
||||||
|
* @param UrlGenerator $url
|
||||||
|
*/
|
||||||
|
public function __construct(UserSearcher $searcher, UrlGenerator $url)
|
||||||
|
{
|
||||||
|
$this->searcher = $searcher;
|
||||||
|
$this->url = $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function data(ServerRequestInterface $request, Document $document)
|
||||||
|
{
|
||||||
|
$actor = $request->getAttribute('actor');
|
||||||
|
|
||||||
|
$actor->assertCan('viewUserList');
|
||||||
|
|
||||||
|
$query = Arr::get($this->extractFilter($request), 'q');
|
||||||
|
$sort = $this->extractSort($request);
|
||||||
|
|
||||||
|
$criteria = new SearchCriteria($actor, $query, $sort);
|
||||||
|
|
||||||
|
$limit = $this->extractLimit($request);
|
||||||
|
$offset = $this->extractOffset($request);
|
||||||
|
$load = $this->extractInclude($request);
|
||||||
|
|
||||||
|
$results = $this->searcher->search($criteria, $limit, $offset, $load);
|
||||||
|
|
||||||
|
$document->addPaginationLinks(
|
||||||
|
$this->url->to('api')->route('users.index'),
|
||||||
|
$request->getQueryParams(),
|
||||||
|
$offset,
|
||||||
|
$limit,
|
||||||
|
$results->areMoreResults() ? null : 0
|
||||||
|
);
|
||||||
|
|
||||||
|
return $results->getResults();
|
||||||
|
}
|
||||||
|
}
|
@@ -95,6 +95,13 @@ return function (RouteCollection $map, RouteHandlerFactory $route) {
|
|||||||
$route->toController(Controller\SendConfirmationEmailController::class)
|
$route->toController(Controller\SendConfirmationEmailController::class)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// List users
|
||||||
|
$map->get(
|
||||||
|
'/search/users',
|
||||||
|
'users.search',
|
||||||
|
$route->toController(Controller\SearchUsersController::class)
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Notifications
|
| Notifications
|
||||||
@@ -163,6 +170,13 @@ return function (RouteCollection $map, RouteHandlerFactory $route) {
|
|||||||
$route->toController(Controller\DeleteDiscussionController::class)
|
$route->toController(Controller\DeleteDiscussionController::class)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Search discussions
|
||||||
|
$map->get(
|
||||||
|
'/search/discussions',
|
||||||
|
'discussions.search',
|
||||||
|
$route->toController(Controller\SearchDiscussionsController::class)
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Posts
|
| Posts
|
||||||
|
Reference in New Issue
Block a user