From 45b8d6cd0c214118a3745050b64805be75cec9d8 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Fri, 15 Sep 2023 13:38:02 +0100 Subject: [PATCH] Comments: Fixed wrong identification of parent comment Would cause comment reply notifications to not be sent to expected user. Updated test to cover problem case. For #4548 --- app/Activity/Models/Comment.php | 8 ++++++-- tests/Activity/WatchTest.php | 10 ++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/Activity/Models/Comment.php b/app/Activity/Models/Comment.php index bcbed6c56..6efa3df6f 100644 --- a/app/Activity/Models/Comment.php +++ b/app/Activity/Models/Comment.php @@ -12,10 +12,12 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; * @property int $id * @property string $text * @property string $html - * @property int|null $parent_id + * @property int|null $parent_id - Relates to local_id, not id * @property int $local_id * @property string $entity_type * @property int $entity_id + * @property int $created_by + * @property int $updated_by */ class Comment extends Model implements Loggable { @@ -38,7 +40,9 @@ class Comment extends Model implements Loggable */ public function parent(): BelongsTo { - return $this->belongsTo(Comment::class); + return $this->belongsTo(Comment::class, 'parent_id', 'local_id', 'parent') + ->where('entity_type', '=', $this->entity_type) + ->where('entity_id', '=', $this->entity_id); } /** diff --git a/tests/Activity/WatchTest.php b/tests/Activity/WatchTest.php index fa50d8c79..464886155 100644 --- a/tests/Activity/WatchTest.php +++ b/tests/Activity/WatchTest.php @@ -210,16 +210,22 @@ class WatchTest extends TestCase $prefs = new UserNotificationPreferences($editor); $prefs->updateFromSettingsArray(['comment-replies' => 'true']); + // Create some existing comments to pad IDs to help potentially error + // on mis-identification of parent via ids used. + Comment::factory()->count(5) + ->for($entities['page'], 'entity') + ->create(['created_by' => $this->users->admin()->id]); + $notifications = Notification::fake(); $this->actingAs($editor)->post("/comment/{$entities['page']->id}", [ 'text' => 'My new comment' ]); - $comment = $entities['page']->comments()->first(); + $comment = $entities['page']->comments()->orderBy('id', 'desc')->first(); $this->asAdmin()->post("/comment/{$entities['page']->id}", [ 'text' => 'My new comment response', - 'parent_id' => $comment->id, + 'parent_id' => $comment->local_id, ]); $notifications->assertSentTo($editor, CommentCreationNotification::class); }