mirror of
https://github.com/flarum/framework.git
synced 2025-01-20 15:46:16 +08:00
Update for beta 16
This commit is contained in:
parent
d8a39508dd
commit
58fa8d4b8c
|
@ -11,17 +11,17 @@ use Flarum\Api\Serializer\BasicDiscussionSerializer;
|
||||||
use Flarum\Api\Serializer\DiscussionSerializer;
|
use Flarum\Api\Serializer\DiscussionSerializer;
|
||||||
use Flarum\Discussion\Discussion;
|
use Flarum\Discussion\Discussion;
|
||||||
use Flarum\Discussion\Event\Saving;
|
use Flarum\Discussion\Event\Saving;
|
||||||
use Flarum\Discussion\Event\Searching;
|
use Flarum\Discussion\Filter\DiscussionFilterer;
|
||||||
use Flarum\Event\ConfigureDiscussionGambits;
|
use Flarum\Discussion\Search\DiscussionSearcher;
|
||||||
use Flarum\Extend;
|
use Flarum\Extend;
|
||||||
use Flarum\Post\Event\Deleted;
|
use Flarum\Post\Event\Deleted;
|
||||||
use Flarum\Post\Event\Hidden;
|
use Flarum\Post\Event\Hidden;
|
||||||
use Flarum\Post\Event\Posted;
|
use Flarum\Post\Event\Posted;
|
||||||
use Flarum\Post\Event\Restored;
|
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\Listener;
|
||||||
use Flarum\Subscriptions\Notification\NewPostBlueprint;
|
use Flarum\Subscriptions\Notification\NewPostBlueprint;
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
(new Extend\Frontend('forum'))
|
(new Extend\Frontend('forum'))
|
||||||
|
@ -55,10 +55,10 @@ return [
|
||||||
->listen(Deleted::class, Listener\DeleteNotificationWhenPostIsHiddenOrDeleted::class)
|
->listen(Deleted::class, Listener\DeleteNotificationWhenPostIsHiddenOrDeleted::class)
|
||||||
->listen(Posted::class, Listener\FollowAfterReply::class),
|
->listen(Posted::class, Listener\FollowAfterReply::class),
|
||||||
|
|
||||||
function (Dispatcher $events) {
|
(new Extend\Filter(DiscussionFilterer::class))
|
||||||
$events->listen(ConfigureDiscussionGambits::class, function (ConfigureDiscussionGambits $event) {
|
->addFilter(SubscriptionFilterGambit::class)
|
||||||
$event->gambits->add(SubscriptionGambit::class);
|
->addFilterMutator(HideIgnoredFromAllDiscussionsPage::class),
|
||||||
});
|
|
||||||
$events->listen(Searching::class, Listener\FilterDiscussionListBySubscription::class);
|
(new Extend\SimpleFlarumSearch(DiscussionSearcher::class))
|
||||||
}
|
->addGambit(SubscriptionFilterGambit::class),
|
||||||
];
|
];
|
||||||
|
|
|
@ -30,7 +30,7 @@ export default function addSubscriptionFilter() {
|
||||||
|
|
||||||
extend(DiscussionListState.prototype, 'requestParams', function (params) {
|
extend(DiscussionListState.prototype, 'requestParams', function (params) {
|
||||||
if (this.params.onFollowing) {
|
if (this.params.onFollowing) {
|
||||||
params.filter.q = (params.filter.q || '') + ' is:following';
|
params.filter.subscription = 'following';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
<?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\Subscriptions\Gambit;
|
|
||||||
|
|
||||||
use Flarum\Search\AbstractRegexGambit;
|
|
||||||
use Flarum\Search\AbstractSearch;
|
|
||||||
|
|
||||||
class SubscriptionGambit extends AbstractRegexGambit
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected $pattern = 'is:(follow|ignor)(?:ing|ed)';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function conditions(AbstractSearch $search, array $matches, $negate)
|
|
||||||
{
|
|
||||||
$actor = $search->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');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?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\Subscriptions;
|
||||||
|
|
||||||
|
use Flarum\Filter\FilterState;
|
||||||
|
use Flarum\Query\QueryCriteria;
|
||||||
|
|
||||||
|
class HideIgnoredFromAllDiscussionsPage
|
||||||
|
{
|
||||||
|
public function __invoke(FilterState $filterState, QueryCriteria $criteria)
|
||||||
|
{
|
||||||
|
// We only want to hide on the "all discussions" page.
|
||||||
|
if (count($filterState->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');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,30 +0,0 @@
|
||||||
<?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\Subscriptions\Listener;
|
|
||||||
|
|
||||||
use Flarum\Discussion\Event\Searching;
|
|
||||||
|
|
||||||
class FilterDiscussionListBySubscription
|
|
||||||
{
|
|
||||||
public function handle(Searching $event)
|
|
||||||
{
|
|
||||||
if (! $event->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');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
<?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\Subscriptions\Query;
|
||||||
|
|
||||||
|
use Flarum\Filter\FilterInterface;
|
||||||
|
use Flarum\Filter\FilterState;
|
||||||
|
use Flarum\Search\AbstractRegexGambit;
|
||||||
|
use Flarum\Search\AbstractSearch;
|
||||||
|
use Flarum\User\User;
|
||||||
|
use Illuminate\Database\Query\Builder;
|
||||||
|
|
||||||
|
class SubscriptionFilterGambit extends AbstractRegexGambit implements FilterInterface
|
||||||
|
{
|
||||||
|
protected function getGambitPattern() {
|
||||||
|
return 'is:(follow|ignor)(?:ing|ed)';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function conditions(AbstractSearch $search, array $matches, $negate)
|
||||||
|
{
|
||||||
|
$this->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');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user