From 7cde251e8bc203e59954dea839670250b9941488 Mon Sep 17 00:00:00 2001 From: linkrobins Date: Sat, 20 Jun 2026 19:30:50 -0400 Subject: [PATCH] fix(tags): update tag metadata when a pending discussion is approved When approval marks new content is_private, UpdateTagMetadata correctly skips it on Started/Posted, but nothing refreshed the tag once the content was approved, leaving discussion_count and last_posted_discussion_id stale. Listen for Approval's PostWasApproved (by class-string, so there is no hard dependency) and refresh, deferring to the discussion's save when approval hasn't persisted the visibility change yet. --- .../tags/src/Listener/UpdateTagMetadata.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/extensions/tags/src/Listener/UpdateTagMetadata.php b/extensions/tags/src/Listener/UpdateTagMetadata.php index 33f26a684b..4d76b53043 100755 --- a/extensions/tags/src/Listener/UpdateTagMetadata.php +++ b/extensions/tags/src/Listener/UpdateTagMetadata.php @@ -39,6 +39,9 @@ public function subscribe(Dispatcher $events): void $events->listen(PostDeleted::class, $this->whenPostIsDeleted(...)); $events->listen(PostHidden::class, $this->whenPostIsHidden(...)); $events->listen(PostRestored::class, $this->whenPostIsRestored(...)); + + // Refresh metadata skipped while a post was pending approval. + $events->listen('Flarum\Approval\Event\PostWasApproved', $this->whenPostIsApproved(...)); } public function whenDiscussionIsStarted(Started $event): void @@ -46,6 +49,19 @@ public function whenDiscussionIsStarted(Started $event): void $this->updateTags($event->discussion, 1); } + public function whenPostIsApproved(object $event): void + { + $discussion = $event->post->discussion; + $delta = $event->post->number === 1 ? 1 : 0; + + // The visibility change may not be persisted yet; if so, defer to its save. + if ($discussion->is_private) { + $discussion->afterSave(fn (Discussion $discussion) => $this->updateTags($discussion, $delta)); + } else { + $this->updateTags($discussion, $delta); + } + } + public function whenDiscussionWasTagged(DiscussionWasTagged $event): void { $oldTags = Tag::whereIn('id', Arr::pluck($event->oldTags, 'id'))->get();