diff --git a/src/Core/Search/SearchServiceProvider.php b/src/Core/Search/SearchServiceProvider.php index e6292728c..0b9260cf0 100644 --- a/src/Core/Search/SearchServiceProvider.php +++ b/src/Core/Search/SearchServiceProvider.php @@ -40,7 +40,9 @@ class SearchServiceProvider extends AbstractServiceProvider ->needs('Flarum\Core\Search\GambitManager') ->give(function (Container $app) { $gambits = new GambitManager($app); - $gambits->setFulltextGambit('Flarum\Core\Search\User\Gambits\FulltextGambit'); + + $gambits->setFulltextGambit('Flarum\Core\Search\User\Gambit\FulltextGambit'); + $gambits->add('Flarum\Core\Search\User\Gambit\EmailGambit'); $app->make('events')->fire( new ConfigureUserGambits($gambits) diff --git a/src/Core/Search/User/Gambit/EmailGambit.php b/src/Core/Search/User/Gambit/EmailGambit.php new file mode 100644 index 000000000..c6c406c05 --- /dev/null +++ b/src/Core/Search/User/Gambit/EmailGambit.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Core\Search\User\Gambit; + +use Flarum\Core\Search\User\UserSearch; +use Flarum\Core\Repository\UserRepository; +use Flarum\Core\Search\AbstractRegexGambit; +use Flarum\Core\Search\AbstractSearch; +use LogicException; + +class EmailGambit extends AbstractRegexGambit +{ + /** + * {@inheritdoc} + */ + protected $pattern = 'email:(.+)'; + + /** + * @var UserRepository + */ + protected $users; + + /** + * @param \Flarum\Core\Repository\UserRepository $users + */ + public function __construct(UserRepository $users) + { + $this->users = $users; + } + + /** + * {@inheritdoc} + */ + public function apply(AbstractSearch $search, $bit) + { + if (! $search->getActor()->isAdmin()) { + return false; + } + + return parent::apply($search, $bit); + } + + /** + * {@inheritdoc} + */ + protected function conditions(AbstractSearch $search, array $matches, $negate) + { + if (! $search instanceof UserSearch) { + throw new LogicException('This gambit can only be applied on a UserSearch'); + } + + $email = trim($matches[1], '"'); + + $user = $this->users->findByEmail($email); + + $search->getQuery()->where('id', $negate ? '!=' : '=', $user->id); + } +} diff --git a/src/Core/Search/User/Gambits/FulltextGambit.php b/src/Core/Search/User/Gambit/FulltextGambit.php similarity index 95% rename from src/Core/Search/User/Gambits/FulltextGambit.php rename to src/Core/Search/User/Gambit/FulltextGambit.php index f7871393d..b471feb6d 100644 --- a/src/Core/Search/User/Gambits/FulltextGambit.php +++ b/src/Core/Search/User/Gambit/FulltextGambit.php @@ -8,7 +8,7 @@ * file that was distributed with this source code. */ -namespace Flarum\Core\Search\User\Gambits; +namespace Flarum\Core\Search\User\Gambit; use Flarum\Core\Repository\UserRepository; use Flarum\Core\Search\AbstractSearch;