X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/d198332d3c7866d5eb807b9e07a4b95fd67b97c2..refs/pull/4252/head:/app/Http/Controllers/ReferenceController.php diff --git a/app/Http/Controllers/ReferenceController.php b/app/Http/Controllers/ReferenceController.php index 3af4feb06..b9b3e0eab 100644 --- a/app/Http/Controllers/ReferenceController.php +++ b/app/Http/Controllers/ReferenceController.php @@ -2,23 +2,19 @@ namespace BookStack\Http\Controllers; -use BookStack\Auth\Permissions\PermissionApplicator; use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Bookshelf; use BookStack\Entities\Models\Chapter; -use BookStack\Entities\Models\Entity; use BookStack\Entities\Models\Page; -use Illuminate\Database\Eloquent\Collection; -use Illuminate\Database\Eloquent\Relations\Relation; +use BookStack\References\ReferenceFetcher; class ReferenceController extends Controller { + protected ReferenceFetcher $referenceFetcher; - protected PermissionApplicator $permissions; - - public function __construct(PermissionApplicator $permissions) + public function __construct(ReferenceFetcher $referenceFetcher) { - $this->permissions = $permissions; + $this->referenceFetcher = $referenceFetcher; } /** @@ -26,12 +22,11 @@ class ReferenceController extends Controller */ public function page(string $bookSlug, string $pageSlug) { - /** @var Page $page */ - $page = Page::visible()->whereSlugs($bookSlug, $pageSlug)->firstOrFail(); - $references = $this->getEntityReferences($page); + $page = Page::getBySlugs($bookSlug, $pageSlug); + $references = $this->referenceFetcher->getPageReferencesToEntity($page); return view('pages.references', [ - 'page' => $page, + 'page' => $page, 'references' => $references, ]); } @@ -41,12 +36,11 @@ class ReferenceController extends Controller */ public function chapter(string $bookSlug, string $chapterSlug) { - /** @var Chapter $chapter */ - $chapter = Chapter::visible()->whereSlugs($bookSlug, $chapterSlug)->firstOrFail(); - $references = $this->getEntityReferences($chapter); + $chapter = Chapter::getBySlugs($bookSlug, $chapterSlug); + $references = $this->referenceFetcher->getPageReferencesToEntity($chapter); return view('chapters.references', [ - 'chapter' => $chapter, + 'chapter' => $chapter, 'references' => $references, ]); } @@ -56,11 +50,11 @@ class ReferenceController extends Controller */ public function book(string $slug) { - $book = Book::visible()->where('slug', '=', $slug)->firstOrFail(); - $references = $this->getEntityReferences($book); + $book = Book::getBySlug($slug); + $references = $this->referenceFetcher->getPageReferencesToEntity($book); return view('books.references', [ - 'book' => $book, + 'book' => $book, 'references' => $references, ]); } @@ -70,36 +64,12 @@ class ReferenceController extends Controller */ public function shelf(string $slug) { - $shelf = Bookshelf::visible()->where('slug', '=', $slug)->firstOrFail(); - $references = $this->getEntityReferences($shelf); + $shelf = Bookshelf::getBySlug($slug); + $references = $this->referenceFetcher->getPageReferencesToEntity($shelf); return view('shelves.references', [ - 'shelf' => $shelf, + 'shelf' => $shelf, 'references' => $references, ]); } - - /** - * Query the references for the given entities. - * Loads the commonly required relations while taking permissions into account. - */ - protected function getEntityReferences(Entity $entity): Collection - { - $baseQuery = $entity->referencesTo() - ->where('from_type', '=', (new Page())->getMorphClass()) - ->with([ - 'from' => fn(Relation $query) => $query->select(Page::$listAttributes), - 'from.book' => fn(Relation $query) => $query->scopes('visible'), - 'from.chapter' => fn(Relation $query) => $query->scopes('visible') - ]); - - $references = $this->permissions->restrictEntityRelationQuery( - $baseQuery, - 'references', - 'from_id', - 'from_type' - )->get(); - - return $references; - } }