1
0
mirror of https://github.com/flarum/core.git synced 2025-08-03 23:17:43 +02:00

Massive refactor

- Use contextual namespaces within Flarum\Core
- Clean up and docblock everything
- Refactor Activity/Notification blueprint stuff
- Refactor Formatter stuff
- Refactor Search stuff
- Upgrade to JSON-API 1.0
- Removed “addedPosts” and “removedPosts” relationships from discussion
API. This was used for adding/removing event posts after renaming a
discussion etc. Instead we should make an additional request to get all
new posts

Todo:
- Fix Extenders and extensions
- Get rid of repository interfaces
- Fix other bugs I’ve inevitably introduced
This commit is contained in:
Toby Zerner
2015-07-04 12:24:48 +09:30
parent 12dd550a14
commit a74b40fe47
324 changed files with 6443 additions and 4197 deletions

View File

@@ -0,0 +1,33 @@
<?php namespace Flarum\Core\Users\Search\Gambits;
use Flarum\Core\Users\UserRepositoryInterface;
use Flarum\Core\Search\Search;
use Flarum\Core\Search\GambitInterface;
class FulltextGambit implements GambitInterface
{
/**
* @var UserRepositoryInterface
*/
protected $users;
/**
* @param UserRepositoryInterface $users
*/
public function __construct(UserRepositoryInterface $users)
{
$this->users = $users;
}
/**
* {@inheritdoc}
*/
public function apply(Search $search, $bit)
{
$users = $this->users->getIdsForUsername($bit, $search->getActor());
$search->getQuery()->whereIn('id', $users);
$search->setDefaultSort(['id' => $users]);
}
}

View File

@@ -0,0 +1,7 @@
<?php namespace Flarum\Core\Users\Search;
use Flarum\Core\Search\Search;
class UserSearch extends Search
{
}

View File

@@ -0,0 +1,76 @@
<?php namespace Flarum\Core\Users\Search;
use Flarum\Core\Search\AppliesParametersToSearch;
use Flarum\Core\Search\GambitManager;
use Flarum\Core\Search\SearchCriteria;
use Flarum\Core\Search\SearchResults;
use Flarum\Core\Users\UserRepositoryInterface;
use Flarum\Core\Users\Events\UserSearchWillBePerformed;
/**
* Takes a UserSearchCriteria object, performs a search using gambits,
* and spits out a UserSearchResults object.
*/
class UserSearcher
{
use AppliesParametersToSearch;
/**
* @var GambitManager
*/
protected $gambits;
/**
* @var UserRepositoryInterface
*/
protected $users;
/**
* @param GambitManager $gambits
* @param UserRepositoryInterface $users
*/
public function __construct(GambitManager $gambits, UserRepositoryInterface $users)
{
$this->gambits = $gambits;
$this->users = $users;
}
/**
* @param SearchCriteria $criteria
* @param int|null $limit
* @param int $offset
* @param array $load An array of relationships to load on the results.
* @return SearchResults
*/
public function search(SearchCriteria $criteria, $limit = null, $offset = 0, array $load = [])
{
$actor = $criteria->actor;
$query = $this->users->query()->whereVisibleTo($actor);
// Construct an object which represents this search for users.
// Apply gambits to it, sort, and paging criteria. Also give extensions
// an opportunity to modify it.
$search = new UserSearch($query->getQuery(), $actor);
$this->gambits->apply($search, $criteria->query);
$this->applySort($search, $criteria->sort);
$this->applyOffset($search, $offset);
$this->applyLimit($search, $limit + 1);
event(new UserSearchWillBePerformed($search, $criteria));
// Execute the search query and retrieve the results. We get one more
// results than the user asked for, so that we can say if there are more
// results. If there are, we will get rid of that extra result.
$users = $query->get();
if ($areMoreResults = ($limit > 0 && $users->count() > $limit)) {
$users->pop();
}
$users->load($load);
return new SearchResults($users, $areMoreResults);
}
}