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
This commit is contained in:
Dan Brown 2023-09-15 13:38:02 +01:00
parent 99eb3e5f71
commit 45b8d6cd0c
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
2 changed files with 14 additions and 4 deletions

View File

@ -12,10 +12,12 @@ use Illuminate\Database\Eloquent\Relations\MorphTo;
* @property int $id * @property int $id
* @property string $text * @property string $text
* @property string $html * @property string $html
* @property int|null $parent_id * @property int|null $parent_id - Relates to local_id, not id
* @property int $local_id * @property int $local_id
* @property string $entity_type * @property string $entity_type
* @property int $entity_id * @property int $entity_id
* @property int $created_by
* @property int $updated_by
*/ */
class Comment extends Model implements Loggable class Comment extends Model implements Loggable
{ {
@ -38,7 +40,9 @@ class Comment extends Model implements Loggable
*/ */
public function parent(): BelongsTo 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);
} }
/** /**

View File

@ -210,16 +210,22 @@ class WatchTest extends TestCase
$prefs = new UserNotificationPreferences($editor); $prefs = new UserNotificationPreferences($editor);
$prefs->updateFromSettingsArray(['comment-replies' => 'true']); $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(); $notifications = Notification::fake();
$this->actingAs($editor)->post("/comment/{$entities['page']->id}", [ $this->actingAs($editor)->post("/comment/{$entities['page']->id}", [
'text' => 'My new comment' 'text' => 'My new comment'
]); ]);
$comment = $entities['page']->comments()->first(); $comment = $entities['page']->comments()->orderBy('id', 'desc')->first();
$this->asAdmin()->post("/comment/{$entities['page']->id}", [ $this->asAdmin()->post("/comment/{$entities['page']->id}", [
'text' => 'My new comment response', 'text' => 'My new comment response',
'parent_id' => $comment->id, 'parent_id' => $comment->local_id,
]); ]);
$notifications->assertSentTo($editor, CommentCreationNotification::class); $notifications->assertSentTo($editor, CommentCreationNotification::class);
} }