From bd9553eb33ec56ed0725270055436b16cdd59b63 Mon Sep 17 00:00:00 2001 From: Alexander Skvortsov Date: Tue, 8 Dec 2020 15:08:18 -0500 Subject: [PATCH] Refactor for new extenders --- extensions/approval/extend.php | 25 +++++-- .../approval/src/Access/DiscussionPolicy.php | 66 ------------------- .../ScopePrivateDiscussionVisibility.php | 38 +++++++++++ ...icy.php => ScopePrivatePostVisibility.php} | 41 ++---------- extensions/approval/src/Access/TagPolicy.php | 9 +-- .../approval/src/Listener/ApproveContent.php | 10 --- .../src/Listener/UnapproveNewContent.php | 10 --- 7 files changed, 65 insertions(+), 134 deletions(-) delete mode 100644 extensions/approval/src/Access/DiscussionPolicy.php create mode 100644 extensions/approval/src/Access/ScopePrivateDiscussionVisibility.php rename extensions/approval/src/Access/{PostPolicy.php => ScopePrivatePostVisibility.php} (55%) diff --git a/extensions/approval/extend.php b/extensions/approval/extend.php index 5140b6756..97038ebc7 100644 --- a/extensions/approval/extend.php +++ b/extensions/approval/extend.php @@ -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']); }, ]; diff --git a/extensions/approval/src/Access/DiscussionPolicy.php b/extensions/approval/src/Access/DiscussionPolicy.php deleted file mode 100644 index b0e51ef87..000000000 --- a/extensions/approval/src/Access/DiscussionPolicy.php +++ /dev/null @@ -1,66 +0,0 @@ -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') - ); - }; - } -} diff --git a/extensions/approval/src/Access/ScopePrivateDiscussionVisibility.php b/extensions/approval/src/Access/ScopePrivateDiscussionVisibility.php new file mode 100644 index 000000000..8bc74e090 --- /dev/null +++ b/extensions/approval/src/Access/ScopePrivateDiscussionVisibility.php @@ -0,0 +1,38 @@ +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'); + }); + }); + } + } +} diff --git a/extensions/approval/src/Access/PostPolicy.php b/extensions/approval/src/Access/ScopePrivatePostVisibility.php similarity index 55% rename from extensions/approval/src/Access/PostPolicy.php rename to extensions/approval/src/Access/ScopePrivatePostVisibility.php index 8f764dcf6..2935d2272 100644 --- a/extensions/approval/src/Access/PostPolicy.php +++ b/extensions/approval/src/Access/ScopePrivatePostVisibility.php @@ -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'); + }); }; } } diff --git a/extensions/approval/src/Access/TagPolicy.php b/extensions/approval/src/Access/TagPolicy.php index 8be57b6c2..954bbcfa0 100755 --- a/extensions/approval/src/Access/TagPolicy.php +++ b/extensions/approval/src/Access/TagPolicy.php @@ -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(); } } } diff --git a/extensions/approval/src/Listener/ApproveContent.php b/extensions/approval/src/Listener/ApproveContent.php index c2d4ba42c..fc7d963e5 100644 --- a/extensions/approval/src/Listener/ApproveContent.php +++ b/extensions/approval/src/Listener/ApproveContent.php @@ -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 */ diff --git a/extensions/approval/src/Listener/UnapproveNewContent.php b/extensions/approval/src/Listener/UnapproveNewContent.php index 84cdf2180..09ed451fe 100644 --- a/extensions/approval/src/Listener/UnapproveNewContent.php +++ b/extensions/approval/src/Listener/UnapproveNewContent.php @@ -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 */