mirror of
https://github.com/flarum/core.git
synced 2025-08-17 22:01:44 +02:00
Increase Tags Visibility Scoping Extendability (#79)
Allow extensions to override tags scoping visibility based on viewDiscussions permission
This commit is contained in:
committed by
GitHub
parent
74e02b6a3c
commit
713efcfa3c
@@ -11,10 +11,12 @@ namespace Flarum\Tags\Access;
|
|||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Flarum\Discussion\Discussion;
|
use Flarum\Discussion\Discussion;
|
||||||
|
use Flarum\Event\ScopeModelVisibility;
|
||||||
use Flarum\Settings\SettingsRepositoryInterface;
|
use Flarum\Settings\SettingsRepositoryInterface;
|
||||||
use Flarum\Tags\Tag;
|
use Flarum\Tags\Tag;
|
||||||
use Flarum\User\AbstractPolicy;
|
use Flarum\User\AbstractPolicy;
|
||||||
use Flarum\User\User;
|
use Flarum\User\User;
|
||||||
|
use Illuminate\Contracts\Events\Dispatcher;
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
|
||||||
class DiscussionPolicy extends AbstractPolicy
|
class DiscussionPolicy extends AbstractPolicy
|
||||||
@@ -24,16 +26,23 @@ class DiscussionPolicy extends AbstractPolicy
|
|||||||
*/
|
*/
|
||||||
protected $model = Discussion::class;
|
protected $model = Discussion::class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Dispatcher
|
||||||
|
*/
|
||||||
|
protected $events;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var SettingsRepositoryInterface
|
* @var SettingsRepositoryInterface
|
||||||
*/
|
*/
|
||||||
protected $settings;
|
protected $settings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param Dispatcher $events
|
||||||
* @param SettingsRepositoryInterface $settings
|
* @param SettingsRepositoryInterface $settings
|
||||||
*/
|
*/
|
||||||
public function __construct(SettingsRepositoryInterface $settings)
|
public function __construct(Dispatcher $events, SettingsRepositoryInterface $settings)
|
||||||
{
|
{
|
||||||
|
$this->events = $events;
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,11 +84,19 @@ class DiscussionPolicy extends AbstractPolicy
|
|||||||
*/
|
*/
|
||||||
public function find(User $actor, Builder $query)
|
public function find(User $actor, Builder $query)
|
||||||
{
|
{
|
||||||
// Hide discussions which have tags that the user is not allowed to see.
|
// Hide discussions which have tags that the user is not allowed to see, unless an extension overrides this.
|
||||||
$query->whereNotIn('discussions.id', function ($query) use ($actor) {
|
$query->where(function ($query) use ($actor) {
|
||||||
return $query->select('discussion_id')
|
$query
|
||||||
->from('discussion_tag')
|
->whereNotIn('discussions.id', function ($query) use ($actor) {
|
||||||
->whereIn('tag_id', Tag::getIdsWhereCannot($actor, 'viewDiscussions'));
|
return $query->select('discussion_id')
|
||||||
|
->from('discussion_tag')
|
||||||
|
->whereIn('tag_id', Tag::getIdsWhereCannot($actor, 'viewDiscussions'));
|
||||||
|
})
|
||||||
|
->orWhere(function ($query) use ($actor) {
|
||||||
|
$this->events->dispatch(
|
||||||
|
new ScopeModelVisibility($query, $actor, 'viewDiscussionsInRestrictedTags')
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Hide discussions with no tags if the user doesn't have that global
|
// Hide discussions with no tags if the user doesn't have that global
|
||||||
@@ -119,7 +136,8 @@ class DiscussionPolicy extends AbstractPolicy
|
|||||||
if ($discussion->user_id == $actor->id && $actor->can('reply', $discussion)) {
|
if ($discussion->user_id == $actor->id && $actor->can('reply', $discussion)) {
|
||||||
$allowEditTags = $this->settings->get('allow_tag_change');
|
$allowEditTags = $this->settings->get('allow_tag_change');
|
||||||
|
|
||||||
if ($allowEditTags === '-1'
|
if (
|
||||||
|
$allowEditTags === '-1'
|
||||||
|| ($allowEditTags === 'reply' && $discussion->participant_count <= 1)
|
|| ($allowEditTags === 'reply' && $discussion->participant_count <= 1)
|
||||||
|| (is_numeric($allowEditTags) && $discussion->created_at->diffInMinutes(new Carbon) < $allowEditTags)
|
|| (is_numeric($allowEditTags) && $discussion->created_at->diffInMinutes(new Carbon) < $allowEditTags)
|
||||||
) {
|
) {
|
||||||
|
Reference in New Issue
Block a user