From 58fa8d4b8c95bd52ff2914adc0f47f1597f8da7d Mon Sep 17 00:00:00 2001 From: Alexander Skvortsov Date: Sat, 13 Mar 2021 16:32:48 -0500 Subject: [PATCH] Update for beta 16 --- extensions/subscriptions/extend.php | 20 +++---- .../js/src/forum/addSubscriptionFilter.js | 2 +- .../src/Gambit/SubscriptionGambit.php | 37 ------------- .../src/HideIgnoredFromAllDiscussionsPage.php | 32 ++++++++++++ .../FilterDiscussionListBySubscription.php | 30 ----------- .../src/Query/SubscriptionFilterGambit.php | 52 +++++++++++++++++++ 6 files changed, 95 insertions(+), 78 deletions(-) delete mode 100644 extensions/subscriptions/src/Gambit/SubscriptionGambit.php create mode 100644 extensions/subscriptions/src/HideIgnoredFromAllDiscussionsPage.php delete mode 100755 extensions/subscriptions/src/Listener/FilterDiscussionListBySubscription.php create mode 100644 extensions/subscriptions/src/Query/SubscriptionFilterGambit.php diff --git a/extensions/subscriptions/extend.php b/extensions/subscriptions/extend.php index 5f2639ba0..96d184849 100644 --- a/extensions/subscriptions/extend.php +++ b/extensions/subscriptions/extend.php @@ -11,17 +11,17 @@ use Flarum\Api\Serializer\BasicDiscussionSerializer; use Flarum\Api\Serializer\DiscussionSerializer; use Flarum\Discussion\Discussion; use Flarum\Discussion\Event\Saving; -use Flarum\Discussion\Event\Searching; -use Flarum\Event\ConfigureDiscussionGambits; +use Flarum\Discussion\Filter\DiscussionFilterer; +use Flarum\Discussion\Search\DiscussionSearcher; use Flarum\Extend; use Flarum\Post\Event\Deleted; use Flarum\Post\Event\Hidden; use Flarum\Post\Event\Posted; use Flarum\Post\Event\Restored; -use Flarum\Subscriptions\Gambit\SubscriptionGambit; +use Flarum\Subscriptions\HideIgnoredFromAllDiscussionsPage; +use Flarum\Subscriptions\Query\SubscriptionFilterGambit; use Flarum\Subscriptions\Listener; use Flarum\Subscriptions\Notification\NewPostBlueprint; -use Illuminate\Contracts\Events\Dispatcher; return [ (new Extend\Frontend('forum')) @@ -55,10 +55,10 @@ return [ ->listen(Deleted::class, Listener\DeleteNotificationWhenPostIsHiddenOrDeleted::class) ->listen(Posted::class, Listener\FollowAfterReply::class), - function (Dispatcher $events) { - $events->listen(ConfigureDiscussionGambits::class, function (ConfigureDiscussionGambits $event) { - $event->gambits->add(SubscriptionGambit::class); - }); - $events->listen(Searching::class, Listener\FilterDiscussionListBySubscription::class); - } + (new Extend\Filter(DiscussionFilterer::class)) + ->addFilter(SubscriptionFilterGambit::class) + ->addFilterMutator(HideIgnoredFromAllDiscussionsPage::class), + + (new Extend\SimpleFlarumSearch(DiscussionSearcher::class)) + ->addGambit(SubscriptionFilterGambit::class), ]; diff --git a/extensions/subscriptions/js/src/forum/addSubscriptionFilter.js b/extensions/subscriptions/js/src/forum/addSubscriptionFilter.js index 5cfd63980..b7076e4e5 100644 --- a/extensions/subscriptions/js/src/forum/addSubscriptionFilter.js +++ b/extensions/subscriptions/js/src/forum/addSubscriptionFilter.js @@ -30,7 +30,7 @@ export default function addSubscriptionFilter() { extend(DiscussionListState.prototype, 'requestParams', function (params) { if (this.params.onFollowing) { - params.filter.q = (params.filter.q || '') + ' is:following'; + params.filter.subscription = 'following'; } }); } diff --git a/extensions/subscriptions/src/Gambit/SubscriptionGambit.php b/extensions/subscriptions/src/Gambit/SubscriptionGambit.php deleted file mode 100644 index 657af1662..000000000 --- a/extensions/subscriptions/src/Gambit/SubscriptionGambit.php +++ /dev/null @@ -1,37 +0,0 @@ -getActor(); - - $method = $negate ? 'whereNotIn' : 'whereIn'; - $search->getQuery()->$method('id', function ($query) use ($actor, $matches) { - $query->select('discussion_id') - ->from('discussion_user') - ->where('user_id', $actor->id) - ->where('subscription', $matches[1] === 'follow' ? 'follow' : 'ignore'); - }); - } -} diff --git a/extensions/subscriptions/src/HideIgnoredFromAllDiscussionsPage.php b/extensions/subscriptions/src/HideIgnoredFromAllDiscussionsPage.php new file mode 100644 index 000000000..f4e1d609d --- /dev/null +++ b/extensions/subscriptions/src/HideIgnoredFromAllDiscussionsPage.php @@ -0,0 +1,32 @@ +getActiveFilters()) === 0) { + // TODO: might be better as `id IN (subquery)`? + $actor = $filterState->getActor(); + $filterState->getQuery()->whereNotExists(function ($query) use ($actor) { + $query->selectRaw(1) + ->from('discussion_user') + ->whereColumn('discussions.id', 'discussion_id') + ->where('user_id', $actor->id) + ->where('subscription', 'ignore'); + }); + } + } +} diff --git a/extensions/subscriptions/src/Listener/FilterDiscussionListBySubscription.php b/extensions/subscriptions/src/Listener/FilterDiscussionListBySubscription.php deleted file mode 100755 index 7f976eda0..000000000 --- a/extensions/subscriptions/src/Listener/FilterDiscussionListBySubscription.php +++ /dev/null @@ -1,30 +0,0 @@ -criteria->query) { - // might be better as `id IN (subquery)`? - $actor = $event->search->getActor(); - $event->search->getQuery()->whereNotExists(function ($query) use ($actor) { - $query->selectRaw(1) - ->from('discussion_user') - ->whereColumn('discussions.id', 'discussion_id') - ->where('user_id', $actor->id) - ->where('subscription', 'ignore'); - }); - } - } -} diff --git a/extensions/subscriptions/src/Query/SubscriptionFilterGambit.php b/extensions/subscriptions/src/Query/SubscriptionFilterGambit.php new file mode 100644 index 000000000..c51a91328 --- /dev/null +++ b/extensions/subscriptions/src/Query/SubscriptionFilterGambit.php @@ -0,0 +1,52 @@ +constrain($search->getQuery(), $search->getActor(), $matches[1], $negate); + } + + public function getFilterKey(): string + { + return 'subscription'; + } + + public function filter(FilterState $filterState, string $filterValue, bool $negate) + { + preg_match('/^' . $this->getGambitPattern().'$/i', 'is:'.$filterValue, $matches); + + $this->constrain($filterState->getQuery(), $filterState->getActor(), $matches[1], $negate); + } + + protected function constrain(Builder $query, User $actor, string $subscriptionType, bool $negate) + { + $method = $negate ? 'whereNotIn' : 'whereIn'; + $query->$method('id', function ($query) use ($actor, $subscriptionType) { + $query->select('discussion_id') + ->from('discussion_user') + ->where('user_id', $actor->id) + ->where('subscription', $subscriptionType === 'follow' ? 'follow' : 'ignore'); + }); + } +}