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
This commit is contained in:
Dan Brown 2024-04-01 17:08:53 +01:00
parent 58f6219cb3
commit a33dbcb04a
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
2 changed files with 27 additions and 2 deletions

View File

@ -41,7 +41,8 @@ class ReferenceFetcher
{ {
$baseQuery = Reference::query() $baseQuery = Reference::query()
->where('to_type', '=', $entity->getMorphClass()) ->where('to_type', '=', $entity->getMorphClass())
->where('to_id', '=', $entity->id); ->where('to_id', '=', $entity->id)
->whereHas('from');
return $this->permissions->restrictEntityRelationQuery( return $this->permissions->restrictEntityRelationQuery(
$baseQuery, $baseQuery,

View File

@ -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([ (new Reference())->forceFill([
'from_type' => $from->getMorphClass(), 'from_type' => $from->getMorphClass(),