]> BookStack Code Mirror - bookstack/blobdiff - app/Http/Controllers/ReferenceController.php
Fix timestamp in API docs example response
[bookstack] / app / Http / Controllers / ReferenceController.php
index bed2c5f305cc7903d0b30dd91754ac8089d49c74..b9b3e0eab9613e243a0dd7d67c718c1ef81fd8ec 100644 (file)
@@ -2,18 +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\Page;
-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;
     }
 
     /**
@@ -21,26 +22,53 @@ class ReferenceController extends Controller
      */
     public function page(string $bookSlug, string $pageSlug)
     {
-        /** @var Page $page */
-        $page = Page::visible()->whereSlugs($bookSlug, $pageSlug)->firstOrFail();
-
-        $baseQuery = $page->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();
+        $page = Page::getBySlugs($bookSlug, $pageSlug);
+        $references = $this->referenceFetcher->getPageReferencesToEntity($page);
 
         return view('pages.references', [
-            'page' => $page,
+            'page'       => $page,
+            'references' => $references,
+        ]);
+    }
+
+    /**
+     * Display the references to a given chapter.
+     */
+    public function chapter(string $bookSlug, string $chapterSlug)
+    {
+        $chapter = Chapter::getBySlugs($bookSlug, $chapterSlug);
+        $references = $this->referenceFetcher->getPageReferencesToEntity($chapter);
+
+        return view('chapters.references', [
+            'chapter'    => $chapter,
+            'references' => $references,
+        ]);
+    }
+
+    /**
+     * Display the references to a given book.
+     */
+    public function book(string $slug)
+    {
+        $book = Book::getBySlug($slug);
+        $references = $this->referenceFetcher->getPageReferencesToEntity($book);
+
+        return view('books.references', [
+            'book'       => $book,
+            'references' => $references,
+        ]);
+    }
+
+    /**
+     * Display the references to a given shelf.
+     */
+    public function shelf(string $slug)
+    {
+        $shelf = Bookshelf::getBySlug($slug);
+        $references = $this->referenceFetcher->getPageReferencesToEntity($shelf);
+
+        return view('shelves.references', [
+            'shelf'      => $shelf,
             'references' => $references,
         ]);
     }