1
0
mirror of https://github.com/flarum/core.git synced 2025-07-31 05:30:38 +02:00

Refactor for new extenders

This commit is contained in:
Alexander Skvortsov
2020-12-08 15:08:18 -05:00
parent bebced2d53
commit bd9553eb33
7 changed files with 65 additions and 134 deletions

View File

@@ -10,10 +10,14 @@
use Flarum\Api\Serializer\BasicDiscussionSerializer;
use Flarum\Api\Serializer\PostSerializer;
use Flarum\Approval\Access;
use Flarum\Approval\Event\PostWasApproved;
use Flarum\Approval\Listener;
use Flarum\Discussion\Discussion;
use Flarum\Event\GetModelIsPrivate;
use Flarum\Extend;
use Flarum\Post\Event\Saving;
use Flarum\Post\Post;
use Flarum\Tags\Tag;
use Illuminate\Contracts\Events\Dispatcher;
return [
@@ -46,12 +50,21 @@ return [
new Extend\Locales(__DIR__.'/locale'),
function (Dispatcher $events) {
$events->subscribe(Listener\ApproveContent::class);
$events->subscribe(Listener\UnapproveNewContent::class);
(new Extend\Event())
->listen(Saving::class, [Listener\ApproveContent::class, 'approvePost'])
->listen(Saving::class, [Listener\UnapproveNewContent::class, 'unapproveNewPosts'])
->listen(PostWasApproved::class, [Listener\ApproveContent::class, 'approveDiscussion']),
$events->subscribe(Access\TagPolicy::class);
$events->subscribe(Access\DiscussionPolicy::class);
$events->subscribe(Access\PostPolicy::class);
(new Extend\Policy())
->modelPolicy(Tag::class, Access\TagPolicy::class),
(new Extend\ModelVisibility(Post::class))
->scope(Access\ScopePrivatePostVisibility::class, 'viewPrivate'),
(new Extend\ModelVisibility(Discussion::class))
->scope(Access\ScopePrivateDiscussionVisibility::class, 'viewPrivate'),
function (Dispatcher $events) {
$events->listen(GetModelIsPrivate::class, [Listener\UnapproveNewContent::class, 'markUnapprovedContentAsPrivate']);
},
];

View File

@@ -1,66 +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\Approval\Access;
use Flarum\Discussion\Discussion;
use Flarum\Event\ScopeModelVisibility;
use Flarum\User\AbstractPolicy;
use Flarum\User\User;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Database\Eloquent\Builder;
class DiscussionPolicy extends AbstractPolicy
{
/**
* {@inheritdoc}
*/
protected $model = Discussion::class;
/**
* @var Dispatcher
*/
protected $events;
/**
* @param Dispatcher $events
*/
public function __construct(Dispatcher $events)
{
$this->events = $events;
}
/**
* @param Builder $query
* @param User $actor
*/
public function findPrivate(User $actor, Builder $query)
{
// Show empty/private discussions if they require approval and they are
// authored by the current user, or the current user has permission to
// approve posts.
$query->where('discussions.is_approved', 0);
if (! $actor->hasPermission('discussion.approvePosts')) {
$query->where(function (Builder $query) use ($actor) {
$query->where('discussions.user_id', $actor->id)
->orWhere($this->canApprovePosts($actor));
});
}
}
private function canApprovePosts(User $actor)
{
return function ($query) use ($actor) {
$this->events->dispatch(
new ScopeModelVisibility(Discussion::query()->setQuery($query), $actor, 'approvePosts')
);
};
}
}

View File

@@ -0,0 +1,38 @@
<?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\Approval\Access;
use Flarum\Discussion\Discussion;
use Flarum\User\User;
use Illuminate\Database\Eloquent\Builder;
class ScopePrivateDiscussionVisibility
{
/**
* @param Builder $query
* @param User $actor
*/
public function __invoke(User $actor, Builder $query)
{
// Show empty/private discussions if they require approval and they are
// authored by the current user, or the current user has permission to
// approve posts.
$query->where('discussions.is_approved', 0);
if (!$actor->hasPermission('discussion.approvePosts')) {
$query->where(function (Builder $query) use ($actor) {
$query->where('discussions.user_id', $actor->id)
->orWhere(function ($query) use ($actor) {
$query->whereVisibleTo($actor, 'approvePosts');
});
});
}
}
}

View File

@@ -10,45 +10,23 @@
namespace Flarum\Approval\Access;
use Flarum\Discussion\Discussion;
use Flarum\Event\ScopeModelVisibility;
use Flarum\Post\Post;
use Flarum\User\AbstractPolicy;
use Flarum\User\User;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Database\Eloquent\Builder;
class PostPolicy extends AbstractPolicy
class ScopePrivatePostVisibility
{
/**
* {@inheritdoc}
*/
protected $model = Post::class;
/**
* @var Dispatcher
*/
protected $events;
/**
* @param Dispatcher $events
*/
public function __construct(Dispatcher $events)
{
$this->events = $events;
}
/**
* @param Builder $query
* @param User $actor
*/
public function findPrivate(User $actor, Builder $query)
public function __invoke(User $actor, Builder $query)
{
// Show private posts if they require approval and they are
// authored by the current user, or the current user has permission to
// approve posts.
$query->where('posts.is_approved', 0);
if (! $actor->hasPermission('discussion.approvePosts')) {
if (!$actor->hasPermission('discussion.approvePosts')) {
$query->where(function (Builder $query) use ($actor) {
$query->where('posts.user_id', $actor->id)
->orWhereExists($this->discussionWhereCanApprovePosts($actor));
@@ -62,16 +40,9 @@ class PostPolicy extends AbstractPolicy
$query->selectRaw('1')
->from('discussions')
->whereColumn('discussions.id', 'posts.discussion_id')
->where($this->canApprovePosts($actor));
};
}
private function canApprovePosts(User $actor)
{
return function ($query) use ($actor) {
$this->events->dispatch(
new ScopeModelVisibility(Discussion::query()->setQuery($query), $actor, 'approvePosts')
);
->where(function ($query) use ($actor) {
Discussion::query()->setQuery($query)->whereVisibleTo($actor, 'approvePosts');
});
};
}
}

View File

@@ -10,16 +10,11 @@
namespace Flarum\Approval\Access;
use Flarum\Tags\Tag;
use Flarum\User\AbstractPolicy;
use Flarum\User\Access\AbstractPolicy;
use Flarum\User\User;
class TagPolicy extends AbstractPolicy
{
/**
* {@inheritdoc}
*/
protected $model = Tag::class;
/**
* @param User $actor
* @param Tag $tag
@@ -34,7 +29,7 @@ class TagPolicy extends AbstractPolicy
}
if (in_array($tag->id, $disallowedTags)) {
return false;
return $this->deny();
}
}
}

View File

@@ -11,19 +11,9 @@ namespace Flarum\Approval\Listener;
use Flarum\Approval\Event\PostWasApproved;
use Flarum\Post\Event\Saving;
use Illuminate\Contracts\Events\Dispatcher;
class ApproveContent
{
/**
* @param Dispatcher $events
*/
public function subscribe(Dispatcher $events)
{
$events->listen(Saving::class, [$this, 'approvePost']);
$events->listen(PostWasApproved::class, [$this, 'approveDiscussion']);
}
/**
* @param Saving $event
*/

View File

@@ -14,19 +14,9 @@ use Flarum\Event\GetModelIsPrivate;
use Flarum\Flags\Flag;
use Flarum\Post\Event\Saving;
use Flarum\Post\Post;
use Illuminate\Contracts\Events\Dispatcher;
class UnapproveNewContent
{
/**
* @param Dispatcher $events
*/
public function subscribe(Dispatcher $events)
{
$events->listen(Saving::class, [$this, 'unapproveNewPosts']);
$events->listen(GetModelIsPrivate::class, [$this, 'markUnapprovedContentAsPrivate']);
}
/**
* @param Saving $event
*/