From a33dbcb04a7c64bb5198bd6a7cc421f50e0cc541 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 1 Apr 2024 17:08:53 +0100 Subject: [PATCH] References: Fixed references count/list recycle bin interaction Count and reference list would get references then attempt to load entities, which could fail to load if in the recycle bin. This updates the queries to effectively ignore references for items we can't see (in recycle bin). Added test to cover. For #4918 --- app/References/ReferenceFetcher.php | 3 ++- tests/References/ReferencesTest.php | 26 +++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/References/ReferenceFetcher.php b/app/References/ReferenceFetcher.php index 655ea7c09..1c9664f45 100644 --- a/app/References/ReferenceFetcher.php +++ b/app/References/ReferenceFetcher.php @@ -41,7 +41,8 @@ class ReferenceFetcher { $baseQuery = Reference::query() ->where('to_type', '=', $entity->getMorphClass()) - ->where('to_id', '=', $entity->id); + ->where('to_id', '=', $entity->id) + ->whereHas('from'); return $this->permissions->restrictEntityRelationQuery( $baseQuery, diff --git a/tests/References/ReferencesTest.php b/tests/References/ReferencesTest.php index 715f71435..f8698d028 100644 --- a/tests/References/ReferencesTest.php +++ b/tests/References/ReferencesTest.php @@ -271,7 +271,31 @@ class ReferencesTest extends TestCase } } - protected function createReference(Model $from, Model $to) + public function test_reference_from_deleted_item_does_not_count_or_show_in_references_page() + { + $page = $this->entities->page(); + $referencingPageA = $this->entities->page(); + $referencingPageB = $this->entities->page(); + + $this->asEditor(); + $this->createReference($referencingPageA, $page); + $this->createReference($referencingPageB, $page); + + $resp = $this->get($page->getUrl()); + $resp->assertSee('Referenced by 2 items'); + + $this->delete($referencingPageA->getUrl()); + + $resp = $this->get($page->getUrl()); + $resp->assertSee('Referenced by 1 item'); + + $resp = $this->get($page->getUrl('/references')); + $resp->assertOk(); + $resp->assertSee($referencingPageB->getUrl()); + $resp->assertDontSee($referencingPageA->getUrl()); + } + + protected function createReference(Model $from, Model $to): void { (new Reference())->forceFill([ 'from_type' => $from->getMorphClass(),