mirror of
https://github.com/flarum/core.git
synced 2025-08-02 22:47:33 +02:00
Refactor for new extenders
This commit is contained in:
@@ -10,10 +10,14 @@
|
|||||||
use Flarum\Api\Serializer\BasicDiscussionSerializer;
|
use Flarum\Api\Serializer\BasicDiscussionSerializer;
|
||||||
use Flarum\Api\Serializer\PostSerializer;
|
use Flarum\Api\Serializer\PostSerializer;
|
||||||
use Flarum\Approval\Access;
|
use Flarum\Approval\Access;
|
||||||
|
use Flarum\Approval\Event\PostWasApproved;
|
||||||
use Flarum\Approval\Listener;
|
use Flarum\Approval\Listener;
|
||||||
use Flarum\Discussion\Discussion;
|
use Flarum\Discussion\Discussion;
|
||||||
|
use Flarum\Event\GetModelIsPrivate;
|
||||||
use Flarum\Extend;
|
use Flarum\Extend;
|
||||||
|
use Flarum\Post\Event\Saving;
|
||||||
use Flarum\Post\Post;
|
use Flarum\Post\Post;
|
||||||
|
use Flarum\Tags\Tag;
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
use Illuminate\Contracts\Events\Dispatcher;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@@ -46,12 +50,21 @@ return [
|
|||||||
|
|
||||||
new Extend\Locales(__DIR__.'/locale'),
|
new Extend\Locales(__DIR__.'/locale'),
|
||||||
|
|
||||||
function (Dispatcher $events) {
|
(new Extend\Event())
|
||||||
$events->subscribe(Listener\ApproveContent::class);
|
->listen(Saving::class, [Listener\ApproveContent::class, 'approvePost'])
|
||||||
$events->subscribe(Listener\UnapproveNewContent::class);
|
->listen(Saving::class, [Listener\UnapproveNewContent::class, 'unapproveNewPosts'])
|
||||||
|
->listen(PostWasApproved::class, [Listener\ApproveContent::class, 'approveDiscussion']),
|
||||||
|
|
||||||
$events->subscribe(Access\TagPolicy::class);
|
(new Extend\Policy())
|
||||||
$events->subscribe(Access\DiscussionPolicy::class);
|
->modelPolicy(Tag::class, Access\TagPolicy::class),
|
||||||
$events->subscribe(Access\PostPolicy::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']);
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
@@ -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')
|
|
||||||
);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -10,45 +10,23 @@
|
|||||||
namespace Flarum\Approval\Access;
|
namespace Flarum\Approval\Access;
|
||||||
|
|
||||||
use Flarum\Discussion\Discussion;
|
use Flarum\Discussion\Discussion;
|
||||||
use Flarum\Event\ScopeModelVisibility;
|
|
||||||
use Flarum\Post\Post;
|
|
||||||
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 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 Builder $query
|
||||||
* @param User $actor
|
* @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
|
// Show private posts if they require approval and they are
|
||||||
// authored by the current user, or the current user has permission to
|
// authored by the current user, or the current user has permission to
|
||||||
// approve posts.
|
// approve posts.
|
||||||
$query->where('posts.is_approved', 0);
|
$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(function (Builder $query) use ($actor) {
|
||||||
$query->where('posts.user_id', $actor->id)
|
$query->where('posts.user_id', $actor->id)
|
||||||
->orWhereExists($this->discussionWhereCanApprovePosts($actor));
|
->orWhereExists($this->discussionWhereCanApprovePosts($actor));
|
||||||
@@ -62,16 +40,9 @@ class PostPolicy extends AbstractPolicy
|
|||||||
$query->selectRaw('1')
|
$query->selectRaw('1')
|
||||||
->from('discussions')
|
->from('discussions')
|
||||||
->whereColumn('discussions.id', 'posts.discussion_id')
|
->whereColumn('discussions.id', 'posts.discussion_id')
|
||||||
->where($this->canApprovePosts($actor));
|
->where(function ($query) use ($actor) {
|
||||||
};
|
Discussion::query()->setQuery($query)->whereVisibleTo($actor, 'approvePosts');
|
||||||
}
|
});
|
||||||
|
|
||||||
private function canApprovePosts(User $actor)
|
|
||||||
{
|
|
||||||
return function ($query) use ($actor) {
|
|
||||||
$this->events->dispatch(
|
|
||||||
new ScopeModelVisibility(Discussion::query()->setQuery($query), $actor, 'approvePosts')
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -10,16 +10,11 @@
|
|||||||
namespace Flarum\Approval\Access;
|
namespace Flarum\Approval\Access;
|
||||||
|
|
||||||
use Flarum\Tags\Tag;
|
use Flarum\Tags\Tag;
|
||||||
use Flarum\User\AbstractPolicy;
|
use Flarum\User\Access\AbstractPolicy;
|
||||||
use Flarum\User\User;
|
use Flarum\User\User;
|
||||||
|
|
||||||
class TagPolicy extends AbstractPolicy
|
class TagPolicy extends AbstractPolicy
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected $model = Tag::class;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param User $actor
|
* @param User $actor
|
||||||
* @param Tag $tag
|
* @param Tag $tag
|
||||||
@@ -34,7 +29,7 @@ class TagPolicy extends AbstractPolicy
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (in_array($tag->id, $disallowedTags)) {
|
if (in_array($tag->id, $disallowedTags)) {
|
||||||
return false;
|
return $this->deny();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -11,19 +11,9 @@ namespace Flarum\Approval\Listener;
|
|||||||
|
|
||||||
use Flarum\Approval\Event\PostWasApproved;
|
use Flarum\Approval\Event\PostWasApproved;
|
||||||
use Flarum\Post\Event\Saving;
|
use Flarum\Post\Event\Saving;
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
|
||||||
|
|
||||||
class ApproveContent
|
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
|
* @param Saving $event
|
||||||
*/
|
*/
|
||||||
|
@@ -14,19 +14,9 @@ use Flarum\Event\GetModelIsPrivate;
|
|||||||
use Flarum\Flags\Flag;
|
use Flarum\Flags\Flag;
|
||||||
use Flarum\Post\Event\Saving;
|
use Flarum\Post\Event\Saving;
|
||||||
use Flarum\Post\Post;
|
use Flarum\Post\Post;
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
|
||||||
|
|
||||||
class UnapproveNewContent
|
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
|
* @param Saving $event
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user