From 061a8585c279412419e141c21dceabedc57d4f7f Mon Sep 17 00:00:00 2001 From: Alexander Skvortsov <38059171+askvortsov1@users.noreply.github.com> Date: Sun, 28 Jun 2020 15:02:09 -0400 Subject: [PATCH] Add suspended gambit (#23) * Add is:suspended gambit * Wrap where clauses in function * Added permission check for suspended gambit * Apply fixes from StyleCI Co-authored-by: luceos --- extensions/suspend/extend.php | 6 ++ .../src/Search/Gambit/SuspendedGambit.php | 68 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 extensions/suspend/src/Search/Gambit/SuspendedGambit.php diff --git a/extensions/suspend/extend.php b/extensions/suspend/extend.php index 81e892447..c2e454269 100644 --- a/extensions/suspend/extend.php +++ b/extensions/suspend/extend.php @@ -9,6 +9,7 @@ use Flarum\Api\Serializer\BasicUserSerializer; use Flarum\Event\ConfigureNotificationTypes; +use Flarum\Event\ConfigureUserGambits; use Flarum\Extend; use Flarum\Suspend\Access; use Flarum\Suspend\Event\Suspended; @@ -16,6 +17,7 @@ use Flarum\Suspend\Event\Unsuspended; use Flarum\Suspend\Listener; use Flarum\Suspend\Notification\UserSuspendedBlueprint; use Flarum\Suspend\Notification\UserUnsuspendedBlueprint; +use Flarum\Suspend\Search\Gambit\SuspendedGambit; use Flarum\User\Event\Saving; use Flarum\User\User; use Illuminate\Contracts\Events\Dispatcher; @@ -48,5 +50,9 @@ return [ $events->listen(Unsuspended::class, Listener\SendNotificationWhenUserIsUnsuspended::class); $events->subscribe(Access\UserPolicy::class); + + $events->listen(ConfigureUserGambits::class, function (ConfigureUserGambits $event) { + $event->gambits->add(SuspendedGambit::class); + }); } ]; diff --git a/extensions/suspend/src/Search/Gambit/SuspendedGambit.php b/extensions/suspend/src/Search/Gambit/SuspendedGambit.php new file mode 100644 index 000000000..d746c6770 --- /dev/null +++ b/extensions/suspend/src/Search/Gambit/SuspendedGambit.php @@ -0,0 +1,68 @@ +users = $users; + } + + /** + * {@inheritdoc} + */ + public function apply(AbstractSearch $search, $bit) + { + if (! $search->getActor()->can('suspend')) { + 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 DiscussionSearch'); + } + + $search->getQuery()->where(function ($query) use ($negate) { + if ($negate) { + $query->where('suspended_until', null)->orWhere('suspended_until', '<', Carbon::now()); + } else { + $query->where('suspended_until', '>', Carbon::now()); + } + }); + } +}