X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/b86ee6d252b301a94796043f333abdb6603c304c..refs/pull/3918/head:/app/References/ReferenceUpdater.php diff --git a/app/References/ReferenceUpdater.php b/app/References/ReferenceUpdater.php index 15619bc31..2f7b70a87 100644 --- a/app/References/ReferenceUpdater.php +++ b/app/References/ReferenceUpdater.php @@ -2,6 +2,7 @@ namespace BookStack\References; +use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Entity; use BookStack\Entities\Models\Page; use BookStack\Entities\Repos\RevisionRepo; @@ -21,7 +22,7 @@ class ReferenceUpdater public function updateEntityPageReferences(Entity $entity, string $oldLink) { - $references = $this->referenceFetcher->getPageReferencesToEntity($entity); + $references = $this->getReferencesToUpdate($entity); $newLink = $entity->getUrl(); /** @var Reference $reference */ @@ -32,6 +33,33 @@ class ReferenceUpdater } } + /** + * @return Reference[] + */ + protected function getReferencesToUpdate(Entity $entity): array + { + /** @var Reference[] $references */ + $references = $this->referenceFetcher->getPageReferencesToEntity($entity)->values()->all(); + + if ($entity instanceof Book) { + $pages = $entity->pages()->get(['id']); + $chapters = $entity->chapters()->get(['id']); + $children = $pages->concat($chapters); + foreach ($children as $bookChild) { + $childRefs = $this->referenceFetcher->getPageReferencesToEntity($bookChild)->values()->all(); + array_push($references, ...$childRefs); + } + } + + $deduped = []; + foreach ($references as $reference) { + $key = $reference->from_id . ':' . $reference->from_type; + $deduped[$key] = $reference; + } + + return array_values($deduped); + } + protected function updateReferencesWithinPage(Page $page, string $oldLink, string $newLink) { $page = (clone $page)->refresh(); @@ -91,4 +119,4 @@ class ReferenceUpdater return $html; } -} \ No newline at end of file +}