From 08cee1589a3bf85b73137da6c4daf76601b26011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Ca=C5=82ka?= Date: Sat, 18 Nov 2023 13:22:17 +0100 Subject: [PATCH] fix(2.x,approval): correct PostWasApproved event trigger condition --- .../approval/src/Listener/ApproveContent.php | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/extensions/approval/src/Listener/ApproveContent.php b/extensions/approval/src/Listener/ApproveContent.php index e3d259eb0e..7d21e8821f 100755 --- a/extensions/approval/src/Listener/ApproveContent.php +++ b/extensions/approval/src/Listener/ApproveContent.php @@ -11,6 +11,7 @@ use Flarum\Approval\Event\PostWasApproved; use Flarum\Post\Event\Saving; +use Flarum\User\Exception\PermissionDeniedException; use Illuminate\Contracts\Events\Dispatcher; class ApproveContent @@ -20,23 +21,42 @@ public function subscribe(Dispatcher $events): void $events->listen(Saving::class, $this->approvePost(...)); } + /** + * @throws PermissionDeniedException + */ public function approvePost(Saving $event): void { $attributes = $event->data['attributes']; $post = $event->post; + // Nothing to do if it is already approved. + if ($post->is_approved) { + return; + } + + /* + * We approve a post in one of two cases: + * - The post was unapproved and the allowed action is approving it. We trigger an event. + * - The post was unapproved and the allowed actor is hiding or un-hiding it. + * We approve it silently if the action is unhiding. + */ + $approvingSilently = false; + if (isset($attributes['isApproved'])) { $event->actor->assertCan('approve', $post); $isApproved = (bool) $attributes['isApproved']; - } elseif (! empty($attributes['isHidden']) && $event->actor->can('approve', $post)) { + } elseif (isset($attributes['isHidden']) && $event->actor->can('approve', $post)) { $isApproved = true; + $approvingSilently = $attributes['isHidden']; } if (! empty($isApproved)) { $post->is_approved = true; - $post->raise(new PostWasApproved($post, $event->actor)); + if (! $approvingSilently) { + $post->raise(new PostWasApproved($post, $event->actor)); + } } } }