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 655ea7c09eb..1c9664f45a9 100644 --- a/app/References/ReferenceFetcher.php +++ b/app/References/ReferenceFetcher.php @@ -41,7 +41,8 @@ protected function queryReferencesToEntity(Entity $entity): Builder { $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 715f7143534..f8698d02885 100644 --- a/tests/References/ReferencesTest.php +++ b/tests/References/ReferencesTest.php @@ -271,7 +271,31 @@ public function test_description_links_from_book_chapter_shelf_updated_on_url_ch } } - 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(),