]> BookStack Code Mirror - bookstack/blobdiff - app/Http/Controllers/ReferenceController.php
Adjusted global search preview for dark mode
[bookstack] / app / Http / Controllers / ReferenceController.php
index 3af4feb06108b9cd29afd5a131561ead8b5e9f09..b9b3e0eab9613e243a0dd7d67c718c1ef81fd8ec 100644 (file)
@@ -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;
-    }
 }